2011-05-11 33 views
0

我通常通過以下操作逃跑用戶輸入:PHP:建議就如何用戶輸入「免疫」

htmlspecialchars($str,ENT_QUOTES,"UTF-8");

以及mysql_real_escape_string($str)每當一個MySQL連接可用。

這怎麼能改進?到目前爲止,我還沒有遇到任何問題,但我對此不確定。

謝謝。

+1

用戶輸入只有在*使用*時才需要轉義,然後只能用於確切使用所需的衛生方法。相關或僞裝:[PHP的:最終清潔/安全功能](http://stackoverflow.com/q/4223980) – 2011-05-11 12:45:11

+0

我會給這個閱讀。謝謝。 – Francisc 2011-05-12 09:54:37

回答

2

數據應轉義(消毒)進行存儲和編碼以用於顯示。數據應該從未被編碼存儲。您只想存儲原始數據。請注意,轉義並不會改變原始數據,因爲轉義字符沒有存儲;它們僅用於正確指示原始數據和命令語法之間的差異。

總之,要做到以下幾點:

$data = $_POST['raw data']; 
//Shorthand used; you all know what a query looks like. 
mysql_query("INSERT " . mysql_real_escape_string($data)); 

$show = mysql_query("SELECT ..."); 
echo htmlentities($show); 
// Note that htmlentities() is usually overzealous. 
// htmlspecialchars() is enough the majority of the time. 
// You also don't have to use ENT_QUOTES unless you are using single 
// quotes to delimit input (or someone please correct me on this). 

您可能還需要如果啓用魔術引號剝離從用戶輸入斜線。 stripslashes()就夠了。

至於爲什麼你不應該編碼存儲,看看下面的例子:

說,你有一個數據庫字段是char(5)。 html輸入也是maxlength="5"。如果用戶輸入「& & & & &」,這可能是完全有效的,則將其存儲爲「& &」。當它被檢索並顯示回給用戶時,如果你不編碼,他們將看到「& &」,這是不正確的。如果你編碼,他們看到「& amp; &」,這也是不正確的。您不存儲用戶打算存儲的數據。您需要存儲原始數據。

在用戶想要存儲特殊字符的情況下,這也成爲問題。你如何處理這些存儲?你沒有。將其存儲爲原始。

爲了抵禦sql注入,至少在轉義輸入mysql_real_escape_string,但建議使用準備好的語句與像PDO的數據包封裝。找出哪一個最好,或者自己寫(並且徹底測試)。

爲了防禦XSS(跨站點腳本),在將用戶輸入顯示回給用戶輸入之前對其進行編碼。

+0

謝謝,tandu。 – Francisc 2011-05-12 09:42:39

+0

很好解釋! – Tech4Wilco 2011-10-17 19:25:07

1

如果您只使用mysql_real_escape_string($str)來避免sql注入,請確保您總是在您的查詢中添加單引號。

將不安全的輸出解析到屏幕時,htmlspecialchars很好。

+0

謝謝,韋斯利。 – Francisc 2011-05-12 09:54:20