-
Урок 12. Спам фильтр. Фильтрация сообщений и комментариев.
Август 11th, 2008 19 Комментариев
Подготовить данный урок меня побудил комментарий на моем сайте. Пользователь Light задался вопросом фильтрации произвольных символов в скрипте гостевой книги, на что я отреагировал быстро и незамедлительно, предложив небольшой фрагмент кода, который вырезает из текста сообщения все ненужные символы. Но что если вместо символов у нас появляется рекламная ссылка, либо попросту нецензурная брань.
Для решения проблемы представлю Вам хороший материал, который научит бороться с рекламой и бранью в ваших гостевых и комментариях.
Фильтр ссылок и html-тэгов
Проблему с рекламными ссылками мы можем обойти стандартной функцией – htmlspecialchars(). Данную функцию можно дополнить фрагментом кода для очистки сообщений от символов, которые точно не должны появлятся в сообщении:
<,>,\r, \n, символы сепаратора (в том случае , если работаем с файлами) и тд.Следующий фрагмент кода наглядно покажет вам как это делается:
[cc lang="php"]
//Режем слеши
$text = stripslashes($text);//Убираем символ новой строки , привет Light’у =)
$text = ereg_replace(“(\r?\n)+”, “”, $text);
//Убираем символы открывающие любые тэги
$text = str_replace(“<", "", $text);
$text = str_replace(">“, “”, $text);
//Преобразуем спец символы
$text = htmlspecialchars($text);
[/cc]
На выходе получаем переменную $text, очищенную от лишних символов.Фильтр нецензурных слов.
Чтобы произвести проверку текста на мат, нам необходимо составить список нехороших слов, и поместить их в массив:
$bad_words=array(‘бля’,'пиздец’,'мудак’,'porno’,’[url=','сука');
Это конечно не весь список наших стоп-слов, необходимо вспомнить насколько могуч и велик наш Русский язык. Далее мы напишем функцию, аргументами которой будет наш текст и массив со стоп-словами.
[cc lang="php"]
$bad_words=array(‘бля’,'пиздец’,'мудак’,'porno’,’[url=','сука');
//Функция
function check_text($text,$bad_words) {
//Перебираем каждое слово массива
for($i = 0; $i <= sizeof($bad_words); $i++){
if(@$bad_words[$i] != ”){
//И ищем совпадение(вхождение) с ним в тексте сообщения
$_pos=strpos(strtolower($text), $bad_words[$i]);
//Если функция вернула true , мы возвращаем 0
if($_pos !== false){ return 0; }}
}
}
[/cc]
Что же происходит внутри функции? Здесь функция strpos() находиться внутри цикла for, при помощи которого мы ищем совпадения в тексте с текущим значением массива – $bad_words[$i]. Т.е. цикл будет запускаться ровно столько раз, сколько стоп-слов находится внутри нашего массива $bad_words. Все остальное оставляем логике. Если же strpos() возвращает true, это значит что найдено ненужное нам совпадение, поэтому возвращаем 0.Чтобы далее воспользоваться этой функцией достаточно написать следующий код:
[cc lang="php"]
if(check_text($text,$bad_words) !==0) {echo ‘Проверка пройдена’;}
else {echo ‘Пожалуйста, следите за базаром =)’;}
[/cc]Пример
Чтобы просто потестировать и посмотреть как работает этот пример, создайте 3 файла.
Первый будет формой ввода текста.Этот же файл нам и будет выводить результат проверки.
index.php
[cc lang="php"]
//Подключаем файл конфигурации
include("config.php");
//Подключаем файл с фукцией
include("functions.php");//Если переменная пуста, отображаем форму
if(!$_POST['check']) {
echo '
‘;
}//Если $_POST['check'] существует, то проверяем введенный текст.
else {
//Режем слеши
$text = stripslashes($_POST['text']);//Убираем символ новой строки , привет Light’у =)
$text = ereg_replace(“(\r?\n)+”, “”, $text);
//Убираем символы открывающие любые тэги
$text = str_replace(“<", "", $text);
$text = str_replace(">“, “”, $text);
//Преобразуем спец символы
$text = htmlspecialchars($text);if(check_text($text,$bad_words) !==0) {echo ‘Проверка пройдена’;}
else {echo ‘
Пожалуйста, следите за базаром =)’;}}
?>
[/cc]
Вторым будет файл конфигурации. В нем будет массив с нехорошими словами. Это позволит вам в любой момент дополнить его.config.php
[cc lang="php"]
$bad_words=array('online','on-line','online','http:','mailto:','ftp:','Credit Card','card','www.','.com','.edu','.org','.biz','.net','.us','.es','.it','.jp','.uk','.md','[url=','[/url]',
'сука','суки','ебл','ёб','зае','заё','заи','казлы','козлы','козел','казел','пида','пиде','пидо','ганд',
'гонд','гавн','говн','чмо','урод','хуй','залу','золу','жоп','анус','клоака','клаака','пизд','бля',
'шмара','шмары','параш','пораш','порн','дибил','дебил','дура','идиот','едиот','едеот','даун',
'шалав','шолав','хер','dick','ass','anal','girl','game','xxx','sex','porn','Insurance','salle','Slots','url','free');?>
[/cc]Третьим будет файл с функцией, которую мы подключаем в файле index.php.
functions.php
[cc lang="php"]
function check_text($text,$bad_words) {
for($i = 0; $i <= sizeof($bad_words); $i++){
if(@$bad_words[$i] != ''){$_pos=strpos(strtolower($text), $bad_words[$i]);
if($_pos !== false){ return 0; }
}
}
}?>
[/cc]Скрипт фильтрации сообщений
Пример работы скрипта можно посмотреть здесь.
Исходники – filter.zipЗаключение
Это довольно простой урок, который несомненно поможет вам в борьбе со спамом. Функцию по фильтрации вы можете внедрить в любой скрипт, где требуется проверка. Достаточно просто подключить функцию (или добавить в файл с функциями) и файл конфигурации.
Подпишись на RSS, впереди много интересного.19 Responses to “Урок 12. Спам фильтр. Фильтрация сообщений и комментариев.”
Leave a Reply




Сентябрь 21st, 2009 at 23:40
Прошла =)
Сентябрь 21st, 2009 at 23:40
Проидет хуйня?
Август 30th, 2009 at 21:43
И вам тоже, господин ОШИБКА
Август 28th, 2009 at 00:58
Хyй вам
Август 3rd, 2009 at 10:03
Вот написал что-то подобное, только усовершенствовал немного. А вам остается только подобрать мат
// =============
function is_foul($text){
$words = array(
‘бля[хд]?’, // бляха-муха (хоть и не мат, но…), блядь, бляди, блядовать и т.д.
‘ебан[ыу]?’, // ебан, ебануться, ебанулся и т.д.
‘пизд[еуа]‘, // пиздец, пиздуй, пизда, пиздато, пиздатый и т.д.
‘пид[оа]р[ыан]?’, // пидор, пидорасы, пидорня и т.д.
‘(на)?муд(и|ак|оз|аз|ач|е)’, // мудила, мудить, мудак, мудозвон, мудазвон и т.д.
‘с[ц]?ук[аио]‘, // сцуко, сука, суки
‘(на|по|за|о)?ху[йие]‘, // нахуй, похуй, хуй, хуила, хуесос и т.д.
//’…’ // и так далее…
);
$text = chr(32).strtolower($text);
$text = strtr($text, ‘acmexyop’, ‘асхемуор’);
foreach($words as $word){
if(ereg(‘ [^\w]?’.$word, $text)) return true;
}
return false;
}
echo (is_foul(‘Знаете что ребятишки? -похуй мне на все!’)) ? ‘Ну-ка не материться тут!’: ‘Молодец, без мата умеешь писать.’; exit;
// =============
ЗЫ: обратите внимание: функция возвращает другое значение, не 0 (ноль).
Август 3rd, 2009 at 08:51
Ой, сори, заметил strtolower, но в примере слово кажется прошло проверку
Август 3rd, 2009 at 08:48
Заебись так-то скрипт, только нужно его модифицировать немного. Чтобы с большой буквы слова тоже могли быть матом. Как например в моем комментарии первое слово.
ЗЫ: Не ругайте меня сильно за мат, я просто показать на примере решил
Июнь 3rd, 2009 at 00:41
ггг
орненько
спс попробую себе в добавление комментраиев встроить
Февраль 21st, 2009 at 23:08
Только подобные запреты лишь разжигают интерес проверить на прочность защиту от матов…помнится хотел оставить где-то коммент нехороший, а его исправили…вот тут я и начал эксперементы, которые закончились успехом и засирание гостевой было выполнено на все сто)))