Конечно, при использовании mysql вы используете mysqli_real_escape_string()
и убедитесь, что тип mysqli_real_escape_string()
ввода – это вид, который вы ожидаете (строка, число и т. Д.), И вы можете быть уверены, что можете использовать вход в mysqli_query()
достаточно надежно. .. правильно?
Ну, вопросы:
mail()
? У меня есть неплохая идея, как это сделать, но я вникаю в лучшие практики на эту тему, чтобы знать, не хватает ли я чего-то или есть лучший способ.
EDIT: Идея этого вопроса заключается не в том, чтобы иметь ответ, а в том, чтобы составить исчерпывающий список всех вещей, которые нужно позаботиться, когда делаете электронную почту с помощью php. Спасибо всем с помощью до сих пор.
Идея внедрения электронной почты заключается в том, что атакующий поток инъекций (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); }