Login lub e-mail Hasło   

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 f...
Wyświetlenia: 8.576 Zamieszczono 30/05/2006
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 

Podobne artykuły


11
komentarze: 3 | wyświetlenia: 2678
6
komentarze: 3 | wyświetlenia: 2524
50
komentarze: 27 | wyświetlenia: 63441
10
komentarze: 7 | wyświetlenia: 5209
24
komentarze: 33 | wyświetlenia: 13202
18
komentarze: 9 | wyświetlenia: 54994
8
komentarze: 2 | wyświetlenia: 27409
15
komentarze: 5 | wyświetlenia: 32714
14
komentarze: 7 | wyświetlenia: 14642
13
komentarze: 2 | wyświetlenia: 22942
 
Autor
Dodał do zasobów: Mariusz Żurawek
Artykuł



Biorąc pod uwagę szybkości wykonywania skryptów PHP, oraz przpustowość dzisiejszych łączy internetowych... taki skrypt, nawet gdy wymaga od użytkownika wypełnienia formularza w minutę, całkowicie traci sens. W minutę można dodać kilka tysięcy wpisów wykorzystując jedno, akurat przypisane, 'hasło'.

Stanowczo lepszym sposobem jest generowanie liczb/liter, oraz przechowywanie ich w pliku tekstowym, lub tabeli MySql. Po użyciu, kombinacja jest po prostu usuwana.

Jak nie dopuścić bota do głosowania?

CAPTCHA to zło. pomyślcie dlaczego, a jak nie wymyślicie, to poszukajcie.

  Amadeusz  (www),  21/05/2010

Zabezpieczenia na stronach www są na szczęście coraz skuteczniejsze, a to przede wszystkim zasługa bankowości internetowej. Mam nadzieję że większość biurokratycznych drobnostek będziemy mogli w naszym kraju załatwić przez internet.



Dodaj swoją opinię
W trosce o jakość komentarzy wymagamy od użytkowników, aby zalogowali się przed dodaniem komentarza. Jeżeli nie posiadasz jeszcze swojego konta, zarejestruj się. To tylko chwila, a uzyskasz dostęp do dodatkowych możliwości!
 

© 2005-2018 grupa EIOBA. Wrocław, Polska