2011-11-09 20 views
20

當然,使用MySQL時,您可以使用mysqli_real_escape_string()並檢查收到的輸入類型是否您期望的類型(字符串,數字等),您可以確定可以使用它作爲輸入到mysqli_query()相當安全......對吧?在郵件中使用的退出字符串

好了,問題是:

  • 什麼是逃避那將會在mail()使用字符串的最佳方式?
  • 如果電子郵件收件人是在文本字段中輸入的電子郵件地址,我應該注意什麼以避免注入或利用漏洞?

我有一個相當不錯的主意如何做到這一點,但我正在深入瞭解這個主題的最佳實踐,以瞭解我是否缺少了什麼,或者如果有更好的方法。


編輯:這個問題的想法是不具有答案,而是要讓所有的事情打理用PHP寫電子郵件時的全面合作名單。

+1

我能想到的XSS攻擊和頭部注射也許; (如果您使用的是MIME類型),並確保沒有人在您的郵件標題中輸入自定義代碼 –

+0

去除任何不可打印的字符,請使用US-ASCII編碼。刪除\ r \ n字符。將製表符轉換爲空格。 – hakre

+1

優秀的問題。我只希望我沒有用盡當天可憐的投票限制。 –

回答

12

電子郵件注入背後的思想是攻擊者在電子郵件標題中注入換行符(LF),因此他會添加儘可能多的標題。剝離這些換行符可以保護您免受這種攻擊。詳細信息檢查http://www.phpsecure.info/v2/article/MailHeadersInject.en.php

最好的做法是依靠一個寫得很好,經常更新和廣泛使用的代碼。爲此,我建議使用PEAR_MAILZend_Mail

如果你不想加載這些模塊,或者你需要保持非常簡單。您可以從這些模塊中提取過濾功能。儘管我建議使用它們並經常更新庫,以便在未來出現新的攻擊時,您只需更新庫(Pear或Zend),即可完成。

這是在梨郵件包消毒頭功能:

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); 
} 
+0

我認爲有另一種攻擊它允許在每個主體之後添加多條消息,但是沒有那麼好記錄,[Suhosin](http://www.hardened-php.net/suhosin/)可以保護PHP免受郵件頭注入攻擊 – hakre

+0

似乎很有趣的圖書館。是我第一次看到它。但是,我們如何確保它對PHP本身沒有任何副作用,我檢查了它在PHP內部使用的源代碼。它是否在一些大型的可信網站中使用? –

+0

那麼,它在Debian上默認發佈PHP;) – hakre

相關問題