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

[2.1.x]Анти дублирование сообщений v2


Arhar

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

Название: Анти дублирование сообщений v2

Добавил: Arhar

Добавлен: 24 Окт 2007

Обновлен: 03 Ноя 2008

Категория: IP.Board 2.1.x

 

Анти реклама нового поколения. Не против ботов, против людей.

+ Защита в ЛС(PM)

 

Вполне претендует на законченный вариант.

 

Возможно подойдет и для старших версий, не проверял

 

Нажмите здесь, чтобы скачать файл

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

почему я думаю что:

есть замечательная функция strip_tags

все ббкоды можно уничтожить не думая о том какие они

100% совпадения можно откидывать без всякого вычисления вероятности - более того это будет в 80% случаев срабатывать

условие проверки вероятности явно переполнено логикой и вычислениями

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

чем-то стриптегс не понравился...

он конечно работает, но если много напихано урлов и картинок, и картинок в урлах, он все нафиг выкидывает, что не есть хорошо

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

Предвкушаю продолжительную жаркую дискуссию :D

 

Не против ботов, против людей.

Ага, нужно для гостей другой запрос сделать, так фигово.

есть замечательная функция strip_tags

все ббкоды можно уничтожить не думая о том какие они

100% совпадения можно откидывать без всякого вычисления вероятности - более того это будет в 80% случаев срабатывать

условие проверки вероятности явно переполнено логикой и вычислениями

+1

 

# And convert it back again...
$txt = str_replace( "<#EMO_DIR>", "<#EMO_DIR#>", $txt );

# Legacy
$txt = preg_replace( "#<!--emo&(.+?)-->.+?<!--endemo-->#", "\\1" , $txt );

Почему смайлики несут смысловую нагрузку?

 

$txt = preg_replace( "#<a href=[\"'](http://|https://|ftp://|news://)?(\S+?)['\"].+?".">(.+?)</a>#" , "\\1\\2"  , $txt );

Имхо \\1 \\2, не?

 

array_diff

Фу... Полюбому нужны отдельные словари для "особый" слов, не стоит все учитывать при сравнении. Да и повторяющиеся тоже хорошо бы по-другому учитывать.

 

if ( $this->ipsclass->vars['allow_images'] )

Зачем? Я бы в любом случае вырезал, вне зависимости от настроек, они могли и измениться. Или это настройка мода?

 

P.S. Пока что всё, но есть ещё надумки ;)

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

Обрабатывай их до strip_tags. В твоем случае получается на отправку сообщения (нормального!) 3-и блока регулярок:

2 на проверке

1 на пост-отправке

 

Итого что надо что бы PHP скушал всю память? Правильно. Отправлять большие спам сообщения.

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

для гостей как-то не подумал..

а чем плох такой запрос, ведь у гостя мембер ид=0, и в таблице постов тоже вроде как 0...

 

смайлики эт те же картинки, нет?

если пост из одних смайликов, а потом еще раз из этих смайликов...

 

strip_tags убивает все внутри <img ... /> сразу

 

\\1\\2 не важно, там все небуквенные символы все равно на пробелы заменяются

а потом много пробелов на один

 

повторяющиеся ему пофигу, он ищет различные вообще

между

array('test','tset,'test','test')

и

array('test','tset')

нет разницы

 

настройка... ну так вроде на форум постим, если он один раз отпостил без парсинга, то и сравнивать будем с отпостеным без парсинга

 

далее плиз

 

 

 

получили попроще

		$txt = $post1['post'];

	$txt = str_replace( "<br>"  , "\n", $txt );
	$txt = str_replace( "<br />", "\n", $txt );

	# Make EMO_DIR safe so the ^> regex works
	$txt = str_replace( "<#EMO_DIR#>", "default", $txt );

	# New emo
	$txt = preg_replace( "#<([^>]+?)emoid=\"(.+?)\"([^>]+?)".">#is", "\\2", $txt );

	# And convert it back again...
	$txt = str_replace( "default", "<#EMO_DIR#>", $txt );

	# Legacy
	$txt = preg_replace( "#<!--emo&(.+?)-->.+?<!--endemo-->#", "\\1" , $txt );

	//-----------------------------------------
	// Clean up nbsp
	//-----------------------------------------

	$txt = str_replace( '    ', "\t", $txt );
	$txt = str_replace( '  '			, "  ", $txt );


		$txt = preg_replace( "#<img style=[\"']float:(left|right)[\"'] .+? src=[\"'](\S+?)['\"].+?".">#"		   , "\\2"			, $txt );
		//Image resize mod(add after "#<img" this simbols ".+?")
		$txt = preg_replace( "#<img .+? src=[\"'](\S+?)['\"].+?".">#"	  , "\\1"			, $txt );
		$txt = preg_replace( "#<img src=[\"'](\S+?)['\"].+?".">#"	  , "\\1"			, $txt );

		//-----------------------------------------
		// Email, URLs
		//-----------------------------------------

		$txt = preg_replace( "#<a href=[\"']mailto:(.+?)['\"]>(.+?)</a>#"								   , "\\2"   , $txt );
		$txt = preg_replace( "#<a href=[\"'](http://|https://|ftp://|news://)?(\S+?)['\"].+?".">(.+?)</a>#" , "\\1\\2"  , $txt );

		//-----------------------------------------
		// Tidy up the end quote stuff
		//-----------------------------------------

		$txt = preg_replace( "#(\[/QUOTE\])\s*?<br />\s*#si", "\\1\n", $txt );
		$txt = preg_replace( "#(\[/QUOTE\])\s*?<br>\s*#si"  , "\\1\n", $txt );

	$txt = strip_tags($txt);
	/*return*/ $txt = trim(stripslashes($txt));

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

а чем плох такой запрос, ведь у гостя мембер ид=0, и в таблице постов тоже вроде как 0...

Допустим ты выбираешь N последних постов пользователей, тогда для гостей нужно выбирать N*количество_гостей_за_время_T, или фильтровать гостей не по ид, а по ИП например.

 

 

если пост из одних смайликов, а потом еще раз из этих смайликов...

А если сначало

word1 word2
а потом
word1 word2 :D:) :) :) :) ;):D;):)
? Так же можно смайликами набить нужный проходной процент, смайлы имхо надо за знаки пунктуации считать. К тому и веду про "словарь".
Ссылка на комментарий
Поделиться на других сайтах

ну смайлы прекрасно можно вырезать, убрав \\1

к ип нет смысла привязывать, переподключился на анлиме и спамь

и потом, для спама, который быстрей-быстрей отправляется, 10 сообщений нормально

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

Ну значит надо вырезать :D

 

который быстрей-быстрей отправляется

Боты часто возвращаются и через несколько дней с идентичным сообщением. Так что нужно для гостей брать последние посты конкретного гостя. А уж как определять, по IP или по маске(наверное так, можно посмотреть какие там IP будут) это другой вопрос, ещё сложней.

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

Картинки можно вытаскивать совершенно иначе. Вообще алгоритм сжатия текста старого сообщения должен быть следующим:

 

1. проверяем на наличие ссылок в тексте (тэг якоря)

1.1 ссылки есть запускаем модуль парсинга ссылок - модуль возвращает все без якорей

2. проверяем на наличие изображений в тексте (можно вообще определять по наличию ссылок jpg|gif и т.д.)

2.1 изображения есть запускаем модуль парсинга изображений - модуль возвращает урлы изображений

4. Режем все теги потому что они нам больше не нужны

4. Выкидываем все что не a-zа-я0-9, заменяя это пробелом

5. Ужимаем пробелы

 

Текст готов

 

Алгоритм сжатия входного сообщения аналогичен, с той лишь разницей, что в 4 пункте мы режем все что в []

 

Мы получаем дополнительную логику, но при этом избавляемся от компиляций и выполнения регулярок, которые выполняются вне зависимости от того есть ли выражения попадающие под них или нет.

 

Более того модули парсинга могут просто наполнять некоторые временные массивы. А потом эти массивы отдельно сравнивать.

Другими словами есть текст и есть ссылки на изображения, вообще ссылки. Все это хранится отдельно друг от друга. После сравнения все это удаляется из памяти и все живут тихо и спокойно.

 

Релизация с массивами вообще может быть очень красива сделана, с минимумами затрат ресурсов. Например можно обойтись всего одним массивом, который будет хранить уникальные ссылки/изображения, или быть пустым если оных нет.

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

нормально идет, фильтрует пока-что только повторные нажатия на отправить

название темы проверять также,как и пост?

с чем сравнивать? какой алгоритм?

мне самому лень писать сравнение, пиши - присобачим))

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

Да, сравнивалку я напишу на днях :D

 

Кстати, вот характерный пример того, как некоторые толстолобики изгалаются, чтобы запостить свой спам в несколько разделов: ;)

 

$error['1193329727']="

===================================================

Date: Thu, 25 Oct 2007 20:28:47 +0400

Member: 2499

IP Address: 78.107.206.108

Сниму квартиру 1 комнатную

 

Строгино, Щукинская и рядом

аська ****** или *******

почта *******@mail.ru

 

Precision: 100";

?><?php

$error['1193329746']="

===================================================

Date: Thu, 25 Oct 2007 20:29:06 +0400

Member: 2499

IP Address: 78.107.206.108

Сниму квартиру 1 комнатную

 

Строгино, Щукинская и рядом

аська ****** или *******

почта *******@mail.ru

 

пишите ! :-)

Precision: 94";

?><?php

$error['1193329777']="

===================================================

Date: Thu, 25 Oct 2007 20:29:37 +0400

Member: 2499

IP Address: 78.107.206.108

Сниму квартиру

 

 

однокомнатную

 

Строгино, Щукинская и рядом

аська ******

аська *******

почта *******@mail.ru

 

пишите ! :-)

Precision: 88";

 

И таких примеров уже много :)

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

  • 2 недели спустя...

Ну, что же. На двух форумах модуль показал себя с лучшей стороны - кросс-постинг фильтруется отлично.

Правда, многие пытаются сообщение менять, но 99% не хватает на то, чтобы изменить его настолько сильно, чтобы алгоритм пропустил сообщение (это при 70% пороге).

 

Но, есть некоторые толстолобики, которые бьются до конца. Я думаю, что будет очень полезной функция автоматической блокировки учетной записи на N часов (0 - навсегда) при попытке M раз запостить дубликат. При этом желательно отправить сообщение администратору о том, что автоматическая система заблокировала пользователя с таким-то id - это для скорейшего исправления ошибочных блокировок.

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

И еще, желательно, последнее сообщение т.е. то, дубликатом чего является постящееся :D сообщение отправить на премодерацию т.е. скрыть т.к. это вероятнее всего спам.

 

Архар, это реализуемо? :)

Как у тебя на форуме модуль себя показывает? ;)

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

у меня с 30 октября пусто

70% ошибок (7 из всего 10))) связаны с одновременными нажатиями, пара моих тестов, плюс один юзер пытался поздравить в двух темах с днем рождения другого юзера..

 

реализуемо, вот только модуль допишу один..

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

  • 3 недели спустя...
В процессе доработки и поиска багов.

Какая ситуация на данный момент?

 

Ложные срабатывания были?

 

К ПМ прикрутишь? :D

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

ложных точно не было

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

другие алгоритмы писать лень, хотя оптимизировать стоило бы

может кто другой придумает, как резать ббкоды

 

к пм можно прикрутить в файле sources/lib/func_msg.php в function send_pm

только надо учитывать если есть массовая отправка пм какая-нибудь, или письмо приветствия..

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

  • 2 недели спустя...

Arhar, а можешь прикрутить автобан (после N попыток запостить дубль) и проверку заголовков сообщений (по списку тупым сравнением)? :D

 

P.S.: Судя по скептическому настрою некоторых людей еще до написания модуля он оказался все-таки весьма полезным, не так ли? У меня режет спамеров и кросс-постеров только в путь - я уже забыл про кросс-постиг, например ;)

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

  • 3 недели спустя...
  • 2 недели спустя...
  • 9 месяцев спустя...

Готова новая версия

Добавлен автобан, пересмотрена логика регулярок

сейчас соберу инструкцию

 

изменилось вообще все, так что менять вообще весь код и настройки (см скриншот)

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

×
×
  • Создать...

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

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