Escape низ за използване в mail()

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

Ами въпросите са:

  • Кой е най-добрият начин за екраниране на низ, който ще се използва в mail()?
  • Ако получателят на имейл ще бъде имейл адресът, въведен в текстово поле, за какви неща трябва да внимавам, за да избегна инжекции или експлойти?

Имам доста добра идея как да направя това, но се ровя в най-добрите практики по тази тема, за да разбера дали пропускам нещо или има по-добър начин.


РЕДАКТИРАНЕ: Идеята на този въпрос не е да има THE отговор, а да се направи изчерпателен съвместен списък на всички неща, за които трябва да се погрижите, когато правите имейл с PHP.


person Juan Ignacio    schedule 09.11.2011    source източник
comment
Мога да се сетя за XSS атаки и инжектиране на заглавки може би; така че пречистете своя html (ако използвате този тип MIME) и се уверете, че никой не въвежда персонализиран код в заглавките на пощата ви   -  person Damien Pirsy    schedule 10.11.2011
comment
Премахнете всички непечатаеми знаци, използвайте US-ASCII кодиране. Премахнете и \r\n знаците. Преобразувайте раздели в интервали.   -  person hakre    schedule 10.11.2011
comment
Страхотен въпрос. Само ми се иска да не бях изчерпал жалкото си ограничение за гласуване за деня.   -  person Lightness Races in Orbit    schedule 10.11.2011
comment
Казвате, че имате доста добра идея, така че защо не покажете какво сте измислили, така че никой да не повтаря работата ви? ;-)   -  person CodeCaster    schedule 10.11.2011
comment
Забележете, че казах идея, а не знам и това, защото го имах предвид по този начин. Имам идеи, знам някои неща, но не съм професионалист в тази тема, така че си помислих, че може би съвместен списък на общността с неща, за които трябва да се погрижа, е по-добре, отколкото аз да споменавам своите предположения. И задавам този въпрос, защото търсих в Google много и намерих много материали по въпроса, но не и изчерпателна статия (нищо дори близо до определеното ръководство за безопасно изпращане на имейли на php, което би било хубаво)   -  person Juan Ignacio    schedule 10.11.2011


Отговори (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);
}
person Laith Shadeed    schedule 09.11.2011
comment
Мисля, че има друга атака, която позволява добавянето на множество съобщения след всяко тяло. Не е толкова добре документиран обаче. Suhosin защитава PHP срещу инжектиране на заглавка на поща. - person hakre; 10.11.2011
comment
Изглежда много интересна библиотека. За първи път го виждам. Но как можем да се уверим, че няма страничен ефект върху самия PHP, проверих изходния му код, който той възпроизвежда с вътрешността на PHP. Използва ли се в някои големи, надеждни уебсайтове? - person Laith Shadeed; 10.11.2011
comment
Е, доставя се по подразбиране с PHP на Debian ;) - person hakre; 10.11.2011
comment
Читателите, попаднали на това, може да искат да отбележат, че PEAR_Mail вече не се актуализира често. Последното издание беше преди повече от година, а предишното беше преди 6 години. Zend_Mail (сега с марката zend-mail) изглежда все още се поддържа активно, документите му вече са тук: zendframework.github.io/zend-mail/intro Други популярни и поддържани в момента библиотеки са PHPMailer и Swift Mailer. - person IMSoP; 06.03.2017