Ответ 1
Идея внедрения электронной почты заключается в том, что атакующий поток инъекций (LF) в заголовках электронной почты и поэтому он добавляет столько заголовков, сколько захочет. Отключение этих фидов будет защищать вас от этой атаки. Для подробной информации проверьте http://www.phpsecure.info/v2/article/MailHeadersInject.en.php
Лучшей практикой является использование хорошо написанного, часто обновляемого и широко используемого кода. Для этого я бы предложил использовать PEAR_MAIL ИЛИ Zend_Mail
Если вы не хотите загружать эти модули или вам нужно, чтобы все было очень просто. Вы можете извлечь функциональность фильтрации из этих модулей. Хотя я рекомендую их использовать и часто обновляю библиотеку, чтобы, если новая атака появится в будущем, вам просто нужно будет обновить вашу библиотеку (Pear или Zend), и все будет готово.
Это функция, которая санирует заголовки в пакете Pear Mail:
function _sanitizeHeaders(&$headers)
{
foreach ($headers as $key => $value) {
$headers[$key] =
preg_replace('=((<CR>|<LF>|0x0A/%0A|0x0D/%0D|\\n|\\r)\S).*=i',
null, $value);
}
}
Zend_Mail использует другой фильтр для электронной почты, имени и других полей:
function _filterEmail($email)
{
$rule = array("\r" => '',
"\n" => '',
"\t" => '',
'"' => '',
',' => '',
'<' => '',
'>' => '',
);
return strtr($email, $rule);
}
function _filterName($name)
{
$rule = array("\r" => '',
"\n" => '',
"\t" => '',
'"' => "'",
'<' => '[',
'>' => ']',
);
return trim(strtr($name, $rule));
}
function _filterOther($data)
{
$rule = array("\r" => '',
"\n" => '',
"\t" => '',
);
return strtr($data, $rule);
}