Обнаружение (непослушного или приятного) URL или ссылки в текстовой строке - PullRequest
37 голосов
/ 31 марта 2009

Как я могу обнаружить (с помощью регулярных выражений или эвристик) ссылку на веб-сайт в текстовой строке, такой как комментарий?

Цель - предотвратить спам. HTML разорван, поэтому мне нужно обнаружить приглашения для копирования и вставки. Спаммер не должен экономно размещать ссылки, поскольку большинство пользователей не могут успешно попасть на страницу . Я хотел бы получить предложения, ссылки или обсуждение передового опыта.

Некоторые цели:

  • Низко висящие фрукты, такие как правильно сформированные URL (http://some-fqdn/some/valid/path.ext)
  • URL-адреса, но без префикса http:// (т. Е. Действительное полное доменное имя + действительный путь HTTP)
  • Любые другие забавные дела

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

Идеи

Вот некоторые вещи, о которых я думаю.

  • Содержание написано на родном языке, так что я могу быть счастливым при обнаружении
  • Должен ли я сначала убрать все пробелы, чтобы поймать "www .example.com"? Знают ли обычные пользователи, чтобы убрать пространство сами, или сделать какие-либо браузеры «делай, что я имею в виду» и лишить его для вас?
  • Может быть, несколько проходов - лучшая стратегия со сканированием для:
    • Правильно сформированные URL
    • Все не пропуски, за которыми следует '.' сопровождаемый любым действительным ДВУ
    • Что-нибудь еще?

Смежные вопросы

Я прочитал их, и теперь они задокументированы здесь, так что вы можете просто ссылаться на регулярные выражения в этих вопросах, если хотите.

Обновление и сводка

Ух ты, здесь есть несколько очень хороших эвристик! Для меня лучшая цена за доллар - это синтез следующего:

  1. @ Техника Джона Брайта по обнаружению ДВУ (хорошая защитная удушающая точка)
  2. Для этих подозрительных строк замените точку символом, похожим на точку, в соответствии с @ capar
  3. Хороший персонаж, похожий на точку, это @ Sharkey's subspted & middot; (т.е. " & middot; "). & Мидот; также является границей слова, поэтому сложнее случайно скопировать и вставить.

Это должно сделать CPM спаммера достаточно низким для моих нужд; обратная связь «пометить как неприемлемую» должна отразить все остальное. Другие перечисленные решения также очень полезны:

  • Удалите все пунктирные квадраты (@ комментарий Шарки к его собственному ответу)
  • @ Требование Sporkmonger для клиентского Javascript, который вставляет в форму обязательное скрытое поле.
  • Пингуйте URL-адрес на стороне сервера, чтобы определить, является ли он веб-сайтом. (Возможно, я мог бы запустить HTML через SpamAssassin или другой байесовский фильтр согласно @Nathan ..)
  • Посмотрите на источник Chrome для его умной адресной строки, чтобы увидеть, какие хитрые трюки использует Google
  • Обращение к OWASP AntiSAMY или другим веб-службам для обнаружения спама / вредоносного ПО.

Ответы [ 13 ]

1 голос
/ 15 апреля 2009

Конечно, вы понимаете, что если спамеры решат использовать tinuyrl или подобные сервисы для сокращения своих URL, ваша проблема только ухудшится. Возможно, вам придется написать некоторый код для поиска реальных URL-адресов в этом случае, используя такой сервис, как TinyURL decoder

1 голос
/ 15 апреля 2009

Сделав несколько попыток написания этого точного фрагмента кода, я могу однозначно сказать, что вы не сможете сделать это с абсолютной надежностью, и вы определенно не сможете обнаружить все формы URI, разрешенные RFC. К счастью, поскольку у вас очень ограниченный набор URL-адресов, которые вас интересуют, вы можете использовать любой из перечисленных методов.

Тем не менее, я могу с большой уверенностью сказать, что если вы действительно хотите победить спамеров, лучший способ сделать это - использовать JavaScript. Отправьте кусок JavaScript, который выполняет некоторые вычисления, и повторите вычисления на стороне сервера. JavaScript должен скопировать результат вычисления в скрытое поле, чтобы при отправке комментария также передавался результат вычисления. Проверьте на стороне сервера, что расчет верен. Единственный способ обойти эту технику - спаммеры могут вручную вводить комментарии или запускать движок JavaScript только для вас. Я использовал эту технику, чтобы уменьшить количество спама на моем сайте со 100+ в день до одного или двух в год. Теперь единственный спам, который я когда-либо получаю, вводится людьми вручную. Странно получать спам по теме.

0 голосов
/ 24 апреля 2018

Мне нужно было просто обнаружить простые URL-адреса http с протоколом / out, предполагая, что либо указан протокол, либо префикс «www». Я нашел выше упомянутую ссылку весьма полезным, но в итоге я вышел с этим:

http(s?)://(\S+\.)+\S+|www\d?\.(\S+\.)+\S+

Это, очевидно, не тестирует соответствие стандарту DNS.

...