Какие меры предосторожности я должен предпринять для формы «свяжитесь с нами»? - PullRequest
0 голосов
/ 03 октября 2011

Клиент связался с нами, обеспокоенный недавними попытками злоупотребить формой обратной связи на своем сайте.По-видимому, кто-то пытался написать какой-то код в поле сообщения, скорее всего, это была попытка использовать серверный сценарий для целей спам-рассылки (инъекция электронной почты с использованием этих причудливых заголовков).

В настоящее время безопасность на месте представляет собой файл JavaScript, который проверяет форму перед ее отправкой.На самом деле никаких проверок в бэкэнде нет.

Итак, я добавил некоторую проверку в бэкэнд, просто некоторые простые вещи, такие как:

 $namePattern = '/^[a-z0-9()\/\'":\*+|,.; \- !?&#$@]{2,75}$/i';
 $emailPattern = '/^[^@\s]+@([-a-z0-9]+\.)+[a-z]{2,}$/i';
 $phonePattern = '[0-9\.\-]';
 $array = $_POST;
 //This is the first line of defense.
 if (!preg_match ($namePattern, $array['c_firstname']){
    die ("Please go back and enter a correct first name");  
 }
 ...More if statements to check other fields. 
 //The second line of defense.
 function remove($name){
     return( str_ireplace(array( "\r", "\n", "%0a", "%0d", "Content-Type:", "bcc:","to:","cc:" ), " Something Replaced ", $name ) ); 
}
  $array['c_date'] = remove ($array['c_date']);
  //Check the rest of the array.

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

Это вышедостаточно проверки безопасности?Правильно ли я сделал проверку шаблонов (в основном я просто скопировал шаблоны других людей, потому что не совсем понимаю обозначения).

Эта конкретная форма почты использует Zend Mail, поэтому, теоретически, она немного более безопасна, чем обычная почта PHP, я думаю.

Кроме того, это не так важно, но если кто-товремя, не могли бы вы научить меня, как циклически проходить по массиву и назначать новое значение каждому элементу (т.е. вместо того, чтобы писать $array['c_date'] = remove ($array['c_date']); несколько раз, простую функцию или что-то, что выполняет эту работу за меня.

Большое спасибо за помощь, хорошего дня!

Ответы [ 3 ]

1 голос
/ 03 октября 2011

Достаточно просто правильно санировать ваш ввод.Используйте htmlspecialchars() или htmlentities(). Вы также можете удалить любые символы <или>, которых должно быть достаточно.

1 голос
/ 04 октября 2011

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

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

1 голос
/ 03 октября 2011

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

Ввод сопоставления с образцом не повредит (если только вы не хотите, чтобы пользователи могли вводить конкретные значения, такие как HTML-код).

Лично я бы заверил клиента, что любой скрипт / код, вставленный в их форму, не выполняется и не наносит вреда, если не выполняется.

...