Newsgroup: it.comp.www.php
Titolo: Attacco spam su sito web

Salve a tutti. Circa un anno fa ho fatto un piccolo sito per
un'associazione onlus. Ho dato la possibilità agli utenti non
registrati di inserire delle domande che automaticamente vengono
pubblicate sul sito.
Come non detto  la pagina in questione è stata riempita di messaggi
spam di viagra e robe varie.
Ho provato a mettere un semplice js Captcha, ma è stato inutile.
Avete idee su come posso fare per eliminare il problema?
Grazie.

 Avete idee su come posso fare per eliminare il problema?
Buona fortuna. :)
Metti un captcha meno semplice, ed eventualmente abbinaci un controllo 
antispam basato su keyword o su uno dei vari servizi online di verifica 
(come fa wordpress, per esempio).
Al limite puoi (volendo) implementartelo tu usando spamassassin o qualche 
altro filtro server-side basato su filtri bayesiani.
Bye.

 wrote:

JS è male, ma i captcha sono peggio. Prova una strategia di ticket
con validità temporale limitata.
Nel FORM, metti un campo hidden con l'ora corrente T = time().
Alla ricezione del POST, controlla che sia:
0 < time() - T < 2 * 3600
Questo dà all'utente una finestra temporale di 2 ore per fare il submit.
Se il test ha successo, puoi accettare il POST, altrimenti ripresenti il form
con tutti i dati immessi ma senza eseguire altre operazioni né dare altre
indicazioni.
Per rendere più difficile la vita agli spammer più determinati che vogliano
fare il reverse engineering, potresti:
* Offusca il numero T sommando una costante, oppure facendo lo XOR con un'altra
costante.
* Chiama il campo hidden con un nome insospettabile, per es. "spazio_disco".
* Entrambe le precedenti.
Ciao,
 ___ 
/_|_\  Umberto Salsi
\/_\/  
www.icosaedro.it

 submit. Se il test ha successo, puoi accettare il POST, altrimenti
  Perche' questo dovrebbe impedire lo spam sul sito? A che serve? Scusa
l'ignoranza... :°)
  Un saluto,
-- 
Gianfranco Bertozzi
Linux User #183585

 l'ignoranza... :°)
Gli spammer che sparano lo spam attraverso le maschere WEB di invio messaggi
confidano che queste maschere siano definite staticamente, e quindi si limitano
a fare un mero POST HTTP senza avere fatto un GET della pagina del FORM,
sicché mandano il mio campo hidden con il ticket scaduto e io li sgamo.


 sicché mandano il mio campo hidden con il ticket scaduto e io li sgamo.
mica l'ho capita sa'
scusa se loro ti mandano il campo col "ticket" entro due ore tu lo 
accetti quindi...?

 sicch� mandano il mio campo hidden con il ticket scaduto e io li sgamo.
che spammer pivelli :)

 GET della pagina del FORM, sicché mandano il mio campo hidden con il
  Capito, il campo "T" quindi conterra' sempre, che so, 12:45 anche se
il POST vien fatto alle 3 di notte. Questo perche' gli spammer miserelli
non sanno che contiene l'ora e non lo modificano di conseguenza. Un po'
semplice ma suppongo efficace nella maggior parte dei casi.
  La prossima volta che avro' a che fare con un problema del genere ti
copiero' l'idea. :-)
  Grazie e un saluto,


trovo anche carino... :)
Altra possibilita': via CSS, mettere DIECI pulsanti di invio, in ordine
casuale, con nomi casuali, e nove di quelli sono invisibili. E un campo
hidden contiene l'MD5 del nome del pulsante di invio concatenato ad una
stringa segreta.
Se il FORM arriva ma il nome del pulsante il cui valore e' INVIA non e'
corrispondente, o manca del tutto, l'IP mittente viene bloccato.
Leonardo
-- 
Though with a scornful wonder / Men see her sore oppressed,
By schisms rent asunder, / By heresies distressed;
Yet saints their watch are keeping, / Their cry goes up, "How long?"
And soon the night of weeping / Shall be the morn of song.

 casuale, con nomi casuali, e nove di quelli sono invisibili. E un campo
  Un'altra ancora:
http://www.gianfrancobertozzi.it/tmp/ancora.php
  che ad ogni ricarica mostra una immagine diversa. Il form non c'e', e'
solo una prova ma mi par bellina. :-)
  Personale per Umberto Salsi: non vale pero', tiri il sasso e nascondi
la mano? La mia mail e' valida: ora comportati da bravo hacker e dimmi
se hai fatto e quel che hai fatto, ok? ;-p
  Un saluto svelto,


 trovo anche carino... :)
Non disturbante e, nel mio caso, risolutiva.
--
Fabrizio

 trovo anche carino... :)
Il test di Turing dove devi scrivere solo un numero di una o due cifre per me
è sicuramente meglio di un captcha di 6 caratteri alfanum. da battere come una
scimmia, però rimango dell'idea che è meglio usare un sistema trasparente
all'utente. Rendiamoci conto che dobbiamo solo difendere il formmail dagli
spammer seriali, non ci dobbiamo difendere dagli attacchi dell'NSA, soprattutto
quando si tratta di un sitariello aziendale o di un microblog di cento persone.
Tra parentesi: non ho mica capito come funziona la tua pagina: dov'è che sta
scritta la risposta? Comunque, se sapessi farlo propenderei per il sistema
proposto da Leonardo proprio perché è trasparente all'utente.


 accetti quindi...?
Gli spammer salvano la pagina statica una volta per tutte e la usano 
periodicamente per inviare il loro spam.
Ma in quella pagina statica c'� salvato un timestamp valido solo per quelle 
due ore... in futuro non sar� pi� valido.
Se tu adesso carichi la pagina il timestamp salvato nel campo hidden della 
pagina sar� "26 giu 09, 15:46".
Se lo mandi entro le 17:46 del 26 giu 09 va bene ma se ti salvi la pagina e 
la usi per mandare spam periodicamente, oltre quell'istante non sar� pi� 
valida.
-- 
Elminster 

 solo una prova ma mi par bellina. :-)
Potrebbero prendere immagine e campo <select>, mostrarli in un sito XXX 
come "prova di accesso" alle immagini.
Ed ecco che ti crei una macchina perfetta per sfondare quel coso.
Certo, ci vuole tempo, volont� di farlo (aka: non si fa "cos� per 
fare"), e poi devi avere un ottimo archivio di foto/video :-P
Enrico

 come "prova di accesso" alle immagini.
  Cioe'? Parli di piazzare una "copia" del test su un sito dove altri
"umani" danno le risposte giuste? Se e' questo, direi che devi avere un
sito parecchio importante per giustificare tutto questo lavoro! :-)
  Se non lo e', potresti spiegarmi meglio che magari imparo pure
qualcosa? :-)
  Saluti e grazie,


 all'utente.
  Il sitema di Leonardo interesserebbe anche a me, solo che non capisco
come farlo o almeno come farlo via CSS. Se Leonardo avesse dieci
minutini da sprecare per spiegarci, alle volte... :-)
  Il mio sistema invece lo so spiegare: la prima pagina crea
l'operazione, scrive il risultato in un file sul server, mostra il form.
La pagina successiva controlla se la risposta dell'utente e' uguale a
quanto letto dal file e, se si, processa il tutto. :-)
  Un saluto,


 qualcosa? :-)
Intendo che non avendo un gruppo di scimmie altamente addestrate per 
leggere i captcha, si potrebbero usare gli stessi esseri umani per la 
"scansione OCR" del captcha.
Enrico

minutini da sprecare per spiegarci, alle volte... :-)
In PHP butti fuori (per costruire la form) dieci pulsanti... ora non ho un
PHP sottomano e neanche il minimo di neuroni funzionanti, considera quello
che segue come un suggerimento e NON come del codice vero:
$good	= random(da 0 a 9 compreso);
data ed ora corrente insieme ad una sequenza hash random - md5sum("secret"
. uniqid) - che chiamiamo $pass finiscono in sessione.
for ($button = 0; $button < 10; $button++)
{
	if ($good != $button)
	{
		$hash = md5sum("puppa" . uniqid('') . $button );
		$style = "stile per renderlo invisibile, o piccolissimo, o
fuori schermo, o trasparente, o infrattato sotto a un altro oggetto";
	}
	else
	{
		$hash = $pass;
	}
	$form .= "<button type=\"submit\" name=\"send[$hash]\"
value=\"Invia\" $style />"
}
La form che riceve questo pappi� fa una serie di controlli:
	=> la sessione esiste
	=> la data e l'ora di creazione form non sono troppo vicini al
	   momento dell'invio (compilare i campi porta via tempo. C'e'
	   il rischio che uno utilizzi roboform o cose cosi', pero')
	=> esiste $_REQUEST[send]
	=> e' un vettore
	=> ha un solo elemento
	=> il valore della chiave corrisponde a $pass
Ci sono varie crudelta' che si possono aggiungere... per esempio si puo'
fare in modo che *un* bottone (a caso) abbia "Invio" invece che "Invia".
Un hacker determinato non si accorgera', specie se si usa css e class al
posto dello stile (mi raccomando, dieci classi diverse!), che il bottone
buono non aveva scritto "Invio"; vedendo un bottone diverso e sapendo di
dover cercare un intruso, qualche minuto a rompersi il capo lo impiega.
E poi si trova comunque a dover cancellare cookie e cambiare IP, perche'
quello che sta usando e' segnato fra i cattivi (il che non significa che
la cosa gli viene comunicata, eh! Ma solo che QUALSIASI cosa invii viene
rifiutata ANCHE se azzeccasse la password. "Rifiutato" non vuol dire che
gli compare la scritta "Be so kind to consume excrement and thus expire"
naturalmente - vuol dire che gli compare la scritta "Message accepted" e
non e' vero.
Questo e' un po' un rischio perche' un bot VERAMENTE stupido, vedendo il
message accepted, si frega le mani e manda la valanga. In quel caso, uno
lo blocca a livello di firewall per "pounding". Altrimenti okay, se quei
test falliscono lo sbatti fuori con un messaggio 403, che capiscono pure
i bot piu' imbranati del creato.
La cosa ha l'effetto secondario che, be', un bel po' di spammerbot (e di
hacker intenti a metterli a punto) potrebbe veramente fare salire il tuo
traffic counter ]:-D (_e_ metterti nei guai con Google AdSense).
Una figata sarebbe in home page
	"On line: 2 utenti registrati, 5 ospiti, 1 hacker alla sua
	 19ma labbrata".
pero' cosi' lo aizzi veramente a cercare di defacciarti il sito.
Leonardo pro & contro


 pero' cosi' lo aizzi veramente a cercare di defacciarti il sito.
  Beh, mi pare logico, scusa. Te non ti sentiresti stuzzicato? :-p
  Un'ultima domanda (se son sfacciato dillo che mi offendo): ma il
"mio" sistema (l'operazioncina cioe') e' cosi' tanto insicuro da esser
sconsigliabile in assoluto? Capisco bene che con 5 righe di codice si
fa il bot che risponde alla domanda, ma quante probabilita' ci sono di
venir (soprattutto) trovati e attaccati da un cracker?
  Saluti e ancora grazie,


venir (soprattutto) trovati e attaccati da un cracker?
Basse, parecchio basse. Se tu volessi essere veramente carogna, la domanda
anziche' scriverla nell'HTML, tanto i dati li hai in sessione, la "scrivi"
via ImageString() dentro una PNG di dimensioni appropriate. Cosi' non solo
gli tocca scriversi il codice, ma anche interpretare la PNG ]:-)
Leonardo


> Nel FORM, metti un campo hidden con l'ora corrente T = time().
potresti in alternativa usare una variabile di sessione

 via ImageString() dentro una PNG di dimensioni appropriate. Cosi' non solo
  E' gia' un po' che ci penso a questa cosa... credo che a quel punto
avremmo una buona sicurezza usando un codice semplice semplice. Mi dispiace
solo che sarebbe persa l'accessibilita'. :-o
  Grazie ancora, sei stato davvero gentile. :-)


 dispiace solo che sarebbe persa l'accessibilita'. :-o
Metti nell'alt text dell'immagine lo stesso testo, magari un po' 
incasinato, tipo "1, +, 2.". O qualcosa del genere.
Bye.

 incasinato, tipo "1, +, 2.". O qualcosa del genere.
  Grazie del consiglio. Credo pero' che sia una "protezione" poco
efficace, a meno di non incasinar la stringa talmente tanto da renderla
incomprensibile: un cracker che si fissa sul mio sito al punto di
creare cercare nell'html la domanda "numero operazione numero" non
dovrebbe aver difficolta' a interpretare l'alt. Tutto fa, questo e'
vero, pero'... :-)
  Idea: e se invece di un'operazione uno creasse un db di domande strane
che vanno necessariamente interpretate? Che so "e' bianca, morbida e a
base di latte. Si mette nella pizza assieme al pomodoro" o "vien giu'
dal cielo, si beve e se te la tirano addosso ti bagni tutto". Fossi il
committente del sito, una roba del genere non ce la vorrei manco morto.
Ma dovrebbe funzionare, credo. :-o
  Saluti perplessi,


 Ma dovrebbe funzionare, credo. :-o
Finche` non fai unsito multilingua. ;)
Bye.

 Ma dovrebbe funzionare, credo. :-o
LOL
perch� non:
   cos'� piccolo giallo ed estremamente pericoloso?
S
P
O
I
L
E
R
un canarino con un mitra :D