JustPaste.it

Zabezpieczenia formularzy - metoda z hasłem na obrazku

Problem:

Mamy super skrypt i chcemy żeby wykonywany był tylko i wyłącznie
przez formularz znajdujący się na naszej stronie.

Rozwiązanie w teorii:

Najlepiej jest przy pomocy formularza oprócz konkretnych danych
przesłać hasło. Powinno ono za każdym razem być inne. Można
to uzyskać na wiele sposobów. Najprościej jest generować
hasło na podstawie aktualnego czasu. Sprawny 'hacker' formularzy
jest w stanie bez problemu wyciągnąć hasło z kodu źródłowego
strony dlatego właśnie pojawił się pomysł z wyświetleniem go
w postaci obrazka co uniemożliwia programowe pobranie hasła.
Jedyną wadą jest to, że użytkownik musi przepisywać je z obrazka
do pola tekstowego ręcznie. Nasz super skrypt powinien
przed wykonaniem swoich właściwych działań pobrać czas, rozkodować
czas z hasła i sprawdzić czy oba czasy są sobie równe. W przypadku
gdy tak się nie stanie powinien przerwać swoje działanie.
Musimy oczywiście dać internaucie czas na wypełnienie formularza.
Ja przyjąłem tolerancję do dwóch godzin.

Rozwiązanie w praktyce:

Strona z formularzem - index.php:

<form action="skrypt.php" method="post">
  <!-- jakieś właściwe inputy -->
  <img src="image.php">
  <p>Aby wysłać formularz wpisz hasło z obrazka</p>
  <input type="text" name="pass" size="8">
  <input type="submit" value="Wyślij">
</form>


Plik generujący obrazek z hasłem - image.php:

<?
    function passgen() {
       $nr = floor(time() / 3600);
       srand(array_sum(explode(" ", microtime())) * 100000);
       $a = rand(0, min(getrandmax(), $nr));
       $b = $nr - $a;
       $a = base_convert($a, 10, 36);
       $b = base_convert($b, 10, 36);
       $a = strrev(str_pad($a, max(strlen($a), strlen($b)), 0, STR_PAD_LEFT));
       $b = str_pad($b, max(strlen($a), strlen($b)), 0, STR_PAD_LEFT);
       for($i = 0; $i &lt; strlen($a); $i++) $pass .= $a[$i].$b[$i];
       return $pass;
    }
    header("Content-type: image/jpeg");
    $img = imagecreate(110, 30);
    $background = imagecolorallocate($img, 206, 207, 099);
    $textcolor = imagecolorallocate($img, 0, 0, 0);
    imagestring($img, 5, 10, 7, passgen(), $textcolor)
    imagejpeg($img);
    imagedestroy($img);
?>


Nasz super skrypt - skrypt.php:

<? 
   function passcheck($pass) {
       $nr = floor(time() / 3600);
       for($i = 0; $i &lt; strlen($pass); $i++)
         if($i % 2 == 0) $a .= $pass[$i]; else $b .= $pass[$i];
       $a = base_convert(strrev($a), 36, 10);
       $b = base_convert($b, 36, 10);
       if($a + $b &lt;= $nr && $a + $b &gt;= $nr - 2) return true;
       return false;
   }
 
   if(!passcheck($pass)) die("Hasło nie poprawne !!!");

   //reszta super skryptu
?>



To by było na tyle :-)


 Źródło: 4programmers.net. Treść udostępniona na zasadach licencji Creative Commons Attribution 

 

Autor: piechnat

Licencja: Creative Commons - bez utworów zależnych