Перейти к контенту

[+] 2.0pb7 - Защитный код для отправки комментариев гостями


Рекомендуемые сообщения

Дополнение для mJournal v2.0pb7: Защитный код для отправки комментариев гостями

Автор: replicant

 

--------------------------

Файл comment_new.php

 

После:

 

		// --------------------------------
	//  New comment
	// --------------------------------
	function new_comment()
	{
			global $ibforums, $DB, $journal, $std;

 

Добавить:

 

			  //---------------
		  //  Antibot
		  //---------------
		  session_start();
		  session_name('sec_code');
		  $sec_code_session = $_SESSION['sec_code_session'];
		  if((isset($_POST['code']))&&($_POST['code']!= $sec_code_session))
		  {
				  $journal->err_journal($ibforums->lang['j_err_code']);
		  }

 

Файл post_function.php

 

После:

 

				// Name field
			$this->html_name_field(&$data);

 

Добавить:

				$this->html_code_field(&$data);

 

После:

 

		// -------------------------------
	// Name filed
	// -------------------------------

	function html_name_field(&$data)
	{
.......
	}

 

Добавить:

 

//---------------------
//  Antibot
//---------------------

function html_code_field(&$data)
{
	global $ibforums, $journal;
			if ($ibforums->member['id']) return;
	{
		session_start();
		session_name('sec_code');
		$data['_CODE_FIELD'] = $journal->skin->html['q_reply']->codeField_unreg($_SESSION['sec_code_session']);

	}
}

 

 

После:

 

				// Make comment array
			$rpost = array('post'			=> $post,
									   'ip_address'  => ip2long($ibforums->input['IP_ADDRESS']));

 

Добавить:

 

// Session fix - чтобы избежать возможности многократного повтора комментария из формы предпросмотра без ввода кода безопасности, например, в Opera

 

			$snm=session_name();
		if(isset($_GET[$snm])) if(strlen($_GET[$snm])!=32) unset($_GET[$snm]);
		if(isset($_POST[$snm])) if(strlen($_POST[$snm])!=32) unset($_POST[$snm]);
		if(isset($_COOKIE[$snm])) if(strlen($_COOKIE[$snm])!=32) unset($_COOKIE[$snm]);
		if(isset($PHPSESSID)) if(strlen($PHPSESSID)!=32) unset($PHPSESSID);
		$_SESSION['sec_code_session']='drops';
		session_start();
		session_name('sec_code');
		if(isset($_SESSION['sec_code_session']))
		{
		unset($_SESSION['sec_code_session']);
		}

 

// Session fix за корректность данного куска кода ручаться не могу, но это работает, возможно данный метод можно реализовать и проще

 

 

Файл journal.php

 

После:

 

		// ---------------------------------------------------------
	// Redirect screen
	// ---------------------------------------------------------

function redirect_screen($text="", $url="")
{
		global $ibforums, $print, $std;

 

Добавить:

 

// Session fix

			$sn=session_name();
		if(isset($_GET[$sn])) if(strlen($_GET[$sn])!=32) unset($_GET[$sn]);
		if(isset($_POST[$sn])) if(strlen($_POST[$sn])!=32) unset($_POST[$sn]);
		if(isset($_COOKIE[$sn])) if(strlen($_COOKIE[$sn])!=32) unset($_COOKIE[$sn]);
		if(isset($PHPSESSID)) if(strlen($PHPSESSID)!=32) unset($PHPSESSID);
		$_SESSION['sec_code_session']='drop';
		session_start();
		session_name('sec_code');
		if(isset($_SESSION['sec_code_session']))
		{
			unset($_SESSION['sec_code_session']);
		}

// Session fix

------------------------------------------------------------------------------

Открываем \lang\{dir}\lang_post.php

 

Находим:

guest_name => "Введите Ваше имя",

 

После добавляем:

 

code_enter => "Введите код",

 

--------------------------------------------------------------------------------

Открываем \lang\{dir}\lang_journal.php

 

Находим:

 

'j_err_comm_close' => "<span class='alert'>Ошибка создания нового комментария.</span><br /><br />Возможно Вам запрещено комментировать записи в данном дневнике.<br />Для выяснения причины обратитесь к администрации или к хозяину дневника.",

 

После добавляем:

 

'j_err_code' => "<span class='alert'>Ошибка создания нового комментария.</span><br /><br />Неверно введен код безопасности, попробуйте снова.",

--------------------------------------------------------------------------------

Файл skin_q_reply.php

 

После:

{$data['_TRACK_CHECK']}

</td>

</tr>

{$data['_UPLOAD_FIELD']}

 

Добавить:

{$data['_CODE_FIELD']}

 

После:

{$data['_TRACK_CHECK']}

</td>

</tr>

{$data['_MOOD_AND_MUSIC']}

{$data['_UPLOAD_FIELD']}

 

Добавить:

{$data['_CODE_FIELD']}

 

 

В самом конце файла добавить новую функцию

 

//=============
// codeField_unreg
//=============

function codeField_unreg($data="") {
global $ibforums, $journal;
$IPBHTML = "";
//--starthtml--//


$IPBHTML .= <<<EOF
<tr><td class='post'>{$ibforums->lang['code_enter']}<br>
<img src="{PATH}antibot.php" border='0'>
</td><td class='post'>
<input type='text' name='code'>
</td></tr>
EOF;

//--endhtml--//
return $IPBHTML;
}

 

{PATH} до файла antibot.php подправить под себя

 

Для примера приведу целиком код файла antibot.php, который можно взять за основу для кода безопасности. Вы можете использовать алгоритм CAPTCHA.RU, Proger.in.ua или любой другой, который вам понравится.

 

<?php
/*
Назначение: Генерация изображения со случайным кодом
*/

class genrandomimage
{
var $lenght = 6; // Длина строки
var $string = ''; // Результирующая строка

# Генерация строки
function genstring()
{
$chars = array ('1', '2', '3', '4', '5', '6', '7', '8', '9', '0');
$result_string = '';

for($i = 0; $i < $this -> lenght; $i++)
{
$random_char = mt_rand( 0, ( count ( $chars ) - 1 ) );
$result_string .= $chars[$random_char];
}
$this -> string = $result_string;
}

# Генерация изображения
function genimage()
{
$im = imagecreate( 10 * $this -> lenght + 5, 20 );

$gray = imagecolorallocate( $im, 228, 228, 228 );
$black_1 = imagecolorallocate( $im, 150, 150, 150 );
$black = imagecolorallocate( $im, 0, 0, 0 );
$white = imagecolorallocate( $im , 255, 255, 255 );
$string = imagecolorallocate( $im, 90, 90, 90 );

/* Генерация шума */
for($i = -2; $i < ceil ( ( 10 * $this -> lenght ) / 5 ); $i++)
{
imageline( $im, $i * 5, 20, $i * 5 + 20, 0, $black_1 );
}
for($i = -2; $i < ceil ( (10 * $this -> lenght) / 5 ); $i++)
{
imageline( $im, $i * 5+20, 20, $i * 5 , 0, $white );
}
/* Конец генерации шума */

# Рисуем строку на картинке
imagestring( $im, 5, 6, 2, $this -> string, $string );

# Рамка
imageline( $im, 0, 0, 10*$this -> lenght + 5, 0, $black );
imageline( $im, 0, 19, 10*$this -> lenght + 5, 19, $black );
imageline( $im, 0, 0, 0, 20, $black );
imageline( $im, 10*$this -> lenght + 4, 0, 10*$this -> lenght + 4, 20, $black );

header('Content-type: image/png');
imagepng($im);
}

}


session_start();
session_name('sec_code');

$im = new genrandomimage ();
$im->genstring();

$_SESSION['sec_code_session'] = $im->string;

$im->genimage();

?>

 

 

 

 

Проверка физического клика по кнопке и запрет постинга комментариев без поддержки JS в браузере.

(помогает в борьбе с роботизированными ответами, даже в случае с выключенным кодом безопасности)

 

Открыть skin_q_reply.php

 

Редактировать function ValidateForm()

 

function ValidateForm() {

	var m = /^s*(.+?)s*$/im;
	var msg = document.REPLIER.Post.value.match(m);
   // начало проверки нажатия кнопки
	var form_bool = document.getElementById('REPLIER_action_bool').value;
   // конец
	if (msg != null) {
			MessageLength = msg[1].length;
	} else {
			MessageLength = 0;
	}
	errors = "";
	// начало вставки
	if (!form_bool*1) {
		   errors = "{$ibforums->lang['js_no_click']}"; //в lang файл добавить перевод на ваше усмотрение
	}
	// конец вставки
	if (skip_check != 0) {
			document.REPLIER.submit.disabled = true;
			return true;
	}
	if (MessageLength < 2) {
			 errors = "{$ibforums->lang['js_no_message']}";
	}
	if (MessageMax !=0) {
			if (MessageLength > MessageMax) {
					errors = "{$ibforums->lang['js_max_length']} " + MessageMax + " {$ibforums->lang['js_characters']}. {$ibforums->lang['js_current']}: " + MessageLength;
			}
	}
	if (errors != "") {
			alert(errors);
			return false;
	} else {
			document.REPLIER.submit.disabled = true;
			return true;
	}
}

 

Добавить после еще одну:

 

function ReplaseHref() {
 var act = document.REPLIER.action;
 document.getElementById('REPLIER_action_bool').value = '1';
 act = document.getElementById('REPLIER_action').value;
 document.REPLIER.Post2.value = document.REPLIER.Post.value;
}

 

В самой форме (form) action сделать пустым:

action=""

 

Добавить 2 скрытых поля:

<input type='hidden' value='{$journal->base_url}' id='REPLIER_action' />
<input type='hidden' value='0' id='REPLIER_action_bool' />

 

Тег <textarea>, содержащий само сообщение, заменить на два нижеследующих:

 

<textarea class='input' cols='70' rows='15' name='Post' tabindex='3' style='width:99%' >{$data['post']}</textarea><textarea name='Post2' style='display:none' >[<_empty>]</textarea>

 

В кнопку отправки (input submit) сообщения чуть ниже добавить:

 

onclick='ReplaseHref()'

 

--------------------------------------------------------------------------------

Открыть comment_new.php

 

Найти:

// Check post

 

if (!$skip_check_error)

{

 

Добавить иф:

if ($_POST['Post2'] == "[<_empty>]")
{
header ("Location: http://URL/journal.php"); // куда послать бота, куда-нибудь подальше! :)
exit();
}

 

 

Данная модификация предлагается "как есть". Советы по доработке будем рады выслушать.

Ссылка на комментарий
Поделиться на других сайтах

Присоединиться к обсуждению

Вы можете ответить сейчас, а зарегистрироваться позже. Если у вас уже есть аккаунт, войдите, чтобы ответить от своего имени.

Гость
Ответить в этой теме...

×   Вы вставили отформатированный текст.   Удалить форматирование

  Допустимо не более 75 смайлов.

×   Ваша ссылка была автоматически заменена на медиа-контент.   Отображать как ссылку

×   Ваши публикации восстановлены.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

Зарузка...
×
×
  • Создать...

Важная информация

Находясь на нашем сайте, вы соглашаетесь на использование файлов cookie, а также с нашим положением о конфиденциальности Политика конфиденциальности и пользовательским соглашением Условия использования.