Zabezpieczanie formularza przy użyciu tokenów
Często spotykanym problemem wśród właścicieli stron jest tzw. spamowanie formularzy - technika spamerów, którzy umieszczają swoje reklamy np. w komentarzach do bloga wykorzystując umieszczone na nim formularze.
Istnieje możliwość łatwego przeciwdziałania temu procederowi poprzez dołączenie do formularza mechanizmów tokena - obrazka z kodem, który należy przepisać do pola obok.
Implementację mechanizmu tokenów rozpoczniemy od utworzenia pliku tokens.txt zapisując w każdej linijce kody, które będą się pojawiały w tokenie. Możemy je utworzyć przy użyciu jakiegoś generatora lub po prostu ręcznie (wygenerowanie kilkunastu kodów "z palca" powinno na początek wystarczyć).
Mając już listę kodów, tworzymy skrypt PHP, który będzie tworzył obrazek oraz umieszczał na nim wybrany kod na podstawie przekazanego przez GET argumentu - w argumencie tym przekazujemy numer linijki z kodem. Numer ten jest losowany w pliku z formularzem.
Na początku pliku tokens.php pobieramy plik tokens.txt do tablicy i wybieramy z niej token na podstawie argumentu n przekazanego przez GET:
<?
$tokens=file("tokens.txt");
$token=$tokens[$_GET["n"]];
W kolejnych linijkach tworzymy obrazek, alokujemy kolory, które będą używane dalej w skrypcie oraz wypełniajmy tło kolorem białym:
$i=imagecreate(100,40); // szerokosc, wysokosc wygenerowanego obrazka
$white=imagecolorallocate($i,255,255,255);
$black=imagecolorallocate($i,0,0,0);
$gray=imagecolorallocate($i,150,150,150);
imagefill($i,1,1,$white);
Aby obrazek nie był zbyt łatwo odczytywalny, rysujemy "szumy":
for($c=0;$c<300;$c ) {
$los1=rand(0,$width);
$los2=rand(0,$height);
imageline($i,$los1,$los2,$los1,$los2,$gray);
}
Wreszcie rysujemy napis (kod) na obrazku oraz zwracamy go do przeglądarki jako plik GIF:
imagestring($i,5,20,12,trim($token),$black);
header("Content-type: image/gif");
imagegif($i);
?>
Teraz przechodzimy do pliku, w którym mamy nasz formularz aby umieścić w nim następujące linijki, odpowiedzialne za wyświetlenie obrazka tokenu oraz umieszczenie pola na jego wpisanie:
<?
$tokensmax=sizeof(file("$app_dir/tokens.txt"));
$tokenid=rand(0,$tokensmax);
?>
<label for="token">Przepisz token:</label>
<input type="text" class="text" name="token" id="token"/>
<img src="token.php?n=<?=$tokenid?>" alt="Token" />
<input type="hidden" name="tokenid" value="<?=$tokenid?>" />
Pozostaje jeszcze dodanie mechanizmu sprawdzającego poprawność wpisanego tokenu do pliku, do którego jest wysyłany formularz i który zajmuje się sprawdzeniem jego danych:
$tokens=file("$tokens.txt");
$token=$tokens[$_POST["tokenid"]];
if(trim($token)==trim($_POST["token"])) {
// token poprawny, tutaj mozna umiescic dalszy kod
}
Dzięki powyższym zabiegom, możemy w łatwy sposób zapobieć spamowaniu przez nasze formularze. Nie jest to może metoda idealna, bowiem bardziej zaawansowane skrypty mogą próbować np. rozpoznawać znaki, jednakże dla większości spamerów jest to przeszkoda, która może ostudzić ich zapał bowiem nie każdemu spamerowi chce się sprawdzać na jakiej zasadzie działa każdy z tego typu skryptów.
Subskrybuj kanał RSS bloga
Tomasz Guzik
PS http://sam.zoy.org/pwntcha/