PDA

Pogčedajte punu verziju : Zastita klasicne PHP contact forme od spama?


[nq]
01. 11. 2006., 22:04
Zastita klasicne PHP contact forme od spama (automatske poste, ajd tako da se izrazim) ?

Imam neku formicu koju stalno provlacim kroz projekte, no u poslednje vreme uzasno mnogo generisanih mailova (gluposti) prolazi kroz njih.

Jer ima neko neki dobar link ka nekom resenju ??

zark0vac
01. 11. 2006., 22:09
Stavi captchu (http://www.google.com/url?sa=t&ct=res&cd=1&url=http%3A%2F%2Fen.wikipedia.org%2Fwiki%2FCaptcha&ei=7QxJRa76L4mUnQP-1_yJCg&usg=__sgNOBSC9mxwwQ2BAx3PBNuMTJKM=&sig2=1rxKQuJYDYXbzPt27PgVlg), mozes staviti i da ti proverava ispravnost mail domena, ali nije ti neophodno ako stavis captchu jer si vec onemogucio automatske napade, jedino ostaje od smaraca koji ce rucno raditi, a takvih nema mnogo :)

shoba
01. 11. 2006., 22:12
a mozes da stavis jednostavan check box koji kaze "Ovo nije spam" i slicno...

ako ne "otkacis" nece poslati...

Petar Marić
01. 11. 2006., 22:15
Akismet (http://akismet.com/) je IMHCO dovoljno dobro rešenje u većini slučajeva.

[nq]
01. 11. 2006., 22:49
Hvala na predlozima, moram da nadjem vremena pa da pogledam ove linkove. :) Mada mi to sa "nije spam" zvuci najbolje.

Akismet (http://akismet.com/) je IMHCO dovoljno dobro rešenje u većini slučajeva.

Da ovo i WP (koliko mi se cini) koristi i odlicno je. :1043:

Milos Vukotic
01. 11. 2006., 22:52
...i pritom obrati pažnju na ovo:
http://www.gerd-riesselmann.net/archives/2005/09/sending-spam-through-contact-forms
tj. ovo:
http://securephp.damonkohler.com/index.php/Email_Injection

Nezaštićena kontakt forma može te pretvoriti u spamera :)

(ovo pod uslovom da mislis na formu za slanje emaila)

zark0vac
01. 11. 2006., 22:58
Mislim da misli na formu za ostavljanje komentara na svom blogu, ili gresim?

[nq]
01. 11. 2006., 23:14
Mislim da misli na formu za ostavljanje komentara na svom blogu, ili gresim?

Ne mislim na obicnu formu za kontakt mailom, a WP ima akismet plugin.

dinke
01. 11. 2006., 23:23
Odmah da ti kazem, to sa checkbox-om koji ce neko kao chekirati, nije nikakva zastita, jednostavno jedan post field vise koji saljes kroz request i zavrsen posao.

Resenje koje ce odbiti dobar deo spamera je generisanje nekog hidden field-a sa nekom random vrednoscu unutar forme, i smestanje istog u sesiju (kako bi ga proverio pre slanja) + stopwatch, tj. brojis koliko je sekduni proslo od prvog ucitavanja strane.

Jos bolje resenje (nesto slicno koristi spam carma) bi bilo generisanje neceg takvog na klijent strani (ne znam tacno kako bi to odradio), gde je JS integrisan unutar forme.

I poslednje, captha, ali ako i samo ako user ne prodje nesto od ovog gornjeg.

Ilija Studen
01. 11. 2006., 23:28
To za client side štopericu i nije problem ako ti ne predstavlja problem čienjenica da nemaju svi uključen JavaScript. Generišeš random ime polje i sačuvaš ga u sesiji na serveru. Printaš input hidden koji ima generisano ime. Setuješ JS interval koji će na svaki tik (1s) uvećavati vrednost hidden polja. Odbijaš sve komentare koji:

1. ne submituju vrednost sa generisanim imenom
2. imaju vrednost manju od npr. 3 sekunde

oliver78
01. 11. 2006., 23:45
Resenje koje ce odbiti dobar deo spamera je generisanje nekog hidden field-a sa nekom random vrednoscu unutar forme, i smestanje istog u sesiju (kako bi ga proverio pre slanja) + stopwatch, tj. brojis koliko je sekduni proslo od prvog ucitavanja strane.

Jel moze malko opsirnije?
Jel i ovde ciljas na JS?

dinke
02. 11. 2006., 00:07
Ne, ilija je objasnio JS varijantu, ovo je sve server side (php only :).

Dakle, php generise neki random string i generise ga unutar forme kao vrednost hidden polja tipa:

<input type="hidden" name="protect_form" value="2f2hfgvjgj" />

a takodje ga ubaci u sesiju kako bi mogao posle da imas sa cime da poredis ($_POST['protect_form'] sa $_SESSION['protect_form']). Takodje, slicno mozes sa vremenom, generises neki timestamp prilikom ucitavanja forme, pa posle proveravas koliko je sec proslo.

Inace, ovaj feature je breakable, ali mnogo toga treba odraditi od strane spamera:
- treba da ucita prvo formu
- parsuje to polje sa reg_expom da bi iscupao taj hidden field
- posalje post request, uz snimanje cookia (posto su uz ceo proces ukljucene sesije :)

Dakle, otarasio si se 90% spamera :)

ivanhoe
02. 11. 2006., 00:47
prednost ovog sto Dinke predlaze je sto ce raditi u svakom browseru... S druge strane javascript je bolja zastita jer malo pametniji spajder ce pokupiti sva polja i poslati ih zajedno sa cookiejem.. to nije uopste toliko komplikovano posto LWP i slicne biblioteke vecinu posla urade same..

Dobra fora za zaustavljanje spajdera je da se na ovo Dinketovo doda jedna onSubmit javascript funkcija koji ce uraditi nesto sa tom vrednosti u hidden polju, tipa da je pomnozi sa 2 ili tako nesto, to ce malo koji spajder moci da prevazidje, ali opet to zahteva podrsku za JS...

oliver78
02. 11. 2006., 22:33
Dakle, otarasio si se 90% spamera :)

Hvala, sada je jasnije.

Blood
02. 11. 2006., 23:54
A mozes i da stavis ovako nesto, i onda si se otarasio svih onih koji ne znaju da racunaju...

function captcha() {
$numbers = array("zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine");
$rand = array_rand($numbers,2);
$result=$rand[0]+$rand[1];
$question = "<b>".$numbers[$rand[0]]."</b> plus <b>".$numbers[$rand[1]]."</b>";
$out .= '<label for="captcha">Please enter the result into the box below:(Answer in numbers only)<br /> '.$question.' equals </label> <input type="text" name="captcha" id="captcha">'."\n";
$out .= '<div><input type="hidden" NAME="result" VALUE="'.$result.'"><br /></div>';
return $out;
}


Ako ti treba neko jednostvano resenje, ovo je super, ako ti treba nesto komplikovanije...dinketov predlog je odlican...