Вырезать внешние ссылки

InstantCMS 2.X

Борьба со спамом

#1 23 сентября 2020 в 14:37
Всем доброго здравия!
Суть такая:
1. Приходят хрумеры и еще какие-то боты.
2. Приходят спаммеры

Надо вырезать все внешние ссылки в личных сообщениях (стоит NeoMessenger Premium).
Вырезать внешние ссылки в профилях (статус, о себе), оставлять внешние ссылки в блогах, благо они модерируются.

Есть ли какие-либо решения? Заранее спасибо.
#2 23 сентября 2020 в 20:52
Пока так:
  1. public function replaceExternalLinks($html = ''){
  2.  
  3. function callback($matches) {
  4. if (preg_match('#^https?://(www\.)?localhost\.ru(/.+)?$#i', $matches[1])) {
  5. return '<a href="' . $matches[1] . '" target="_blank">' . $matches[2] . '</a>';
  6.  
  7. }
  8. return $matches[2];
  9. }
  10.  
  11. $pattern = '#<a[^>]*href=[\'"]([^\'"]*)[\'"][^>]*>(((?!<a\s).)*)</a>#i';
  12. $filteredString = preg_replace_callback($pattern, 'callback', $html);
  13. return $filteredString;
  14. }
Из
  1. Игровые <a href="http://spam.com">казино</a> Вулкан
Вернет
  1. Игровые казино Вулкан
Из
  1. Читайте в <a href="https://localhost.ru/blog/123/">моем</a> блоге
Вернет
  1. Читайте в <a href="https://localhost.ru/blog/123/" target="_blank">моем</a> блоге
Для личных сообщений, полагаю, сгодится.
#3 30 сентября 2020 в 16:04
Подскажите, куда именно вы вставляете эту проверку?
Если я правильно понимаю в \system\controllers\messages\actions\send.php
Дописываете array Описание правил валидации входных данных?
Расскажите подробнее, пожалуйста — озадачился похожим вопросом
В идеале планирую реализовать так: проверять на ссылки и номера телефонов, регулярки написал, вроде и потестил — ищу куда их корректно вписать, чтобы проверять личные сообщения.
В дальнейшем хочу внедрить то же на стену, в ленту в общем в профиль пользователя.
UPD Возникла идея склонировать хук html_filter назвать к примеру html_filterrr и в нем дописать ограничения для пользователей в $jevix->cfgSetTagCutWithContent добавить все что связано со ссылками
$jevix->cfgSetAutoReplace — все цензурирования телефонов
#4 1 октября 2020 в 20:07

Подскажите, куда именно вы вставляете эту проверку?

@arsen1989
system\core\form.php
И в нужном месте соответственно дёргаем cmsForm::replaceExternalLinks($content)
Например, заменять ссылки в лс:
(пытался на стадии action, но не помню почему не сделал там)
system\controllers\messages\model.php
  1. public function addMessage($from_id, $recipients, $content){
  2.  
  3. $message_ids = array();
  4.  
  5. foreach($recipients as $to_id){
  6.  
  7. $message_ids[] = $this->insert('cms_users_messages', array(
  8. 'from_id' => $from_id,
  9. 'to_id' => $to_id,
  10. 'content' => cmsForm::replaceExternalLinks($content)
  11. ));
  12.  
  13. }
  14.  
  15. return sizeof($message_ids)>1 ? $message_ids : $message_ids[0];
  16.  
  17. }
Предварительно в NeoMessenger нужно отключить редиректы.

В идеале планирую реализовать так: проверять на ссылки и номера телефонов, регулярки написал, вроде и потестил — ищу куда их корректно вписать, чтобы проверять личные сообщения.

@arsen1989
Мне тоже нужно номера телефонов выпиливать. Поделитесь вашей регуляркой?
У меня так:
  1. /[\(+\/\\\]?(\d[+\(\)\/\\\ -]*){10,11}/
#5 2 октября 2020 в 00:02
Пробую такую
  1. \+\d{1,3}\s\d{2,5}\s\d{5,7}
так же были варианты
  1. /\+[\d]{1,3}\s[\d]{2,5}\s[\d]{5,7}/
  1. .\d+.\d{1,6}-\d{1,6}-\d{1,6}$
#6 4 октября 2020 в 17:46


Подскажите, куда именно вы вставляете эту проверку?

@arsen1989
system\core\form.php
И в нужном месте соответственно дёргаем cmsForm::replaceExternalLinks($content)
Например, заменять ссылки в лс:
(пытался на стадии action, но не помню почему не сделал там)
system\controllers\messages\model.php
  1. public function addMessage($from_id, $recipients, $content){
  2.  
  3. $message_ids = array();
  4.  
  5. foreach($recipients as $to_id){
  6.  
  7. $message_ids[] = $this->insert('cms_users_messages', array(
  8. 'from_id' => $from_id,
  9. 'to_id' => $to_id,
  10. 'content' => cmsForm::replaceExternalLinks($content)
  11. ));
  12.  
  13. }
  14.  
  15. return sizeof($message_ids)>1 ? $message_ids : $message_ids[0];
  16.  
  17. }
Предварительно в NeoMessenger нужно отключить редиректы.

В идеале планирую реализовать так: проверять на ссылки и номера телефонов, регулярки написал, вроде и потестил — ищу куда их корректно вписать, чтобы проверять личные сообщения.

@arsen1989
Мне тоже нужно номера телефонов выпиливать. Поделитесь вашей регуляркой?
У меня так:
  1. /[\(+\/\\\]?(\d[+\(\)\/\\\ -]*){10,11}/

@Absolute134
Ваша регулярка будет правильнее так
  1. /[\(+\/\\\]?(\d[+\(\)\/\\\ -]*){10,12}/
иначе в номерах вида +44 203 769 18 80
будет оставаться последняя цифра
#7 5 октября 2020 в 15:40

Ваша регулярка будет правильнее так

  1. /[\(+\/\\\]?(\d[+\(\)\/\\\ -]*){10,12}/
иначе в номерах вида +44 203 769 18 80
будет оставаться последняя цифра

@arsen1989
Регулярка под российские федеральные сотовые номера. И различные варианты их написания:
+7 /900/ 800-300-50
8(900)8000 503
и т.д.
#8 6 октября 2020 в 08:18


Ваша регулярка будет правильнее так

  1. /[\(+\/\\\]?(\d[+\(\)\/\\\ -]*){10,12}/
иначе в номерах вида +44 203 769 18 80
будет оставаться последняя цифра

@arsen1989
Регулярка под российские федеральные сотовые номера. И различные варианты их написания:
+7 /900/ 800-300-50
8(900)8000 503
и т.д.

@Absolute134
Подскажите а удалось ли вам реализовать сразу 2 проверки( к примеру на ссылку и на телефон)? В моделе, насколько понимаю, вызвать вторую функцию не получится, тк cmsForm::replaceExternalLinks($content) — элемент массива. Пробую функцию допиливать, через if, но в итоге как логично предположить проходит только одну проверку, в случае если подпадают 2 в одном сообщении
#9 6 октября 2020 в 14:48

Подскажите а удалось ли вам реализовать сразу 2 проверки( к примеру на ссылку и на телефон)?

@arsen1989
Я у себя пока не сделал. Но, полагаю, можно так поступить:
  1. public function replaceExternalLinks($html = '', $delPhone = false){
  2.  
  3. function callback($matches) {
  4. if (preg_match('#^https?://(www\.)?localhost\.ru(/.+)?$#i', $matches[1])) {
  5. return '<a href="' . $matches[1] . '" target="_blank">' . $matches[2] . '</a>';
  6.  
  7. }
  8. return $matches[2];
  9. }
  10.  
  11. $pattern = '#<a[^>]*href=[\'"]([^\'"]*)[\'"][^>]*>(((?!<a\s).)*)</a>#i';
  12. $filteredString = preg_replace_callback($pattern, 'callback', $html);
  13. if($delPhone){
  14. return preg_replace('/[\(+\/\\\\]?(\d[+\(\)\/\\\\ -]*){10,11}/', '***' , $filteredString);
  15. } else {
  16. return $filteredString;
  17. }
  18. }
Соответственно, если надо удалять телефоны, то вторым параметром передаем истину.
cmsForm::replaceExternalLinks($content, true);
#10 6 октября 2020 в 18:35


Подскажите а удалось ли вам реализовать сразу 2 проверки( к примеру на ссылку и на телефон)?

@arsen1989
Я у себя пока не сделал. Но, полагаю, можно так поступить:
  1. public function replaceExternalLinks($html = '', $delPhone = false){
  2.  
  3. function callback($matches) {
  4. if (preg_match('#^https?://(www\.)?localhost\.ru(/.+)?$#i', $matches[1])) {
  5. return '' . $matches[2] . '';
  6.  
  7. }
  8. return $matches[2];
  9. }
  10.  
  11. $pattern = '#]*href=[\'"]([^\'"]*)[\'"][^>]*>(((?!
  12.  

@Absolute134

Да, работает, спасибо
#11 8 октября 2020 в 10:42
Нашел баг в данном решении. По всей видимости конфликт с типографом при массовой рассылке через компонент Личные сообщения. Пока не копался что как
  1. Deprecated: Array and string offset access syntax with curly braces is deprecated in /home/f0471325/domains/f0471325.xsph.ru/public_html/system/libs/jevix.class.php on line 1543
  2.  
  3. Deprecated: Array and string offset access syntax with curly braces is deprecated in /home/f0471325/domains/f0471325.xsph.ru/public_html/system/libs/jevix.class.php on line 1549
  4.  
  5. Deprecated: Array and string offset access syntax with curly braces is deprecated in /home/f0471325/domains/f0471325.xsph.ru/public_html/system/libs/jevix.class.php on line 1551
  6.  
  7. Deprecated: Array and string offset access syntax with curly braces is deprecated in /home/f0471325/domains/f0471325.xsph.ru/public_html/system/libs/jevix.class.php on line 1552
  8.  
  9. Deprecated: Array and string offset access syntax with curly braces is deprecated in /home/f0471325/domains/f0471325.xsph.ru/public_html/system/libs/jevix.class.php on line 1554
  10.  
  11. Deprecated: Array and string offset access syntax with curly braces is deprecated in /home/f0471325/domains/f0471325.xsph.ru/public_html/system/libs/jevix.class.php on line 1555
  12.  
  13. Deprecated: Array and string offset access syntax with curly braces is deprecated in /home/f0471325/domains/f0471325.xsph.ru/public_html/system/libs/jevix.class.php on line 1556
  14.  
  15. Deprecated: Non-static method cmsForm::replaceExternalLinks() should not be called statically in /home/f0471325/domains/f0471325.xsph.ru/public_html/system/controllers/messages/model.php on line 174
  16.  
  17. Deprecated: Non-static method cmsForm::replaceExternalLinks() should not be called statically in /home/f0471325/domains/f0471325.xsph.ru/public_html/system/controllers/messages/model.php on line 174
  18.  
  19. Fatal error: Cannot redeclare callback() (previously declared in /home/f0471325/domains/f0471325.xsph.ru/public_html/system/core/form.php:822) in /home/f0471325/domains/f0471325.xsph.ru/public_html/system/core/form.php on line 822
#12 8 октября 2020 в 13:52

Fatal error: Cannot redeclare callback()

@arsen1989
Да ...PHP такой PHP))
Наверное, это решается как-то так:
  1. if(!function_exists("callback")){
  2. function callback($matches) {
  3. if (preg_match('#^https?://(www\.)?localhost\.ru(/.+)?$#i', $matches[1])) {
  4. return '<a href="' . $matches[1] . '" target="_blank">' . $matches[2] . '</a>';
  5.  
  6. }
  7. return $matches[2];
  8. }
  9. }
Вы не можете отвечать в этой теме.
Войдите или зарегистрируйтесь, чтобы писать на форуме.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.