Форма обратной связи с использованием AJAX и с защитой от спама с помощью COOKIES

Краткий рассказ о переделывании wordpress-плагина Simple Contact Form: отключении визуальной капчи и подключении неявной проверки на робота в виде Cookies (используя идеи плагина Cookies For Comments).

План действий:
1. Отключить визуальную, текстовую капчу.
2. Подлкючить капчу на Cookies.
3. Протестировать.

1.1. Убираем поля для капчи в форме, файл simple-contact-form.php:

<div style='padding-top:4px;' class="gcf_title"> Enter_your_message </div>
	<div>
	<textarea name="gcf_message" class="gcftextarea" rows="3" id="gcf_message"></textarea>
	</div>
	<!--<div style='padding-top:4px;' class="gcf_title"> Enter below security code </div>
	<div>
	<input name="gcf_captcha" class="gcftextbox" type="text" id="gcf_captcha" maxlength="6">
	</div>
	<div style='padding-top:4px;'>
	<img src="<?php echo get_option('siteurl'); ?>/wp-content/plugins/simple-contact-form/captcha.php?width=100&height=30&characters=5" />
	</div>-->

1.2. Комментируем все строки обработки капчи в функциях gcf_submit(obj,url) и gcfContents(), а также меняем код формирования строки str (отправляемой на обработку на серверный скрипт simple-contact-save.php) в файле simple-contact-form.js:

	// ...
	_e=document.getElementById("gcf_email");
	_n=document.getElementById("gcf_name");
	_m=document.getElementById("gcf_message");
	//_c=document.getElementById("gcf_captcha");
	// ...
	/* 	else if(_c.value=="")
	{
		alert("Please enter enter below security code.");
		_c.focus();
		return false;    
	} */
	// ...
	var str = "gcf_name=" + encodeURI( document.getElementById("gcf_name").value ) + "&gcf_email=" + encodeURI( document.getElementById("gcf_email").value ) + "&gcf_message=" + encodeURI( document.getElementById("gcf_message").value );

2.1. Добавляем функцию создания абстрактного ключа get_cfc_key() файл simple-contact-form.php:
TODO: протестировать неиспользование проверки if(current_user_can('edit_plugins')).

function get_cfc_key() {
	if( function_exists( 'get_site_option' ) ) {
		$cfc_key = get_site_option( 'cfc_key' );
	} else {
		$cfc_key = get_option( 'cfc_key' );
	}
	if( !$cfc_key ) {
		if( current_user_can('edit_plugins') ) {
			$cfc_key = md5( time() );
			if( function_exists( 'add_site_option' ) ) {
				$cfc_key = add_site_option( 'cfc_key', $cfc_key );
			} else {
				$cfc_key = add_option( 'cfc_key', $cfc_key );
			}
		} else {
			return;
		}
	}
	return $cfc_key;
}

2.2. Вносим соответствующие изменения в функцию gCF():

// ...
$cfc_key = get_cfc_key(); // получение значения ключа
// ...
<link rel="stylesheet" href="<?php echo trailingslashit( get_option( 'siteurl' ) ) . $cfc_key . '.css?t=' . mt_rand(); ?>" type="text/css" media="screen" /> // генерируем CSS-файл для дальнейшей проверки его наличия в коде страницы
// ...

2.3. Вносим изменения в текст функции gCF_widget_init():

// ...
if(function_exists('register_widget_control')) 
	{
		register_widget_control(array('Simple contact form', 'widgets'), 'gCF_control', 400, 400);
	} 
	$cfc_key = get_cfc_key();
	if( strpos( $_SERVER[ 'REQUEST_URI' ], $cfc_key . '.css' ) ) { // проверяем наличие CSS-файла
                if( !isset( $_COOKIE[ $cfc_key ] ) )
						$_SESSION['cfc_key'] = $cfc_key;
                        @setcookie( $cfc_key, 1, time()+604800, '/' );
                header("Content-type: text/css");
		define( 'DONOTCACHEPAGE', 1 ); // don't let wp-super-cache cache this page.
		die();
	}
// ...

2.4. Меняем суть обработки пришедшего при помощи Ajax запроса в файле simple-contact-save.php:

$gCF_abspath = dirname(__FILE__);
$gCF_abspath_1 = str_replace('wp-content/plugins/simple-contact-form', '', $gCF_abspath);
$gCF_abspath_1 = str_replace('wp-content\plugins\simple-contact-form', '', $gCF_abspath_1);
require_once($gCF_abspath_1 .'wp-config.php');
$cfc_key = get_option('cfc_key');
$gcf_table = get_option('gCF_table');
$gcf_name = $_POST['gcf_name'];
$gcf_email = $_POST['gcf_email'];
$gcf_message = $_POST['gcf_message'];
if (isset($_COOKIE[$cfc_key])){	
	$sql = "insert into $gcf_table"
		. " set `gCF_name`='" . mysql_real_escape_string(trim($gcf_name))
		. "', `gCF_email`='" . mysql_real_escape_string(trim($gcf_email))
		. "', `gCF_message`='" . mysql_real_escape_string(trim($gcf_message))
		. "', `gCF_ip`='" . $_SERVER['REMOTE_ADDR']
		. "', `gCF_date`=NOW();";
		$wpdb->get_results($sql);
	echo 'Сообщение отправлено.';
	}
else 
	{
	echo 'Сообщение не отправлено.';
	}

Также в этот скрипт можно добавить функцию отправки сообщение на почту, используя WordpPress-функцию для отправки почты wp_mail. Вставить ее примерно в таком виде <?php wp_mail('me@example.net', 'Сообщение из формы контактов', $gcf_message); ?>.

3. Тестирование и принцип работы:
Протестировать работу формы вы можете на странице категории «Вопрос-Ответ», например, задав вопрос.

Форма должна отработать так:
1. При формировании страницы с виджетом формы в ее коде появляется ссылка на тестовый CSS-файл с ключем в имени.
2. Если 1-ый пункт выполнился то также создался файл Cookies с ключом в теле и недельным сроком действия.
3. При заполнении формы контактов и нажатии кнопку отправить AJAX отправляет данные на файл обработки в котором проверяется ключ в теле одного из Cookies, относящегося к сайту.

Если кому-нибудь понадобиться готовая сборка измененного плагина напишите в комментариях. Если получиться отправить сообщение с помощью робота также напишите.

Комментариев: 2

  • 29.11.2012 Кирилл:

    Здравствуйте. А можно эту форму к Joomla прикрутить?

    • 29.11.2012 Кирилл:

      Привет, думаю в каталоге расширений Joomla сейчас есть более свежие, и, возможно более технологичные аналоги.


Добавление комментария:

 css.php