Kategoriler
Wordpress

WordPress Yorum Güvenliği, Spam’a Son

wplogoblue-stacked-rgbWordPress blogu yorum kısımlarından gelen spam mesajlar bazen canımızı sıkabiliyor. Captcha kodları kullanıcıyı sıkabiliyor veya zor ve okunamaz karakterler gelebiliyor. Bu yüzden kullanıcıya basit bir toplama işlemi sorarak, sistemimizi korumalı bir hale getirmemiz gerekiyor. Maalesef şuan böyle bir eklenti yazacak durumda değilim ama basit 2 kod değiştirerek bunu kolay bir şekilde yapabiliyoruz.

Lütfen adımları dikkatli takip edin ve belirtilen 2 dosyada değişim yapmadan önce yedek almayı unutmayın.

Temamız içinde comment.php dosyasında uygun bir yere bunu ekliyoruz.

<?php
@session_start(); // Session Başlat ve hata vermemesi için @ koyduk.

    $number1 = rand(1,9); // 1.Sayı
    $number2 = rand(1,9); // 2.Sayı
    $sum = $number1+$number2; // Sayıları Topla
    $_SESSION['security_question'] = "$sum";// Session'a Ata
	echo ''.$number1.' + '.$number2.' işleminin cevabı?';
?>

<input type="text" placeholder="Cevabı buraya yazınız" name="security_question" autocomplete="off" size="5">

Php kodları arasında bulunan kısımda, @ işareti koyarak session komutunun verebileceği hatayı ekrandan kaldırdık. ?> ‘dan sonra ki kısımda ise, sonuç kısmını alacağımız bir input koyduk.

Şimdi buradan gelen değeri gönderdiğimizde, bir ekranda kontrol etmemiz gerekiyor. WordPress’i kurduğunuz dizine gelip  wp-comments-post.php dosyasını açıyoruz. Önce yedek alıyoruz ve ardından dosya içeriğini tamamen silerek, aşağıda bulunan kodu yapıştıyoruz.

<?php
/**
 * Handles Comment Post to WordPress and prevents duplicate comment posting.
 *
 * @package WordPress
 */

if ( 'POST' != $_SERVER['REQUEST_METHOD'] ) {
	header('Allow: POST');
	header('HTTP/1.1 405 Method Not Allowed');
	header('Content-Type: text/plain');
	exit;
}

session_start();

// Quiz kontrol ediliyor
if($_SESSION['security_question'] != $_POST['security_question']) {
    echo 'Basit bir toplama islemini yanlis yapmis olamazsin degil mi? <br/> <a href="javascript:history.go(-1)">Geri Don</a> ';
    die(); }
else {

/** Sets up the WordPress Environment. */
require( dirname(__FILE__) . '/wp-load.php' );

nocache_headers();

$comment_post_ID = isset($_POST['comment_post_ID']) ? (int) $_POST['comment_post_ID'] : 0;

$post = get_post($comment_post_ID);

if ( empty($post->comment_status) ) {
	do_action('comment_id_not_found', $comment_post_ID);
	exit;
}

// get_post_status() will get the parent status for attachments.
$status = get_post_status($post);

$status_obj = get_post_status_object($status);

if ( !comments_open($comment_post_ID) ) {
	do_action('comment_closed', $comment_post_ID);
	wp_die( __('Sorry, comments are closed for this item.') );
} elseif ( 'trash' == $status ) {
	do_action('comment_on_trash', $comment_post_ID);
	exit;
} elseif ( !$status_obj->public && !$status_obj->private ) {
	do_action('comment_on_draft', $comment_post_ID);
	exit;
} elseif ( post_password_required($comment_post_ID) ) {
	do_action('comment_on_password_protected', $comment_post_ID);
	exit;
} else {
	do_action('pre_comment_on_post', $comment_post_ID);
}

$comment_author       = ( isset($_POST['author']) )  ? trim(strip_tags($_POST['author'])) : null;
$comment_author_email = ( isset($_POST['email']) )   ? trim($_POST['email']) : null;
$comment_author_url   = ( isset($_POST['url']) )     ? trim($_POST['url']) : null;
$comment_content      = ( isset($_POST['comment']) ) ? trim($_POST['comment']) : null;

// If the user is logged in
$user = wp_get_current_user();
if ( $user->exists() ) {
	if ( empty( $user->display_name ) )
		$user->display_name=$user->user_login;
	$comment_author       = $wpdb->escape($user->display_name);
	$comment_author_email = $wpdb->escape($user->user_email);
	$comment_author_url   = $wpdb->escape($user->user_url);
	if ( current_user_can('unfiltered_html') ) {
		if ( wp_create_nonce('unfiltered-html-comment_' . $comment_post_ID) != $_POST['_wp_unfiltered_html_comment'] ) {
			kses_remove_filters(); // start with a clean slate
			kses_init_filters(); // set up the filters
		}
	}
} else {
	if ( get_option('comment_registration') || 'private' == $status )
		wp_die( __('Sorry, you must be logged in to post a comment.') );
}

$comment_type = '';

if ( get_option('require_name_email') && !$user->exists() ) {
	if ( 6 > strlen($comment_author_email) || '' == $comment_author )
		wp_die( __('<strong>ERROR</strong>: please fill the required fields (name, email).') );
	elseif ( !is_email($comment_author_email))
		wp_die( __('<strong>ERROR</strong>: please enter a valid email address.') );
}

if ( '' == $comment_content )
	wp_die( __('<strong>ERROR</strong>: please type a comment.') );

$comment_parent = isset($_POST['comment_parent']) ? absint($_POST['comment_parent']) : 0;

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

$comment_id = wp_new_comment( $commentdata );

$comment = get_comment($comment_id);
do_action('set_comment_cookies', $comment, $user);

$location = empty($_POST['redirect_to']) ? get_comment_link($comment_id) : $_POST['redirect_to'] . '#comment-' . $comment_id;
$location = apply_filters('comment_post_redirect', $location, $comment);

wp_safe_redirect( $location );
exit;
}

Kaydedip, yorum kısmını kontrol edelim.

Not :  Wordpress 3.5.1 sürümü için denenmiştir. Lütfen işlem yapmadan önce iki dosyanın da yedeğini alın. Twentyten gibi temalarda yorum kısmı comments.php de bulunmaz, eğer comments.php de kodları göremiyorsak, wp-includes/comment-template.php dosyasına bakmamız gerekiyor.