2011-04-30 20 views
3

可能重複:
PHP: the ultimate clean/secure function消毒用戶提交內容的最佳方法?

我在PHP實驗的社交網站合作。所以,會有很多用戶提交的數據被髮送到數據庫。

我已經編寫了一個自定義塊腳本,而這隻會阻止某些字符或關鍵字被提交。這工作,但它有問題的列表。

我聽說addslashes和mysql_real_escape_string會這樣做,但我不想做任何事情,直到我得到一些可靠的建議。

我嘗試addslashes,它會添加斜線不能,不,等等,我不想這樣。

我只想讓我的數據庫從xss,html,php和javascript攻擊中安全。有什麼建議?從PDO

  • filter_var()

  • 回答

    2
    • 預處理語句功能
    • 用htmlspecialchars()

    對於人誰不知道PHP或查找功能文檔:

    • 準備好的陳述 - 將提供針對SQL注入的IDE保護(但不反對極端愚蠢)
    • filter_var() - 將讓您確保真正的美國數據的URL或電子郵件地址等
    • 用htmlspecialchars() - 轉換的字符,如<>&轉換爲html實體,從而防止XSS。

    我真的沒有看到這裏需要解釋。

    +0

    如果沒有解釋什麼時候需要什麼,沒有多大意義。 – 2011-04-30 22:31:59

    +0

    謝謝,對我有意義。感謝您的建議。 – Brad45 2011-04-30 23:07:23

    2

    在輸出給用戶之前,您應該HTML轉義任何內容。然後當它輸出回來時它會很安全。 PHP使用htmlspecialchars。有關更多信息,請參閱What are the best practices for avoiding xss attacks in a PHP site並閱讀OWASP XSS (Cross Site Scripting) Prevention Cheat Sheet

    +0

    謝謝,我會詳細閱讀。 – Brad45 2011-04-30 22:36:46

    +4

    -1表示在存儲之前逃脫。這有一些缺點:良好的模板引擎會爲你逃避。如果您的數據庫包含已經轉義的數據,這將會中斷。此外,如果您想要在非HTML環境中顯示數據,則會遇到問題,例如(明文)電子郵件。 – ThiefMaster 2011-04-30 22:38:28

    +0

    @ThiefMaster:好點,在去數據庫之前刪除了有關轉義的一行。 – WhiteFang34 2011-04-30 22:41:29

    1
    1. 對於HTML類型輸入,使用HTMLPurifier或類似過濾器來過濾不需要的標記。
    2. 在存儲數據之前驗證表單字段
    3. 在寫入數據庫時​​使用準備好的語句與PDO或MySQLi。如果您正確綁定參數,這將爲您處理SQL轉義。
    4. 在顯示數據前,將數據庫中的輸出轉義出來,除非它可以被認爲是安全的。
    2

    到目前爲止所有好的答案,我只想補充一點,你應該確保輸入的數據來自所需的編碼 - 你還應該規範化不同類型的新換行符或脫機控制字符,我最終使用了以下功能:

    function Filter($string, $control = true) 
    { 
        $string = iconv('UTF-8', 'UTF-8//IGNORE', $string); 
    
        if ($control === true) 
        { 
         return preg_replace('~\p{C}+~u', '', $string); 
        } 
    
        return preg_replace(array('~\r[\n]?~', '~[^\P{C}\t\n]+~u'), array("\n", ''), $string); 
    } 
    

    它將從字符串中移除所有無效的UTF-8數據並規範新行。所有控制字符(除標籤(\t)和新行(\n))都是有條紋的,並且如果$control == true也被刪除。


    PS:這不是從一個安全角度來看是非常有用的,但有助於避免GIGO