Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] Token i bezpieczeństwo.
Forum PHP.pl > Forum > PHP
puz219
Witam.

Napisałem sobie skrypt tokena, tylko nie wiem, czy moje rozwiązanie jest bezpieczne oraz jak trudne będzie odczytanie takiego tokena przez bota.

Skrypt składa się z 3 plików:

funkcje.php
  1. <?php
  2. function FormRejestracja($tokencode, $komentarz="") {
  3.     $_SESSION["token"] = $tokencode;
  4.     ?>
  5.         <form method="POST" name="rejestracja" action="formularz.php">
  6.             <? echo $komentarz; ?>
  7.             <fieldset>
  8.                 <legend>Login</legend>
  9.                 <input type="text" id="login" name="login">
  10.    
  11.             </fieldset>
  12.             <fieldset>
  13.                 <legend>Hasło</legend>
  14.                 <input type="password" id="pass" name="pass">
  15.             </fieldset>
  16.             <fieldset>
  17.                 <legend>Powtórz hasło</legend>
  18.                 <input type="password" id="pass" name="pass2">
  19.             </fieldset>
  20.             <fieldset>
  21.                 <legend>E-mail</legend>
  22.                 <input type="text" id="email" name="email">
  23.             </fieldset>
  24.             <fieldset>
  25.                 <legend>Token</legend>
  26.                 <? //include_once("user_token.php");                
  27.                 echo '<img src="token_pic.php">';?>
  28.                 <input type="text" id="token" name="token">
  29.             </fieldset>
  30.             <input type="hidden" name="los" value="<? echo $chars; ?>">
  31.             <p><input type="submit" id="sudmit" name="send_reg" value="Rejestruj"></p>
  32.         </form>
  33.     <?}
  34.  
  35. function createToken() {
  36. $char = array(1,2,3,4,5,6,7,8,9,'q','w','e','r','t','y','u','i',
  37. 'o','p','l','k','j','h','g','f','d','s','a','z','x','c','v','b','n','m','Q'
  38. ,'W','E','R','T','Y','U','I','O','P','L','K','J','H','G','F','D','S',
  39. 'A','Z','X','C','V','B','N','M');
  40.     $text = "";
  41.     for($i = 0; $i < 7; $i++)
  42.     {
  43.         $text .= $char[array_rand($char)];
  44.     }
  45.  
  46. return $text;
  47. }



formularz.php
  1. <?php
  2. include_once(funkcje.php);
  3.  
  4. $token = createToken();
  5.  
  6. if(isset($_POST["send_reg"]))
  7.     {
  8.        if($_POST['token'] == $_SESSION['token'])
  9.        {
  10.           $_SESSION["kom_r"] = "Token poprawny";
  11.          
  12.           echo $_SESSION["kom_r"];
  13.        }
  14.        else
  15.        {
  16.           FormRejestracja($token, "Token niepoprawny");
  17.        }
  18.     }else {
  19.    
  20.     FormRejestracja($token); }
  21. ?>


token_pic.php
  1. <?php
  2. header ('Content-type: image/gif');
  3.  
  4. $text = $_SESSION["token"];
  5.  
  6. /* generowanie tokena za pomocą biblioteki GD */
  7. /* jeżeli ktoś chce kod, to proszę pisać, a tutaj nie wklejam,
  8. bo jest dość długi, a i tak nic nie wnosi do kwestii bezpieczeństwa (no chyba, że się mylę) */
  9.  
  10. imagegif($image);
  11. imagedestroy ($Image);
  12. ?>


Prosiłbym o sprawdzenie napisanych skryptów pod katem bezpieczeństwa oraz opinię, czy takie "coś" będzie trudne do złamania dla bota?

Pozdrawiam
ddiceman
To bedzie banalnie latwe do zlamania przez bota. Dlaczego? Bo jezeli bot nie przechowuje ciasteczek (w tym SESSION_ID) to znaczy, ze nie nie beda dla niego dostepne zmienne sesyjne. W zwiazku z czym wystarczy, ze przesle puste $_POST['token'], to wtedy porownane do pustego (bo nie zainicjowanego) $_SESSION['token'] da zawsze true.
Zrob chociaz
  1. <?php
  2. if(!empty($_SESSION['token']) && $_POST['token'] === $_SESSION['token'])
  3. ?>
puz219
Czyli sprawdzenie czy zmienna sesyjna $_SESSION['token'] nie jest pusta to jedyna rzecz, którą mogę zrobić, żeby zabezpieczyć ten formularz czy może nie. Przepraszam za takie może trochę idiotyczne pytanie, ale w jaki sposób maksymalnie zabezpieczyć tego tokena.

Może mój sposób rozumowania jest błędny i token powinien być zrobiony całkowicie w inny sposób, bo jak widać kiepsko u mnie z kwestiami bezpieczeństwa biggrin.gif, a tego tokena chciałbym maksymalnie zabezpieczyć, co jest chyba zrozumiałe.

Pozdrawiam
ddiceman
Zakladajac, ze nikt Ci sie nie wlamie na serwer, nie masz nigdzie var_dump($_SESSION); i nie zakladasz, ze bot odczyta kod z obrazka (co nie jest specjalnie trudne, jesli ktos sie uprze), to na tym poziomie - tak, jest to wystarczajace
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.