row()) { $pos = mb_stripos($text, $mat->row['word'], 0, "utf-8"); if ($pos !== false && not_mat($text, $mat->row['word'], $pos) == false) { return "y"; } } return "n"; } ################################################# // Проверка на спорные нематерные слова function not_mat($text, $word, $pos) { $qr = new Query("select * from mat_not where instr(word, '$word')"); while ($qr->row()) { $dif = $pos - mb_stripos($qr->row['word'], $word, 0, "utf-8"); if ($dif < 0) { $dif = 0; } if (strcasecmp(mb_substr($text, $dif, mb_strlen($qr->row['word'], "utf-8"), "utf-8"),$qr->row['word']) === 0) { return true; } } return false; } ################################################# ?> $lcase) { return "Пожалуйста, отключите клавишу CAPS LOCK, отпустите клавишу SHIFT и напишите сообщение без чрезмерного использования ЗАГЛАВНЫХ БУКВ."; } else { return ; } } ################################################################### // Ищем похожие сообщения или сообщения со ссылками от этого же пользователя function CheckAntispam($type) { $time = time() - 60*10; // ищем сообщения за последние 10 минут $date = date("Y-m-d H:i:s", $time); $post_list = array(); $qr = new Query("select * from `$type` where ip='".Ctrl::GetIP()."' and text='$this->text' and post_date>'$date' and id<>'$this->id'"); if ($qr->num() >= 2) { while ($qr->row()) { $post_list[] = $qr->row['id']; } } elseif ($this->CheckAntilink($this->text)) { // если не нашли - ищем ссылки в последних сообщениях $qr = new Query("select * from `$type` where ip='".Ctrl::GetIP()."' and post_date>'$date' and id<>'$this->id' order by id desc"); if ($qr->num() > 0) { while ($qr->row()) { if ($this->CheckAntilink($qr->row['text'])) { $post_list[] = $qr->row['id']; } } } } // если нашли 2 и более сообщений if (count($post_list) >= 2) { $qr = new Query("select * from `$type` where id in (".implode(",",$post_list).")"); while ($qr->row()) { // Добавляем в антимат $insert = new Query("insert into antimat (type, post_id, ip, hash, reason, date) values ('$type', '".$qr->row['id']."', '".Ctrl::GetIP()."', rand(), 'СПАМ', NOW())"); // Обновляем сообщение $update = new Query("update `$type` set mat='y' where id=".$qr->row['id']); } return true; } else { return false; } } ####################################################### // Проверяем текст на предыдущий бан function CheckBanText() { if ($this->text) { $date = date("Y-m-d H:i:s", time() - 86400); $qr = new Query("select * from ban_text where text='$this->text' and post_date>'$date'"); if ($qr->row()) { return true; } } return false; } ####################################################### // Проверяем имя на бан function CheckBanName() { if ($this->name) { $qr = new Query("select * from ban where name='$this->name'"); if ($qr->row()) { return true; } } return false; } ####################################################### // Ищем ссылки в тексте function CheckAntilink($aText) { $pattern = "((http:\/\/)?(www\.)?([^\/\s\(\)]+\.(com|net|org|mil|edu|gov|arpa|info|biz|inc|name|[a-zрф]{2})(?!\w+)))"; // Находим всё, что похоже на ссылку, и проверяем является ли это e-mail-ом if (preg_match_all("#".$pattern."#ui", $aText, $match, PREG_SET_ORDER)) { for ($i = 0; $i < count($match); $i++) { if (strpos($match[$i][1], "@") === false) { return true; } } } return false; } ####################################################### // Бан за буйное раздвоение - 3 ника за 1 час function CheckMultiName($type) { $mult = new Query("select distinct name from $type where ip='".Ctrl::GetIP()."' and mat='n' and name<>'$this->name' and post_date>'".date("Y-m-d H:i:s", time() - 3600)."' and id<>'$this->id'"); if ($mult->num() >= 2) { while ($mult->row()) { $qr = new Query("select * from $type where ip='".Ctrl::GetIP()."' and mat='n' and name='".$mult->row['name']."' and post_date>'".date("Y-m-d H:i:s", time() - 3600)."' and id<>'$this->id'"); while ($qr->row()) { // Добавляем в антимат $insert = new Query("insert into antimat (type, post_id, ip, hash, reason, date) values ('$type', '".$qr->row['id']."', '".Ctrl::GetIP()."', rand(), 'РАЗДВОЕНИЕ: ".($mult->num()+1)." ника', NOW())"); // Обновляем сообщение $update = new Query("update `$type` set mat='y' where id=".$qr->row['id']); } } return true; } else { return false; } } ####################################################### # Добавляем текст в список заблокированных function InsertBanText($aCategory, $aObjectID) { $qrInsert = new Query("insert into ban_text (category, object_id, name, email, city, text, post_date, ip, browser) values ('".$aCategory."', '".$aObjectID."', '".$this->name."', '".$this->email."', '".$this->city."', '".$this->text."', NOW(), '".Ctrl::GetIP()."', '".Ctrl::GetBrowser()."')"); } ################################################################### # Проверяем все пришедшие данные function ValidateData() { $arFields = array("name", "email", "city", "text"); # Принимаем данные foreach ($arFields as $sField) { $this->$sField = isset($_POST['post_'.$sField]) ? Ctrl::CheckString($_POST['post_'.$sField]) : ""; } # Проверка на бан $this->error .= $this->CheckBan(); # Проверка на антимат if ($this->error == "") { $this->error .= $this->CheckAntimat(); } # Удаляем повторяющиемся символы foreach ($arFields as $sField) { $this->$sField = $this->DelRepeat($this->$sField, "!!"); $this->$sField = $this->DelRepeat($this->$sField, "??"); } # Блондинки? if ($this->error == '') { $this->error = $this->CheckBlond($this->text); } // Проверка на двуязычность имени if ($this->error == '' && preg_match("#[а-я]+#ui", $this->name) && preg_match("#[a-z]+#iu", $this->name) ) { $this->error = 'Используйте в имени либо только русские, либо только латинские буквы.'; } // Проверяем e-mail $this->email = preg_replace("#\s+#u", "", $this->email); if ($this->email && Ctrl::CheckEmail($this->email) == false) { $this->email = ''; } if ($this->error == '' && mb_strlen($this->name, "utf-8") > 100) { $this->error = 'Слишком длинное имя. Не более 100 символов.'; } if ($this->error == '' && mb_strlen($this->email, "utf-8") > 100) { $this->error = 'Слишком длинный e-mail. Не более 100 символов.'; } if ($this->error == '' && mb_strlen($this->city, "utf-8") > 100) { $this->error = 'Слишком длинное название города. Не более 100 символов.'; } // В случае бана - сохраняем запись в отдельном логе if ($this->error != '' && mb_strpos($this->error, "Вы не можете принимать активное участие в работе сайта", 0, "utf-8") !== false && preg_match("#[а-я]+#iu", $this->text)) { if (isset($this->hotelID)) { $this->InsertBanText("review", $this->hotelID); } else { $this->InsertBanText($this->category, $this->objectID); } } # Обработка текста if ($this->text) { $this->text = $this->BBCodeToHtml($this->text); $this->text = $this->ClearImgCode($this->text); $this->text = $this->Wrap($this->text, 200); } } ################################################################### # Делаем полную проверку на мат и спам function CheckMat() { $this->mat = antimat($this->name."aaaa".$this->email."aaaa".$this->city."aaaa".$this->title."aaaa".$this->text); if ($this->mat == "n") { // проверяем на спам $this->spam = $this->CheckAntispam("forum"); if ($this->spam) { $this->mat = "y"; $this->matReason = "СПАМ"; } else { // Проверяем текст на предыдущие баны $this->banText = $this->CheckBanText(); if ($this->banText) { $this->mat = "y"; $this->matReason = "БАН ТЕКСТА"; } else { // Проверяем имя на бан $this->banName = $this->CheckBanName(); if ($this->banName) { $this->mat = "y"; $this->matReason = "БАН ИМЕНИ"; } else { // Проверка на спам в статьях if ($this->GetGuestID() == 0 && $this->CheckAntilink($this->text)) { $this->mat = "y"; $this->matReason = "ПОДОЗРЕНИЕ НА СПАМ"; } else { // Бан за буйное раздвоение - 3 ника за 1 сутки $mult = $this->CheckMultiName("forum"); if ($mult) { $this->mat = "y"; $this->matReason = "РАЗДВОЕНИЕ: ".($mult+1)." ника"; } } } } } } } ################################################################### # Проверка на бан function CheckBan() { // Проверяем по IP $ip_array = explode(", ", Ctrl::GetIP()); foreach ($ip_array as $ip) { // Проверка на бан $qr = new Query("select * from ban where ip='$ip' or '$ip' like ip"); if ($qr->row()) { setcookie("gg_bb", $qr->row['hash'], time() + 365*86400, "/"); $qr = new Query("insert into ban_stat (page, ip, browser, date, referer, error, ban_id) values ('".Ctrl::GetURI()."', '".Ctrl::GetIP()."', '".Ctrl::GetBrowser()."', NOW(), '".Ctrl::GetReferer()."', 'ban', '".$qr->row['id']."')"); return "Вы не можете принимать активное участие в работе сайта."; } // Проверка на куку if (isset($_COOKIE['gg_bb']) && $_COOKIE['gg_bb']) { $hash = Ctrl::CheckString($_COOKIE['gg_bb']); $qr = new Query("select * from ban where hash='$hash'"); if ($qr->row()) { $qr = new Query("insert into ban_stat (page, ip, browser, date, referer, error, ban_id) values ('".Ctrl::GetURI()."', '".Ctrl::GetIP()."', '".Ctrl::GetBrowser()."', NOW(), '".Ctrl::GetReferer()."', 'hash', '".$qr->row['id']."')"); return "Вы не можете принимать активное участие в работе сайта."; } } // Првоерка на диапазон $ip_int = sprintf("%u", ip2long(trim($ip))); if ($ip_int > 0) { $qr = new Query("select * from ban where `begin_int`<='$ip_int' and `end_int`>='$ip_int'"); if ($qr->row()) { setcookie("gg_bb", $qr->row['hash'], time() + 365*86400, "/"); $qr = new Query("insert into ban_stat (page, ip, browser, date, referer, error, ban_id) values ('".Ctrl::GetURI()."', '".Ctrl::GetIP()."', '".Ctrl::GetBrowser()."', NOW(), '".Ctrl::GetReferer()."', 'ban', '".$qr->row['id']."')"); return "Вы не можете принимать активное участие в работе сайта."; } } // Проверка на анонимайзер if (stristr(Ctrl::GetBrowser(), "anonymous")) { $qr = new Query("insert into ban_stat (page, ip, browser, date, referer, error) values ('".Ctrl::GetURI()."', '".Ctrl::GetIP()."', '".Ctrl::GetBrowser()."', NOW(), '".Ctrl::GetReferer()."', 'anon')"); return "Вы не можете принимать активное участие в работе сайта, используя прокси-сервер."; } // Проверка на прокси $qr = new Query("select count(*) as c from proxy_list where ip='$ip'"); $qr->row(); if ($qr->row['c']) { $qr = new Query("insert into ban_stat (page, ip, browser, date, referer, error) values ('".Ctrl::GetURI()."', '".Ctrl::GetIP()."', '".Ctrl::GetBrowser()."', NOW(), '".Ctrl::GetReferer()."', 'proxy')"); return "Вы не можете принимать активное участие в работе сайта, используя прокси-сервер."; } // Проверка на браузер $browser = Ctrl::GetBrowser(); if ($browser) { $qr = new Query("select * from ban where browser='$browser'"); if ($qr->row()) { setcookie("gg_bb", $qr->row['hash'], time() + 365*86400, "/"); $qr = new Query("insert into ban_stat (page, ip, browser, date, referer, error, ban_id) values ('".Ctrl::GetURI()."', '".Ctrl::GetIP()."', '".Ctrl::GetBrowser()."', NOW(), '".Ctrl::GetReferer()."', 'ban', '".$qr->row['id']."')"); return "Вы не можете принимать активное участие в работе сайта."; } } } // Проверка на chan.ru if (isset($_COOKIE['gg_ff'])) { $refer = base64_decode($_COOKIE['gg_ff']); if ($refer && (stristr($refer, "4chan.") || stristr($refer, "0chan."))) { $qr = new Query("insert into ban_stat (page, ip, browser, date, referer, error, ban_id) values ('".Ctrl::GetURI()."', '".Ctrl::GetIP()."', '".Ctrl::GetBrowser()."', NOW(), '".Ctrl::GetReferer()."', 'chan', '".$qr->row['id']."')"); return "Вы не можете принимать активное участие в работе сайта."; } } } ################################################################### # Ищем человека в списке ожидающих модерацию антимата function CheckAntimat() { $error = "Ваше предыдущее сообщение ожидает проверки модератором.
До окончания проверки вы не сможете писать новые сообщения.
Извините за доставленные неудобства."; $ips = explode(", ", Ctrl::GetIP()); foreach ($ips as $ip) { if ($ip && ereg("^127\.0", $ip) == false && ereg("^192\.168", $ip) == false && ereg("^10\.", $ip) == false) { $qr = new Query("select * from antimat where instr(ip,'".$ip."')"); if ($qr->row()) { return $error; } } } $hash_cookie = isset($_COOKIE['gcuu']) ? Ctrl::CheckString($_COOKIE['gcuu']) : ""; Ctrl::MySessionStart(); $hash_session = isset($_COOKIE["gsuu"]) ? $_COOKIE["gsuu"] : (isset($_SESSION["gsuu"]) ? $_SESSION["gsuu"] : ""); $hash_session = Ctrl::CheckString($hash_session); if ($hash_cookie || $hash_session) { $qr = new Query("select * from antimat where hash='$hash_cookie' or hash='$hash_session'"); if ($qr->row()) { return $error; } } } ################################################################### # Включен JavaScript? function TestJavaScript($title) { $arTest = array("t1"=>"", "t2"=>"", "t3"=>"", "t4"=>""); foreach ($arTest as $sKey => $sValue) { $arTest[$sKey] = isset($_POST[$sKey]) ? $_POST[$sKey] : 0; } if (($arTest['t2'] != $arTest['t1']*18 + 428) || ($arTest['t3'] != $arTest['t1']*19 + 4361) || ($arTest['t4'] != $arTest['t1']*19 - 54486)) { $this->error = "В вашем браузере отключено выполнение JavaScript, поэтому вы не можете отправить $title."; } #echo $arTest['t2']."
".($arTest['t1']*18 + 428)."

".$arTest['t3']."
".($arTest['t1']*19 + 4361)."

".$arTest['t4']."
".($arTest['t1']*19 - 54486); #exit(); } ################################################################### # Конвертируем BB-коды в html function BBCodeToHtml ($aString) { $aString = preg_replace( "#\[b\](.+?)\[/b\]#is", "\\1", $aString ); $aString = preg_replace( "#\[i\](.+?)\[/i\]#is", "\\1", $aString ); $aString = preg_replace( "#\[u\](.+?)\[/u\]#is", "\\1", $aString ); $aString = preg_replace( "#\[s\](.+?)\[/s\]#is", "\\1", $aString ); // удаляем пустые тэги $aString = preg_replace( "#\[b\]\[/b\]#is", "", $aString ); $aString = preg_replace( "#\[i\]\[/i\]#is", "", $aString ); $aString = preg_replace( "#\[u\]\[/u\]#is", "", $aString ); $aString = preg_replace( "#\[s\]\[/s\]#is", "", $aString ); $aString = preg_replace( "#\[quote\]\[/quote\]#is", "", $aString ); $aString = preg_replace( "#\[url\]\[/url\]#i" , "\\1", $aString ); // цитаты $aString = preg_replace( "#\[quote([^\]])#is", "[quote]\\1", $aString ); $aString = preg_replace( "#\[/quote([^\]])#is", "[/quote]\\1", $aString ); $aString = preg_replace( "#([^\[\/])quote\]#is", "\\1[quote]", $aString ); $aString = preg_replace( "#([^\[])/quote\]#is", "\\1[/quote]", $aString ); $aString = preg_replace( "#\[quote\]\[/quote\]#is", "", $aString ); $aString = preg_replace( "#\[quote\](.+?)\[/quote\]
\n#is", "\\1", $aString ); $aString = preg_replace( "#\[quote\](.+?)\[/quote\]#is", "\\1", $aString ); // исправляем ошибку с вложенными цитатами $aString = preg_replace( "#\[/quote\](.*?)\[quote\]#is", "\\1", $aString ); $aString = preg_replace( "#\[quote\](.+?)<\/span>\[/quote\]#is", "\\1", $aString ); // Убираем лишний br после цитаты $aString = preg_replace( "#<\/span>\s*
#is", "
", $aString ); // (c) (r) and (tm) $aString = preg_replace( "#\(c\)#i" , "©" , $aString ); $aString = preg_replace( "#\(tm\)#i" , "™" , $aString ); $aString = preg_replace( "#\(r\)#i" , "®" , $aString ); // email tags // [email]matt@index.com[/email] [email=matt@index.com]Email me[/email] $aString = preg_replace( "#\[email\](\S+?)\[/email\]#i" , "\\1", $aString ); $aString = preg_replace( "#\[email\s*=\s*\"\;([\.\w\-]+\@[\.\w\-]+\.[\.\w\-]+)\s*\"\;\s*\](.*?)\[\/email\]#i" , "\\2", $aString ); $aString = preg_replace( "#\[email\s*=\s*([\.\w\-]+\@[\.\w\-]+\.[\w\-]+)\s*\](.*?)\[\/email\]#i" , "\\2", $aString ); // url tags // [url]http://www.index.com[/url] [url=http://www.index.com]ibforums![/url] $aString = preg_replace( "#\[url\](\S+?)\[/url\]#i" , "\\1", $aString ); $aString = preg_replace( "#\[url\s*=\s*\"\;\s*(\S+?)\s*\"\;\s*\](.*?)\[\/url\]#i" , "\\2", $aString ); $aString = preg_replace( "#\[url\s*=\s*(\S+?)\s*\](.*?)\[\/url\]#i" , "\\2", $aString ); $aString = trim($aString); return $aString; } ################################################################### // Разбиение длинных слов по указанной длине function Wrap ($text, $width) { $text_array = explode(" ", $text); $text = ""; foreach ($text_array as $value) { $len = mb_strlen($value, "utf-8"); if ($len > $width) { for ($i=0; $i\[IMG\](http\S+)\[/IMG\]#isu", "target=_blank>\\1", $text); $text = preg_replace("#(?|\])\[IMG\](http\S+)\[/IMG\](?!\[|\)#isu", "\\1", $text); return $text; } ################################################################### # сохраняем в куках имя, email и город function SaveNames() { if (!isset($_COOKIE['gg_name']) || $_COOKIE['gg_name'] != $this->name) { setcookie("gg_name", $this->name, time()+365*86400, "/"); } if ($this->email && (!isset($_COOKIE['gg_email']) || $_COOKIE['gg_email'] != $this->email)) { setcookie("gg_email", $this->email, time()+365*86400, "/"); } if ($this->city && (!isset($_COOKIE['gg_city']) || $_COOKIE['gg_city'] != $this->city)) { setcookie("gg_city", $this->city, time()+365*86400, "/"); } } ################################################################### // Получаем гостевую сессию посетителя function GetGuestID() { if ($this->guestID == 0) { # Ищем в куках if (isset($_COOKIE['gg_uu']) && $_COOKIE['gg_uu']) { $s = explode("_", $_COOKIE['gg_uu']); $login = intval($s[0]); $password = intval($s[1]); if ($login && $password) { $qr = new Query("select * from guest where login='$login' and password='$password'"); if ($qr->row()) { $this->guestID = $qr->row['id']; $update = new Query("update guest set last_date=NOW(), last_ip='".Ctrl::GetIP()."', last_browser='".Ctrl::GetBrowser()."' where id=".$qr->row['id']); } } } } return $this->guestID; } ################################################################### // Создаем гостевую сессию посетителя function SetGuestID() { if ($this->guestID == 0) { $login = mt_rand(0, 9876543) - round(((double) microtime()) * 10000); if ($login < 0) { $login = abs($login); } elseif ($login == 0) { $login = round(((double) microtime()) * 100000); } $password = mt_rand(0, 8888888) + round(((double) microtime()) * 100000); $qr = new Query("insert into guest (reg_date, reg_ip, reg_browser, reg_lang, login, password) values (NOW(), '".Ctrl::GetIP()."', '".Ctrl::GetBrowser()."', '".Ctrl::GetLanguage()."', '$login', '$password')"); if ($qr->success) { $this->guestID = $qr->insert_id(); setcookie("gg_uu", $login."_".$password, time()+365*86400, "/"); } } } ################################################################### # Возвращаем базовый url форума function GetBaseUrl() { return $this->baseUrl; } ################################################################### // Добавляем запись в антимат function AddAntimat ($type, $post_id, $reason = "") { $hash = md5("{$post_id}{$type}".Ctrl::GetIP()); $insert = new Query("insert into antimat (type, post_id, ip, hash, reason, date) values ('$type', '$post_id', '".Ctrl::GetIP()."', '$hash', '$reason', NOW())"); setcookie ("gcuu", $hash, time()+365*86400, "/"); Ctrl::MySessionStart(); session_register("gsuu"); $_SESSION["gsuu"] = $hash; return "Ваше сообщение сохранено и появится на сайте в течение нескольких часов после проверки модератором.
До окончания проверки вы не сможете писать новые сообщения.
Извините за доставленные неудобства."; } ################################################################### // Ссылка для возврата назад function PrintBackLink() { if (DESKTOP) { return <<<< Вернуться назад TXT; } else { return <<Вернуться назад TXT; } } ################################################################### # Переводим тэги html в bbcode function HtmlToBBCode($aString) { // url tags // [url]http://www.index.com[/url] [url=http://www.index.com]ibforums![/url] $aString = preg_replace( "#(.+?)#i" , "[url=\\1]\\2[/url]", $aString ); $aString = preg_replace( "#(.+?)#i" , "[url=\\1]\\2[/url]", $aString ); $aString = preg_replace( "#(.+?)#i" , "[url=\\1]\\2[/url]", $aString ); $aString = preg_replace( "#(.+?)#is", "[b]\\1[/b]", $aString ); $aString = preg_replace( "#(.+?)#is", "[b]\\1[/b]", $aString ); $aString = preg_replace( "#(.+?)#is", "[i]\\1[/i]", $aString ); $aString = preg_replace( "#(.+?)#is", "[i]\\1[/i]", $aString ); $aString = preg_replace( "#(.+?)#is", "[u]\\1[/u]", $aString ); $aString = preg_replace( "#(.+?)#is", "[s]\\1[/s]", $aString ); $aString = preg_replace( "#(.+?)#is", "[quote]\\1[/quote]\n", $aString ); // Спойлер $aString = preg_replace( "#
]+>\[(.+?) >>\](.+?)
#is" , "[spoiler=\\1]\\2[/spoiler]", $aString ); // (c) (r) and (tm) $aString = preg_replace( "#©#i" , "(c)" , $aString ); $aString = preg_replace( "#&\#153;#i" , "(tm)" , $aString ); $aString = preg_replace( "#®#i" , "(r)" , $aString ); $aString = str_replace( "\" ,"\\" , $aString); // email tags // [email]matt@index.com[/email] [email=matt@index.com]Email me[/email] $aString = preg_replace( "#(.+?)#i" , "[email=\\1]\\2[/email]", $aString ); $aString = strip_tags($aString); $aString = trim($aString); return $aString; } ################################################################### # Возвращаем результат выполнения операции function GetResult() { return $this->result; } ################################################################### # Возвращаем текст сообщения или отзыва function GetText() { return $this->text; } ################################################################### } ?>