Защита Контактной формы Drupal от надоедливого спамера (php-скрипт)

Drupal: 

IP-адрес — идентификатор узла компьютерной сети. Это код, который присваивается каждому пользователю Интернета, поэтому посетителей сайтов можно считать, различать между собой и создавать персональные взаимодействия, даже если пользователь не предпринимает к этому усилий (не вводит логин и пароль).

Коротко: Первый шаг в защите сайта - определение IP пользователей. Следующий модуль добавляет IP-адрес отправителя к письмам, отправляемым контактной формой.
Второй шаг - запрет пользования сайтом определённым пользователям (по их IP). Следующий модуль останавливает отправку писем от пользователей с IP, входящими в список запрещённых.

 

Защита контактной формы

От спама, исходящего от ботов, защищают Simple Anti-Spam, reCaptcha.
А от назойливого пользователя, который использует контактную форму не по назначению, защищает следующий модуль Contact Security.

Как защитить контактную форму модуля Contact?
В следующем модуле для 7-й версии Drupal нужно указать диапазоны IP адресов. Если пользователь имеет IP из этого диапазона, письма не отправляются.

 

Как узнать IP отправителя письма?

В почтовом ящике можно изучать исходные коды писем (заголовки, мета-данные), это обычно доступно в почтовых программах, например, в Thunderbird - кнопка Other actions - View Source, а также это доступно через веб-интерфейс, например, в Gmail - кнопка Ещё - Показать оригинал.
Но если на вашем сайте настроен модуль SMTP Authentication, тогда IP отправителя не сохраняется: вместо него в заголовках письма будет указан IP адрес вашего сайта.
Следующий модуль добавляет строку с IP пользователя ко всем письмам, отправляемым через контактную форму.

 

Как правильно настроить модуль Contact Security?

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

 

Как ещё лучше защитить сайт?

Блокировать доступ к сайту IP адресу.

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

Contact Security
  1. <?php
  2. /**
  3.  * @file
  4.  * This module adds the user's IP number to the email notification
  5.  * from the site wide Contact Form
  6.  * And abort sending email from blocked IP ranges
  7.  */
  8.  
  9.  
  10. /**
  11.  * Implements hook_mail_alter().
  12.  */
  13. function contact_security_mail_alter(&$message) {
  14. if ($message['id'] == 'contact_page_mail') {
  15.  
  16. //here your ip ranges with start and end numbers like array('44.51.195.0' , '44.51.195.255') these are the start and the end.
  17. //the end of range should be higher then the start.
  18. //the start and the end can differs in any position of 4 ip parts so this is the range
  19. //user's ip will be checked from start to that position that differs in the start and the end of ip range
  20. //to add one alone ip add array with similar numbers like array('17.20.50', '17.20.50')
  21. $blocked_ip_range_arr = array(
  22. array('20.20.20.80', //array just for example
  23. '20.20.20.195'),
  24.  
  25. array('112.2.104.45', //array just for example
  26. '112.2.112.42'),
  27. );
  28.  
  29. $ip = $_SERVER['REMOTE_ADDR'];
  30. $message['body'][] = "IP Number: " . $ip;
  31. //dpm($ip);
  32. if ( count($blocked_ip_range_arr) >0 )
  33. {
  34. $ip_str_arr = explode('.', $ip);
  35. for ($n=0;$n<=3;$n++) $ip_arr[$n] = intval($ip_str_arr[$n]);
  36. //cycle for massive of blocked ip ranges
  37. for ($i=0;$i<count($blocked_ip_range_arr);$i++)
  38. {
  39. $blocked_ip_str_arr_start = explode('.', $blocked_ip_range_arr[$i][0]);
  40. $blocked_ip_str_arr_end = explode('.', $blocked_ip_range_arr[$i][1]);
  41. $pos = 0; //position of different ip parts in start and end ip range like 0.1.2.xxx - 0.1.2.xxx - then pos is 3
  42. for ($n=0;$n<=3;$n++) {
  43. $blocked_ip_arr_start[$n] = intval($blocked_ip_str_arr_start[$n]);
  44. $blocked_ip_arr_end[$n] = intval($blocked_ip_str_arr_end[$n]);
  45. if ($blocked_ip_arr_start[$n] != $blocked_ip_arr_end[$n]) $pos = $n;
  46. }
  47.  
  48. //check ip if is blocked
  49. $check = TRUE; //if all start positions equal to user ip need to check
  50. for ($j=0;$j<$pos;$j++) if ($ip_arr[$j] != $blocked_ip_arr_start[$j]) { $check = FALSE; break; } //stop check if user ip is not equal to blocked
  51. if ($check) if ( ($ip_arr[$pos] >= $blocked_ip_arr_start[$pos]) && ($ip_arr[$pos] <= $blocked_ip_arr_end[$pos]) ) {
  52. $message['send'] = FALSE; // do not send email if ip blocked
  53. //dpm('has not sent');
  54. }
  55. }
  56.  
  57. }
  58. }
  59. }

Модуль использует hook_mail_alter(). Чтобы изучать переменные, установите модуль Devel и пользуйтесь командой dpm(), в частности в коде есть закоментированные строки, вызывающие dpm() для отображения переменных.

Скачать архив с модулем Contact Security можно по ссылке внизу.

 

Если вам не нужна блокировка, а только необходимо добавлять IP к письмам, можно использовать этот модуль Contact IP https://www.drupal.org/sandbox/SamMoore/2094905 (скачка через Version control - git команды).