Autor Zpráva
Donekulda
Profil
Dobrý den chtěl bych se zeptat jak bych mohl zabezpečit chat na mém webu? protože když jsem dnes tohle ukázal par lidem tak jeden z nich my tam dal to chatu script ,který mě to shodil. Prostě se chci zeptat jak to mohu zabezpečit proti scriptům. zde je index na chat mohli by jste poradit ?
<?php 
  include "../header.php"; 
  include "./zapis.php";
  $akce = isset($_GET["akce"]);
  $id_prispevku = @$_GET["id"];   
  if(isset($akce)=="smazat" AND isset($id_prispevku)){
    $uprava = mysql_query("UPDATE chat SET smazano='1' WHERE id='".mysql_real_escape_string($id_prispevku)."' ;");
  }
  
?>
<div class="chat_box">
  <div class="zpravy" id="vypis">
  <?php include "./vypis.php" ?>
  </div>
 
  <div class="formular">
    <form action="<?php $PHP_SELF; ?>" method="POST" name="form" id="form">
      <div class="input_text">
        <input type="text" name="text" size="80%" />
      </div>
      <div class="smajlici">
        <span onclick="smajlik(':D')"><img src="../theme/smajlici/mega_smich.gif" /></span>
        <span onclick="smajlik(':)')"><img src="../theme/smajlici/smich.gif" /></span>
        <span onclick="smajlik(':(')"><img src="../theme/smajlici/zamraceny.gif" /></span>
        <span onclick="smajlik(':/')"><img src="../theme/smajlici/urazeny.gif" /></span>
      </div>
      <div class="odeslat">
        <input type="submit" name="poslat" value="Odeslat" />
      </div>
    </form>
  </div>
</div>
<?php include "../footer.php"; ?>
xROAL
Profil
Síce tam nikde nevidím, ako sa správa od užívateľa ukladá do databáze (to je predpokladám v súbore "zapis.php"), ale myslím, že ti bude stačiť funkcia htmlspecialchars() pri výpise, ktorá zabezpečí že ak tam človek aj nejaký script vloží, tak sa nepustí, ale vypíše sa ako obyčajný text.
Donekulda
Profil
xROAL:
jo dík ale kam ? Typuji dobře ,když to dám do php ?
Kubo2
Profil
Donekulda:
Áno. Viď dokumentáciu. Ale ak ti máme nabudúce poradiť o niečo konkrétnejšie, než len slepo triafať, prosím prilož celý kód, ktorého sa problém týka - v tomto prípade by namiesto stávajúceho kódu stačilo ukázať nám súbory zapis.php a vypis.php.
Donekulda
Profil
Kubo2:
tak jo zde jsou ty kody
vypis.php
<?php
if(isset($kontrola) == "0"){
session_start();
}
include($_SERVER['DOCUMENT_ROOT']."/config.php");
$i=1;
$dotaz=mysql_query("SELECT * FROM chat WHERE smazano='0' ORDER BY `chat`.`id` DESC LIMIT 0, 10 ;");
            while($zaznam = MySQL_Fetch_Array($dotaz)):
              $id_chat = $zaznam["id"];
              $nick_chat = $zaznam["nick"];
              $id_nicku_chat= $zaznam["id_nicku"];
              $datum_chat = $zaznam["datum"];
              $text_chat = $zaznam["text"];
              $ip_chat = $zaznam["ip"];
              $i++;               
              if($i % 2){
                $trida = "lichy";
              } else {
                $trida = "sudy";
              }
              $dotaz2 = mysql_query("SELECT id, avatar FROM uzivatele WHERE id='$id_nicku_chat' ;");
                        while($vystup2 = mysql_fetch_object($dotaz2))
                        {
                          $avatar_chat = $vystup2->avatar;
                        }
              if(@$avatar_chat == 1){
                $avatar_obr = "<img src='../avatary/$nick_chat.gif' height='30px' alt='Avatar' >";
              } else {
                $avatar_obr = "<img src='../avatary/bez_avataru.png' height='30px' alt='Avatar' >";
              }
?>              
              <div class="<?php echo $trida; ?>">
                <div class="zprava">
                  <div class="avatar">
                    <?php echo $avatar_obr; ?>  
                  </div>
                  <div class="levy_sloupec">
                    <div class="nick">
                      <span onclick="nick('<?php echo $nick_chat; ?>')" ondblclick="presmerovani(<?php echo $id_nicku_chat; ?>);"><?php echo $nick_chat; ?></span>
                    </div>
                    <div class="cas">
                      <?php echo $datum_chat; ?>
                    </div>
                  </div>
                  <div class="stredni_sloupec">
                    <div class="text">
                      <?php echo $text_chat; ?>
                    </div>
                  </div>
                  <?php if(isset($_SESSION["opravneni"]) == "3"){ ?>
                  <div class="pravy_sloupec">
                    <div class="ip">
                      <?php echo $ip_chat; ?>
                    </div>
                    <div class="smazat">
                      <input type="submit" name="smazat" onclick="window.location.href='./index.php?akce=smazat&id=<?php echo $id_chat; ?>';" value="Smazat" />
                    </div>
                  </div>
                  <?php } ?>
                </div>
              </div>
            
         <?php   endwhile;  
         $kontrola = "0";   
            
?>
zapis.php
<?php
if(isset($_SESSION["nick"])){
  if(isset($_POST["poslat"])){
    if(isset($_POST["text"])){
      $smajlici = array(
        ':D' => '<img src="../theme/smajlici/mega_smich.gif">',
        ':)' => '<img src="../theme/smajlici/smich.gif">',
        ':(' => '<img src="../theme/smajlici/zamraceny.gif">',
        ':/' => '<img src="../theme/smajlici/urazeny.gif">'
      );
      function textove_na_graficke($text){
        global $smajlici;
        foreach($smajlici as $textovy => $graficky) {
          $text = str_replace($textovy, $graficky, $text);
        }
        return $text;
      }   
      $nick = $_SESSION["nick"];
      $id = $_SESSION["id"];
      $datum = date("H:i d. m. Y");
      $ip = $_SERVER["REMOTE_ADDR"];
      $text = textove_na_graficke($_POST["text"]);
      $zapis = mysql_query("INSERT INTO chat SET nick='$nick', id_nicku='$id', datum='$datum', text='$text', ip='$ip', smazano='0' ;");   
    }
  }
} else {
  echo "Přihlaš se!";
}
?>
index.php
<?php 
  include "../header.php"; 
  include "./zapis.php";
  $akce = isset($_GET["akce"]);
  $id_prispevku = @$_GET["id"];   
  if(isset($akce)=="smazat" AND isset($id_prispevku)){
    $uprava = mysql_query("UPDATE chat SET smazano='1' WHERE id='".mysql_real_escape_string($id_prispevku)."' ;");
  }
  
?>
<div class="chat_box">
  <div class="zpravy" id="vypis">
  <?php include "./vypis.php" ?>
  </div>
 
  <div class="formular">
    <form action="<?php $PHP_SELF; ?>" method="POST" name="form" id="form">
      <div class="input_text">
        <input type="text" name="text" size="80%" />
      </div>
      <div class="smajlici">
        <span onclick="smajlik(':D')"><img src="../theme/smajlici/mega_smich.gif" /></span>
        <span onclick="smajlik(':)')"><img src="../theme/smajlici/smich.gif" /></span>
        <span onclick="smajlik(':(')"><img src="../theme/smajlici/zamraceny.gif" /></span>
        <span onclick="smajlik(':/')"><img src="../theme/smajlici/urazeny.gif" /></span>
      </div>
      <div class="odeslat">
        <input type="submit" name="poslat" value="Odeslat" />
      </div>
    </form>
  </div>
</div>
<?php include "../footer.php"; ?>
Joker
Profil
Donekulda:
Ten kód obsahuje úctyhodné množství chyb.

Když rozeberu kód v [#1]:
Na řádku 4 isset vrací boolean, takže hodnota $akce bude true nebo false.
Řádek 5 bude bez nastaveného $_GET["id"] generovat notice pohlcenou zavináčem a v $id_prispevku bude buď $_GET["id"], nebo prázdný řetězec.
Nastupuje řádek 6:
  if(isset($akce)=="smazat" AND isset($id_prispevku)){
$id_prispevku a $akce jsou určitě nastavené, takže výsledek obou isset bude vždy true. Druhá podmínka je tedy splněna a první je true == "smazano", kde řetězec se konvertuje na boolean true, takže celá if-podmínka je vždy splněna.

Čili když někdo ten skript zavolá s ?id=něco, smaže to příspěvek s tím id, v ostatních případech se to jen pokusí smazat příspěvky s prázdným id.
Donekulda
Profil
Aha tak dík ,ale pořád mám otázku jak to zabezpečit ?

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0