Подтвердить что ты не робот

Исключить строку для использования в почте()

Конечно, при использовании MySQL вы используете mysqli_real_escape_string() и убедитесь, что тип вводимого ввода - это вид, который вы ожидаете (строка, число и т.д.), и вы можете быть уверены, что можете использовать его в качестве входных данных для mysqli_query() довольно безопасно... правильно?

Ну, вопросы:

  • Каков наилучший способ избежать строки, которая будет использоваться в mail()?
  • Если получатель электронной почты будет адресом электронной почты, введенным в текстовое поле, что я должен делать осторожно, чтобы избежать инъекций или эксплойтов?

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


EDIT: Идея этого вопроса состоит не в том, чтобы иметь THE ответ, а в том, чтобы составить исчерпывающий список всех вещей, которые нужно позаботиться при работе с электронной почтой с PHP.

4b9b3361

Ответ 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);
}