программирование на PHP
Bullet (black) Email иконка RSS иконка
  • Урок 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

    Заключение

    Это довольно простой урок, который несомненно поможет вам в борьбе со спамом. Функцию по фильтрации вы можете внедрить в любой скрипт, где требуется проверка. Достаточно просто подключить функцию (или добавить в файл с функциями) и файл конфигурации.

    Google Bookmarks БобрДобр.ru Memori.ru rucity.com МоёМесто.ru Mister Wong
    rss-лентаПодпишись на RSS, впереди много интересного.

    19 Responses to “Урок 12. Спам фильтр. Фильтрация сообщений и комментариев.”

    Страницы: [2] 1 » Show All

    1. 19
      nikaNo Gravatar Says:

      Прошла =)

    2. 18
      nikaNo Gravatar Says:

      Проидет хуйня?

    3. 17
      АлександрNo Gravatar Says:

      И вам тоже, господин ОШИБКА

    4. 16
      ОшибкаNo Gravatar Says:

      Хyй вам

    5. 15
      АлександрNo Gravatar Says:

      Вот написал что-то подобное, только усовершенствовал немного. А вам остается только подобрать мат :)

      // =============
      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 (ноль).

    6. 14
      АлександрNo Gravatar Says:

      Ой, сори, заметил strtolower, но в примере слово кажется прошло проверку :)

    7. 13
      АлександрNo Gravatar Says:

      Заебись так-то скрипт, только нужно его модифицировать немного. Чтобы с большой буквы слова тоже могли быть матом. Как например в моем комментарии первое слово.

      ЗЫ: Не ругайте меня сильно за мат, я просто показать на примере решил :)

    8. 12
      DimkaNo Gravatar Says:

      ггг :) орненько :) спс попробую себе в добавление комментраиев встроить :)

    9. 11
      АлексеищеNo Gravatar Says:

      Только подобные запреты лишь разжигают интерес проверить на прочность защиту от матов…помнится хотел оставить где-то коммент нехороший, а его исправили…вот тут я и начал эксперементы, которые закончились успехом и засирание гостевой было выполнено на все сто)))

    Страницы: [2] 1 » Show All

    Leave a Reply


freshcoder.ru © 2008 • При использовании материалов активная ссылка на сайт обязательна.
SEO Powered by Platinum SEO from Techblissonline