Wszelkie metody tutaj przedstawiam w zastosowaniu na skrypcie logowania, rejestracji czy wstawiania komentarzy.
Jak wiadomo boty wypełniają wszystko jak leci, dlatego najłatwiejszym sposobem będzie stworzenie dodatkowego input text w celu prostego przechytrzenia. Nadajmy mu nazwę np. test i ukryjmy za pomocą CSS to pole:
[css]
input[type=text]#test{
display:none;
}[/css]
Teraz w PHP należy sprawdzić czy na pewno to pole jest puste:
[php]
If($_POST[‘test’]!=’’){
//wykonaj skrypt
}
else{//przerwij działanie}
[/php]
Następne warunki wystarczy dodać dopisując
[php]
|| warunek
[/php]
W zasadzie bardzo dobrym zabezpieczeniem to nie jest i nie należy tego traktować jako jedyny sposób na bot, dlatego warto zastosować inne metody. Bezproblemowo można wykorzystać go w takich formularzach jak komentarze, rejestracja, logowanie, czy też najzwyklejszy shoutbox.
Kolejnym sposobem jest liczenie czasu pisania zawartości skryptów. Jak wiadomo boty robią to natychmiastowo, więc niestety jest takie ograniczenie tutaj, że nie można używać tego w takich formularzach jak właśnie logowanie, ponieważ wiele osób ma zapisane hasła i wystarczy kliknąć i są zalogowani.
Działa on na takiej zasadzie, że dodajemy jeszcze jeden ukryty input i wpisujemy jako jego wartość aktualny czas:
[php]<input name=start type="hidden" value="<?php echo time(); php>" />[/php]
Następnie po wysłaniu formularza dajemy kod obliczający różnice w czasie, należy tutaj dać wartości odpowiednie do zawartości formularza, w przykładzie zastosuję 5 sekund.
[php]
<?php
$koniec=time();
$czas= $koniec-$_POST[‘start’];</code>
//no i konstrukcja if
if($czas>5){
//ok.
}
else{
//przerywamy skrypt
}
?>[/php]
Jak pisałem powyżej nie nadaje się on do takich formularzy jak logowanie, czy shoutbox lub chat gdzie zazwyczaj wpisuje się po dwa 3 słowa.
Formularz rejestracji jeszcze można zabezpieczyć dodając dodatkowe dane typu zaznacz jak jesteś botem lub jak np. w poczcie pytają o zainteresowanie to czy inny pytanie dać odpowiedź do zaznaczenia, którą na pewno człowiek by nie zaznaczył (choć z ludźmi bywa różnie). Niestety to rozwiązanie ma parę minusów ludzie zaznaczając wszystko jak popadnie, więc jeśli przy potwierdzeniu regulaminu dodamy checkbox z napisem zaznacz, jeśli jesteś botem, to roztargnięty użytkownik to zaznaczy, albo w zainteresowaniach jak sobie strzela pierwsze lepsze zainteresowanie, też może trafić na takie ulepszenie formularza.
Ostatnio coraz częściej wykorzystaniem zabezpieczenia jakiegokolwiek formularza jest napisanie wyniku jakiegoś wyrażenia, czy daty wydarzenia historycznego. Zazwyczaj są tam stałe liczby i daty, ale może by warto troszkę to ubarwić? Pokażę na zasadzie liczenia jak wykonać takie małe zabezpieczenie. Najpierw tworzymy sobie tablicę z słownymi odpowiednikami liczb:
[php]$liczby = Array('zero', 'jeden', 'dwa', 'trzy', ‘cztery’, ‘pięć’, ‘sześć’, ‘siedem’, ‘osiem’, ‘dziewięć’, ‘dziesięć’);[/php]
Teraz za pomocą funkcji rand(0,10); generujemy sobie dwie liczby oraz jak ktoś chce zmusić użytkownika do większego wysiłku to generuje sobie jeszcze znak +, -, * lub ^. W formularzu dodaj jeszcze ukryty input i daj mu wartość wygenerowanych liczb oddzielonych jakimś znakiem. Oprócz tego w tym formularzu daj napis:
[php]
Ile to jest: <?php echo $liczby[$liczba1] .’+’. $liczby[$liczba2]; ?>?[/php]
pod tym jeszcze input text do wpisania wartości oraz weryfikacja
[php]<?php
$dodaj=explode(‘;’, $_POST[‘liczby’]);
$suma=$dodaj[0]+$dodaj[1];
//if:
if($suma==$_POST[‘wynik’]){
//działaj
}
else {
//przerwij
}
?>[/php]
Jeszcze jeden sposób, jaki mi się przypomina, choć jest on wszystkim znany to ilość linków w tekście, różni ludzie różnie to sprawdzają, ja preferuje taki sposób, że jeśli tekst po wycięciu wszystkich linków zajmie mniej niż 50 % pierwotnej wersji to wtedy uznaje za spam
[php]<?php
$tekst = preg_replace("#\(.*?)\(.*?)\[/url\]#si",' ',$_POST[‘tresc’]);
$bezurl= strlen($tekst);
$url= strlen($_POST['tresc'];
$zawartosc=$bezurl/$url;</code>
//if
if($zawartosc>0.5){
//wykonaj
}
else{
//przewij
}
?>[/php]
Zwartość procentowa podajemy w częściach dziesiętnych (taka mała uwaga dla typowych laików :)) W przykładzie powyżej ustawiłem na 50%, choć i to tak za dużo, wg. mnie 0.35 to jest wystarczająca liczba.
Ostatni sposób jaki mi się teraz przypomina to wklejenie formularza, przez przez innerHTML w JS, nie jest to zbyt elegancki styl, jeśli chodzi o kod, no ale chociaż działa i przynosi pożądane efekty
No i tyle co do mnie, mam nadzieję, że spodobał się Wam mój tekst i że skorzystacie z tych porad ;) u mnie to się sprawdza bardzo dobrze. Może znacie jakieś inne sposoby zabezpieczenia formularzy?