PHP, Webküche

Spamschutz – eMail UTF-8 kodieren

Die eMail eines Webautors oder -teams gehört eigentlich in jedes Impressum, möglichst verlinkt, so dass der Leser schnelle eine Mail mit seinem Mailprogramm schreiben kann. Leider machen die SPAMer den Websitebetreibern in dieser Hinsicht das Leben schwer und die meisten Websitebetreiber nehmen mittlerweile schon Abstand davon und veröffentlichen nur noch eMail-Adressen ohne @ oder mit bestimmten Kodierungen, die für Maschinen unleserlich sind. Für die Benutzerfreundlichkeit ist das nicht unbedingt ratsam, denn nicht jeder Besucher bzw. kontaktwillige Besucher kennt alle Tricks im Web. Eine kleine Lösung, die ich für recht sinnvoll halt, ist die Kodierung dieses mailto-Link mit UTF-8-Entities.
Weiterlesen

Standard
Tipps, Webküche, WordPress

WP – simpler Spamschutz bei Kommentaren

SPAM
Mit Hilfe einer Checkbox frage ich in meinem Kommentarformular die „willigen Schreiber“ ob sie menschlicher Natur sind. Ich filtere somit die vielen Spammails, die ansonsten bisher ereilt haben. Ich denke, dass es für die Leser nicht sonderlich mehr Aufwand ist, diese kleine Checkbox zu setzen. Außerdem sollte damit das Formular barrierefrei bleiben, hoffe ich, da ich mich in dieser Materie nicht so gut auskenne.

Mich würde interessieren, wie sinnvoll so eine Möglichkeit ist. Vielleicht liest das hier einer der Spam-Profis und kann mir etwas dazu sagen?

Für diejenigen unter euch, die es auf die gleiche Art bewerkstelligen möchten erläutere ich kurz die notwendigen Änderungen.

Achtung:

Für diese Anwendung ist ein Eingriff in die Core-Dateien notwendig und somit ist ein Update weiterhin möglich, man muss nur dann diese Änderung wieder einbauen, insofern diese Dateien vom Update betroffen sind.

Implementierung:

Zu erst bauen wir das zusätzliche Feld in das Kommentarformular. Dazu muss das Template eures Themes bearbeitet werden, in dem Fall meist die comments.php im Theme Ordner ( bei default: /wp-content/themes/default_de/comments.php ).
Zusätzlich integrieren wir noch eine kleine Abfrage, damit wir als eingeloggte User den Haken nicht setzen müssen, sondern der ist schon für uns gesetzt, insofern wir eingeloggt sind.


<p>
<input class="subscribe" type="checkbox" name="spam" id="spam" value="spam" &lt;?php if($comment_author != $user_identity) { echo "checked='checked'";  } ?&gt; />
<label class="subscribe" for="spam">SPAMSCHUTZ, ich bin menschlich? (*)</label>
</p>

Setzt die obigen Zeilen an die Stelle im Formular, also innerhalb von


<form action="... >
...
</form>

, wo die Checkbox erscheinen soll.

Nun müssen wir die wp-comments-post.php in Rootverzeichnis von WP bearbeiten.
Hier hinterlegen wir die Abfrage, ob die Checkbox auch gesetzt ist.


...
$comment_author       = trim($_POST['author']);
$comment_author_email = trim($_POST['email']);
$comment_author_url   = trim($_POST['url']);
// SPAMSCHUTZ, ich bin menschlich?
$comment_author_spam   = trim($_POST['spam']);
$comment_content      = trim($_POST['comment']);

...

if ( '' == $comment_content )
	die( __('Error: please type a comment.') );

// SPAMSCHUTZ, ich bin menschlich?
if ( '' == $comment_author_spam )
	die( __('Fehler: Wenn du menschlich bist, dann setze die Checkbox (Spamschutz).') );

...

setcookie('comment_author_url_' . COOKIEHASH, stripslashes($comment_author_url), time() + 30000000, COOKIEPATH);
// Wenn der Haken vergessen wurde, so soll der Text nach dem Zurueck-Klicken gespeichert bleiben
setcookie('comment_author_spam_' . COOKIEHASH, stripslashes($comment_author_spam), time() + 30000000, COOKIEPATH);

Die Datei wieder hoch laden und der kleine Spamschutz ist fertig.

Im Fall einer WordPress-Installation 2.0.4 sieht der Code der wp-comments-post.php folgendermaßen aus.


<?php
require( dirname(__FILE__) . '/wp-config.php' );

nocache_headers();

$comment_post_ID = (int) $_POST['comment_post_ID'];

$status = $wpdb->get_row("SELECT post_status, comment_status FROM $wpdb->posts WHERE ID = '$comment_post_ID'");

if ( empty($status->comment_status) ) {
	do_action('comment_id_not_found', $comment_post_ID);
	exit;
} elseif ( 'closed' ==  $status->comment_status ) {
	do_action('comment_closed', $comment_post_ID);
	die( __('Sorry, comments are closed for this item.') );
} elseif ( 'draft' == $status-post_status ) {
	do_action('comment_on_draft', $comment_post_ID);
	exit;
}

$comment_author       = trim($_POST['author']);
$comment_author_email = trim($_POST['email']);
$comment_author_url   = trim($_POST['url']);
// SPAMSCHUTZ, ich bin menschlich?
$comment_author_spam  = trim($_POST['spam']);
$comment_content      = trim($_POST['comment']);

// If the user is logged in
$user = wp_get_current_user();
if ( $user->ID ) :
	$comment_author       = $wpdb->escape($user->display_name);
	$comment_author_email = $wpdb->escape($user->user_email);
	$comment_author_url   = $wpdb->escape($user->user_url);
else :
	if ( get_option('comment_registration') )
		die( __('Sorry, you must be logged in to post a comment.') );
endif;

$comment_type = '';

if ( get_settings('require_name_email') && !$user->ID ) {
	if ( 6 > strlen($comment_author_email) || '' == $comment_author )
		die( __('Error: please fill the required fields (name, email).') );
	elseif ( !is_email($comment_author_email))
		die( __('Error: please enter a valid email address.') );
}

if ( '' == $comment_content )
	die( __('Error: please type a comment.') );

// SPAMSCHUTZ, ich bin menschlich?
if ( '' == $comment_author_spam )
	die( __('Fehler: Wenn du menschlich bist, dann setze die Checkbox (Spamschutz).') );

$commentdata = compact('comment_post_ID', 'comment_author', 'comment_author_email', 'comment_author_url', 'comment_content', 'comment_type', 'user_ID');

$comment_id = wp_new_comment( $commentdata );

if ( !$user->ID ) :
	$comment = get_comment($comment_id);
	setcookie('comment_author_' . COOKIEHASH, $comment->comment_author, time() + 30000000, COOKIEPATH, COOKIE_DOMAIN);
	setcookie('comment_author_email_' . COOKIEHASH, $comment->comment_author_email, time() + 30000000, COOKIEPATH, COOKIE_DOMAIN);
	setcookie('comment_author_url_' . COOKIEHASH, clean_url($comment->comment_author_url), time() + 30000000, COOKIEPATH, COOKIE_DOMAIN);
	setcookie('comment_author_spam_' . COOKIEHASH, clean_url($comment->comment_author_spam), time() + 30000000, COOKIEPATH, COOKIE_DOMAIN);
endif;

$location = ( empty( $_POST['redirect_to'] ) ) ? get_permalink( $comment_post_ID ) : $_POST['redirect_to']; 

wp_redirect( $location );

?>
Standard