Полная защита от mail-injection

Предположим, мы отправляем тривиальный отзыв и собираемся сделать эти поля динамическими:

  • имя отправителя
  • адрес электронной почты отправителя
  • тема
  • тело сообщения

достаточно ли этого кода PHP, чтобы защитить нас от всех видов почтовых инъекций?

  //sanitizing email address
if ($email = filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)){
  //encoding subj according to RFC and thus protecting it from all kinds of injections
  $subject = "=?UTF-8?B?".base64_encode($_POST['subject'])."?=";
  //encoding name for same reasons, and using sanitized email
  $from    = "From: =?UTF-8?B?".base64_encode($_POST['name'])."?= <$email>\r\n";
  //protecting body as it mentioned in http://php.net/mail
  $message = str_replace("\n.", "\n .", $_POST['text']);
  mail('[email protected]',$subject,$message,$from);
}

на данный момент я играю с такими именами, как "[email protected], [email protected],", но кажется, что все доступные почтовые клиенты обрабатывают его правильно


person Your Common Sense    schedule 21.03.2011    source источник
comment
С моим довольно ограниченным пониманием, я думаю, этого достаточно :)   -  person Cogicero    schedule 21.03.2011
comment
смешно - я уверен, что вы сказали несколько дней назад, что ввод '.' сам по себе "никогда не сработает"...   -  person Alnitak    schedule 21.03.2011
comment
ну я все еще учусь, как и все мы   -  person Your Common Sense    schedule 21.03.2011
comment
Конечно. Думаю, вы понизили мой голос за предположение, что вы были неправы...   -  person Alnitak    schedule 21.03.2011
comment
спасибо за исправление - см. также spotthevuln.com/2011/01/sleep- smtp-команда-внедрение   -  person Alnitak    schedule 21.03.2011


Ответы (2)


достаточно ли этого кода PHP, чтобы защитить нас от всех видов почтовых инъекций?

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

Моя единственная рекомендация, кроме того, чтобы не использовать mail() для начала, будет рассматривать is_email, а не встроенный фильтр. Встроенный терпит неудачу в ряде крайних случаев.

person Charles    schedule 21.03.2011

Это зависит от того, соответствует ли фильтр rfc, в котором указано, что локальная часть не может содержать ничего, если она окружена " или каким-либо другим символом, каким-либо адресом, например "foo\r\nTo: [email protected]\r\nTo: dummy "@foo.tld даст вам такие заголовки, как:

Subject: foo
To: [email protected]
To: dummy"@foo.tld

довольно плохо ...

person yent    schedule 21.03.2011
comment
Итак, вы хотите сказать, что filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) это позволит? - person Your Common Sense; 21.03.2011