Newsgroup: it.comp.www.php
Titolo: tempi delay e antispam..

ciao a tutti,
partendo da questa discussione
http://groups.google.it/group/it.comp.www.php/browse_frm/thread/bc6d4029c998407e/f1262b538230857e?lnk=st&q=antispam+guestbook&rnum=1&hl=it#f1262b538230857e
e da questa
443a98de$0$18296$
4faf...@reader1.news.tin.it
vi chiederei come posso implementare i tempi di delay sul mio guestbook
in php...qualche dritta perlomeno :-)

Mikk ha scritto:

sleep(X) dove X tende a infinito.
-- 
Cordialmente.
Melus.
dal mio e-mail togli i simboli di Zorro.

 sleep(X) dove X tende a infinito.
esilarante :-|

 in php...qualche dritta perlomeno :-)
Non ho capito che ti serve :-)
Ciao,
Luca(riello) 

Luca(riello) ha scritto:

ciao luca,
quoto il tuo messaggio...
---------------------------------------------------
Visto che i bot sono programmi e che quindi vanno abbastanza veloce, ho
inserito nel form un campo
echo '<input type="hidden" value="' . time() . '" />";
e controllo lato server che la differenza tra il valore nel campo, e
l'ora
in cui viene inviato il messaggio sia compreso in un certo intervallo
di
secondi. nell'esempio ho messo 12 e 1800 secondi (mezz'ora per un
messaggio
sul guestbook credo sia sufficiente, mentre 12 secondi sono pochissimi
per
scrivere un messaggio!:)).
---------------------------------------------------
vorrei capire come realizzare quel controllo lato server di cui
parli...
grazie mille....


in guestbook.php oltre al form normale stampi anche questa riga:
echo '<input type="hidden" value"'.time().'" name="tempo" />';
Che stampa nel form in un campo nascosto il timestamp dell'ora in cui 
l'utente ha il form. Lui compila il form (questo campo del tempo non lo vede 
perché è hidden) e invia a salva.php.
In salva php prima di tutto controlli la differenza tra l'ora corrente (in 
cui lo script salva.php viene elaborato) e l'ora in cui l'utente ha ricevuto 
il form. Così:
$delay= time()-$_POST['tempo']
e poi fai il controllo:
if($delay<8 || $_POST['tempo']=="") die("è spam");
Controlli pure se il post['tempo'] è settato perché molti spambot prendono 
direttamente la pagina salva.php senza passare da guestbook.php.
Se mastichi anche le sessioni è più sicuro farlo con le sessioni (il campo 
può sempre e comunque essere manipolato).
In ogni caso il controllo del solo delay non basta: molti spambot impiegano 
molto tempo prima di mandare l'output. Così ne puoi bloccare "solo" un buon 
80%.
La sicurezza, per ora, l'ho trovata contando in un input ancora nascosto il 
richiamo dell'onkeyup.
C'è stata un'altra idea di roby4you che consisteva nel catturare l'evento 
del click del mouse per focalizzare il campo di testo (che devi 
inevitabilmente fare per scrivere un messaggio). Ma non l'ho ancora testata.
Spero sia chiaro :)
ciao,
Luca(riello) 

 Luca(riello)
grazie mille Luca,
faccio qualche prova e ti faccio sapere!!!!

 richiamo dell'onkeyup.
questo input va è un'aggiunta ulteriore al campo hidden di cui sopra?

 questo input va è un'aggiunta ulteriore al campo hidden di cui sopra?
E si....due campi hidden, uno per il timestamp e l'altro per la 
registrazione dell'evento onkeyup.
rob4you

 può sempre e comunque essere manipolato).
ciao Luca,
mi sorge un dubbio, ma con le sessioni, come faccio a impostare sin dal 
client l'uso di una variabile di sessione?
rob4you 

Perché non generare un'immagine Captcha ?
A meno di bot con ocr avanzati non avresti più problemi di delay
Marco
Mikk ha scritto:


 Marco
il captcha preferirei evitarlo...IMHO è ben poco friendly....
se non ci salto fuori con il delay corro direttamente sui captcha..

rob4you ha scritto:

ma l'evento onkeyup non è superfluo considerato che molti bot agiscono
direttamente sul send.php?
con le indicazioni di luca ho inserito una cosa di questo tipo nel
momento in cui viene scritto il messaggio sul guest, e il campo hidden
nel form...
<input type="hidden" value"'.time().'" name="tempo" /
--------------------------------------------------
if(isset($_POST['tempo'])){
  $delay= time()-$_POST['tempo'];
  if($delay<8 || $_POST['tempo']=="") die("è spam");
 }
else die("è spam");
--------------------------------------------------
come registro l'onkeyup? :-)
grazie!!!!!!!

Potresti allora verificare l'HTTP_REFERER, so che è spoofabile (lo
invia il browser), però in tutti i script in cui lo uso non lo ha mai
passato nessun bot.
Potresti altrimenti salvare l'ip del client (o bot) in un database con
un timestamp, ma avresti comunque il problema di eventuali proxy...
Mikk ha scritto:


 passato nessun bot.
con l'http_referer fare un controllo sulla provenienza?
cioè, date due pagine, tipo guestbook.php e send.php, nella seconda
farei questa verifica?

 passato nessun bot.
cioè, date due pagine, tipo guestbook.php e send.php, nella seconda
farei la verifica della provenienza con l'http_referer?

Esattamente, io di solito ho due pagine, una html e una php
esempio form.html e send.php
su send.php controllo che il referer sia 
www.miosito.com/form.html
Poi dipende da come hai impostato i tuoi script
Ciao, Marco
Mikk ha scritto:


 Ciao, Marco
ottimo....il mio script è tutto in un unico file, vedrò di splittare
il tutot in due file, che in effetti è anche più logico :-)
thanks!!

questo input va è un'aggiunta ulteriore al campo hidden di cui sopra?
Si è un altro campo hidden...
ciao,
Luca(riello)

ma l'evento onkeyup non è superfluo considerato che molti bot agiscono
direttamente sul send.php?
La registrazione dell'evento onkeyup ti serve proprio per riconoscere gli 
spam bot.
Devi lavorare sul codice javascript, non PHP (e quindi a questo proposito 
it.comp.lang.javascript).
Ti accenndo il fatto che devi creare una funzione javascript che al 
verificarsi dell'evento onkeyup (nel campo Text del nome, o nella Textarea 
destinata ad accogliere il messaggio), incrementa ad esempio un contatore 
che conteggia appunto il numero di volte che si verifica l'evento. Questo 
parametro lo inserisci in un campo hidden, e lo invii al server insieme a 
tutti gli altri campi al momento del submit.
rob4you 

 direttamente sul send.php?
Scusate... mi sono perso tutti i messaggi del ng, ho dovuto cercare con 
google. Outlook mi ha fatto i dispetti.
Allora...
per Roby: inizi la sessione quando l'utente apre la pagina del guestbook:
session_start();
$_SESSION['tempo']=time();
e quando fa l'invio, ovvero in send.php:
session_start();
$delay= time()-$_SESSION['tempo']
Così alla buona.
Il Metodo Captcha oltre che fastidioso per chi invia messaggi, è anche 
insicuro quanto il metodo onkeyup visto che il modo per aggirarlo c'è. Solo 
che "il mio" è una anticchia più semplice da implementare (e più semplice 
anche da aggirare, ma finché non lo fanno... mi va bene), quindi va bene per 
quei guestbook di poche pretese che pur son vittime di spam.

 $delay= time()-$_SESSION['tempo']
Ok, grazie Luca...recepito! :-)
un dubbio, di cui tuttavia se ne era gia parlato in passato:
ma se io scrivo solo "CIAO" nel messaggio, oppure faccio il copia e incolla 
da un'altra parte, in modo da impegarci TRE SECONDI NETTI per eseguire 
l'operazione (roba da Schumacher dei tempi d'oro)....questo sistema 
considererà il mio messaggio come spam?
rob4you 

 sistema considererà il mio messaggio come spam?
Chiaro che si.
Anche per questo il delay non è un metodo sicuro (ma a differenza 
dell'onkeyup non richiede il javascript).
Comunque nessuno riuscirà a scrivere e inviare un messaggio (anche col copia 
e incolla) in meno di 7 secondi. E se ce la fa non vedo perché non dovrei 
considerarlo spam, visto che se fa una cosa così velocemente (senza neanche 
leggere i messaggi sul guestbook) proprio corretto non sarà. Se poi 
consideriamo che c'è quasi sempre (o almeno nel mio g. c'è) un campo a parte 
dove inserire il nome... è veramente impensabile che ce la possa fare in 7 
secondi.
Ciao,
Luca(riello) 

> è veramente impensabile che ce la possa fare in 7 secondi.
Seven Seconds.......posso provarci?? :-))))
Se ci riesco....sarò il degno erede della versone maschile di Calamity Jane 
restyled 2006! :-)
Ciaooo,
rob4you 


Si ma ti devi comportare regolarmente... come se non dovessi sapere che devi 
fare in fretta. Altrimenti non vale :-P
Ciao,
Luca(riello) 

 devi fare in fretta. Altrimenti non vale :-P
Giusta regola! :-)
Mi dici comunque l'indirizzo del tuo sito? Cosi gli dò un'occhiatina!
rob4you 


Il sito del guestbook? o il mio personale? :p Ne ho una marea.
Comunque dove c'è il sistema antispam è 
http://hombresdemar.altervista.org
la pagina è ovviamente guestbook.php.
se vuoi vedere le stat dello spam, cerca il file spam.txt (aggiungilo 
all'url)
ciao,
Luca(riello) 

 all'url)
Ho fatto qualche tentativo...sto migliorando! :-)))
ma che tempo hai impostato???? ho visto che mi blocca anche con un tempo 
impiegato di 13 secondi.....mancava poco che scrivessi tutta la divina 
commedia!!!!!! ;-p
rob4you 

 commedia!!!!!! ;-p
Non so perché ma il delay era impostato a 23 secondi. L'ho abbassato a 10. 
:-P
Comunque c'è il controllo javascript.
ciao,
Luca(riello)




Oppure metti nella prima due campi nascosti, nel form, tipo
<input type="hidden" name="challenge" value="stringa a caso" />
<input type="hidden" name="response" value="hash" />
hash lo ottieni con
	$hash = md5($PasswordSegreta . $StringaACaso);
send.php riceve $challenge e $response, e 
	if ($response != md5($PasswordSegreta . $challenge))
		die("Senti che bot!");
Il bot non puo' passare send.php se prima non riceve una coppia valida
di token da guestbook.php.
E la stringa potrebbe non essere a caso: potrebbe essere il timestamp,
per cui puoi pure verificare che la differenza fra $challenge e time()
sia compresa fra un tempo minimo (20 secondi?) e un tempo massimo (una
mezz'ora?).
Per bypassare il controllo, il bot dovrebbe leggersi guestbook.php per
ricreare un pacchetto POST e aspettare 20 secondi a mandarlo. E' roba.
Puoi anche mettere un codice javascript che valorizzi un campo - anche
questo nascosto - con una qualche funzione astrusa. Esiste SHA1 in JS,
per esempio: e, se cambi i nomi alle funzioni, non e' immediato vedere
che il campo hidden "randomstring" e' lo SHA1 di "challenge". Sicche',
l'autore del bot o si reingegnerizza il codice (buona fortuna...) o e'
costretto a usare un interprete di Javascript.
Altra cosa, puoi mettere dieci textarea di cui una sola visibile, ogni
volta diversa, via CSS. Il bot e' costretto a riempirle tutte: e se ti
arriva piu' di una textarea piena...
Alla fine, dipende quanto il bot-writer e' disposto ad investire, come
tempo, per spammare te. Secondo me basta il trucco del MD5.
Leonardo
-- 
Dawn is near, the time is short (Human aircraft! Hard to port!)
We eight reindeers of the night work as one in silent flight.
Let not one damn house pass by (Who taught that guy how to fly?)
Each year sees more girls and boys: how many of them can we bring toys?