Ultimamente vegamami (forum - bbpress) è bersagliato dallo spam (anche se prontamente fermato da akismet) e noto che tutto questo spam è nel database di "Stop Forum Spam" - PS: http://www.stopforumspam.com/usage
Così mi è venuto in mente quando su smf avevo un plugin che mi faceva il check sul loro database ed ho pensato: "perché non crearlo anche per wordpress?"
-
Manca la parte admin, è solo una bozza, e ancora non fa alcuna query al loro database, ma ciò che non capisco è perché non popola i campi dell'input con i dati dell'eventuale spammer (commentatore)
Codice PHP:
<?php
// Questo viene inserito nel form dei commenti e dovrebbe prendersi i valori dell'utente (ma è ancora in bozza - voglio prima capire perché non riempie i campi) :/
function stopforumspam_comment_form()
{
check_comment( $author, $email, $url, $comment, $user_ip, $user_agent, $comment_type );
global $wpdb;
echo "\n\t<!-- Stop Forum Spam Check Start -->
<input type=\"hidden\" name=\"sfs_ip\" value=\"".$user_ip."\" />
<input type=\"hidden\" name=\"sfs_author\" value=\"".$author."\" />
<input type=\"hidden\" name=\"sfs_email\" value=\"".$email."\" />
<!-- Stop Forum Spam Check End -->\n";
}
// Qui poi vedrò di fare la query al database e quindi gestire un errore bloccante anziché stampare semplicemente il risultato :P
function stopforumspam_check_query()
{
if(isset($_POST['sfs_ip']) && !isset($_POST['sfs_author']) && !isset($_POST['sfs_email']))
{
echo "http://www.stopforumspam.com/api?ip=*.*.*.*";
}
elseif(!isset($_POST['sfs_ip']) && !isset($_POST['sfs_author']) && isset($_POST['sfs_email']))
{
echo "http://www.stopforumspam.com/api?email=test@mail.it";
}
elseif(!isset($_POST['sfs_ip']) && isset($_POST['sfs_author']) && !isset($_POST['sfs_email']))
{
echo "http://www.stopforumspam.com/api?username=myuser";
}
else
die("Bloccato da stop forum spam");
}
}
add_action('comment_form', 'stopforumspam_comment_form');
add_filter('pre_comment_approved', 'stopforumspam_check_query');
?>
--
Edit: ok, son riuscito a popolare i campi così:
Codice PHP:
function stopforumspam_comment_form()
{
$commenter = wp_get_current_commenter();
echo "\n\t<!-- Stop Forum Spam Check Start -->
<input type=\"\" name=\"sfs_ip\" value=\"".$_SERVER['REMOTE_ADDR']."\" />
<input type=\"\" name=\"sfs_author\" value=\"" . esc_attr( $commenter['comment_author'] ) . "\" />
<input type=\"\" name=\"sfs_email\" value=\"" . esc_attr( $commenter['comment_author_email'] ) . "\" />
<!-- Stop Forum Spam Check End -->\n";
}
Ora tocca solo fare il controllo sull'xml al database (poi penserò alla pagina di configurazione) :)
-
Allora, adesso ho il link così strutturato (esempio):
-
Come faccio per estrapolare con uno di questi formati (la scelta non manca) un risultato che mi dica se ha trovato ip, mail o username nel database? :)
-
Codice PHP:
function wp_stopforumspam_check_query()
{
$link = "http://www.stopforumspam.com/api?ip=".$sfsip."&username=".$sfsauthor."&email=".$sfsemail."&f=***"; // fORMATO DA DECIDERE
if(***)
{
die("bloccato da wp stopforumspam perché abbiamo trovato la tua mail e/o il tuo nick e/o il tuo ip nel loro database");
}
}
-
Riedit: Un commento spam appena ricevuto su bbpress (fermato comunque da akismet) nonostante oggi ho installato recaptcha (sarebbe stato fermato da questo mio plugin): http://www.stopforumspam.com/api?ema...=46.119.121.99
-
Edit: ok, ho una bozza funzionante:
Codice PHP:
function wp_stopforumspam_comment_form()
{
$commenter = wp_get_current_commenter();
echo "\n\t<!-- WP Stop Forum Spam Check Start -->
<input type=\"hidden\" name=\"sfs_author\" value=\"".esc_attr( $commenter['comment_author'] )."\" />
<input type=\"hidden\" name=\"sfs_email\" value=\"".esc_attr( $commenter['comment_author_email'] )."\" />
<input type=\"hidden\" name=\"sfs_ip\" value=\"".getRealIpAddr()."\" />
http://www.stopforumspam.com/api?username=".esc_attr( $commenter['comment_author'] )."&email=".esc_attr( $commenter['comment_author_email'] )."&ip=".getRealIpAddr()."&f=json
<!-- WP Stop Forum Spam Check End -->\n";
}
function wp_stopforumspam_check_query()
{
$commenter = wp_get_current_commenter();
$link = json_decode(file_get_contents("http://www.stopforumspam.com/api?username=".esc_attr( $commenter['comment_author'] )."&email=".esc_attr( $commenter['comment_author_email'] )."&ip=".getRealIpAddr()."&f=json"));
if((($link->username->appears) == 1) || (($link->email->appears) == 1) || (($link->ip->appears) == 1))
{
die("Blocked by stop forum spam: http://www.stopforumspam.com/");
}
}
Però non prende i parametri dal form al primo avvio (sembra li peschi dai cookie e quindi il primo commento passerebbe comunque ) e una bloccato la prima volta non importa che si cambino i dati nel form... Rimangono i dati dai cookie e quindi il blocco
Vedrò di risolvere questi problemi e il plugin è pronto! Chi volesse testarlo: http://www.darkwolf.it/wp-stop-forum-spam.zip