urisoft Опубликовано 13 Июля 2007 Жалоба Поделиться Опубликовано 13 Июля 2007 Дополнение для 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(); } Данная модификация предлагается "как есть". Советы по доработке будем рады выслушать. Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Рекомендуемые сообщения
Присоединиться к обсуждению
Вы можете ответить сейчас, а зарегистрироваться позже. Если у вас уже есть аккаунт, войдите, чтобы ответить от своего имени.