2013-02-18 50 views
0

在我的web應用程序中是一個配置文件,其中包含數據庫連接設置ans始終加載在PHP腳本的第一行。我想包含一個函數,它可以清理所有POST和GET數據,以防範現有的XSS和SQL注入風險。如何在PHP中爲XSS和SQL注入清除POST和GET vars

我不知道這功能實在是夠

function make_safe($variable) 
{ 
    $variable = strip_tags(mysql_real_escape_string(trim($variable))); 
    return $variable; 
} 

foreach ($_POST as $key => $value) { 
    $_POST[$key] = make_safe($value); 
} 
//Same for $_GET & $_SESSION 

你有這個問題的建議?

+3

這裏有兩個不同的問題。一次只關注一個。將數據插入SQL時處理SQL注入。將數據插入HTML時處理XSS。 – Quentin 2013-02-18 14:58:54

+0

[如何防止在SQL注入?](http://stackoverflow.com/questions/60174/how-to-prevent-sql-injection-in-php)是* first *問題的重複,你有( SQL注入)。 XSS是你的第二個問題。有很多答案可以解釋如何防禦這些問題,併爲他們尋找答案。 – Quentin 2013-02-18 14:59:02

+0

如果您使用上述功能,那麼您是否可以在您的應用中使用編輯器? – 2013-02-18 14:59:43

回答

3

此功能:

function make_safe($variable) 
{ 
    $variable = strip_tags(mysql_real_escape_string(trim($variable))); 
    return $variable; 
} 

都不行

SQL注入和XSS是兩個不同的野獸。因爲它們每個都需要不同的轉義,所以需要分別使用每個轉義函數strip_tags和mysql_real_escape_string。 加入他們將擊敗每個人的安全。

將數據輸入數據庫時​​使用標準的mysql_real_escape_string()。 在將數據輸出到屏幕之前,在查詢數據庫內的數據時使用strip_tags()。

爲什麼兩者結合功能是危險的 從馬口:http://php.net/manual/en/function.strip-tags.php

因爲strip_tags()並不實際驗證HTML,部分或損壞的標籤可能會導致刪除的詳細文本/於預期的數據。

因此,通過向數據庫字段中輸入格式錯誤的html,智能攻擊者可以使用您的天真實現在組合中擊敗mysql_real_escape_string()

+3

請勿使用mysql_real_escape_string。完全停止使用過時的mysql擴展,並使用PDO或mysqli。 – Quentin 2013-02-18 15:04:58

+0

'htmlentities();'? – 2013-02-18 15:08:18