2012-01-19 307 views
3

此代碼是否安全以防止XSS攻擊?防止XSS攻擊

<?php 
    $string = "<b>hello world!</b>"; 
    echo "without filtering:".$string; 
    echo "<br>"; 
    $filtered = htmlspecialchars($string); // insert into database filtered 
    echo "After filtering:".$filtered; 
    echo "<br>"; 
    $de_filtering = htmlspecialchars_decode($filtered); //retrieve from database and display 
    echo "After de-filtering:".$de_filtering;   
    ?> 
+2

如果要將數據放入數據庫,請不要使用'htmlspecialchars',使用數據庫的轉義方法(例如'mysql_real_escape_string')。 –

+2

@Rocket更好的是,使用PDO和預處理語句,而不是手動轉義數據庫輸入。 PHP核心開發團隊真的希望取消過時的mysql/mysqli擴展,但他們不能這麼做,因爲很多人堅持繼續使用它們。 **給所有人:**請儘自己的本分,鼓勵使用準備好的聲明而不是手動轉義。 – rdlowrey

+0

這是一個正確的方向。您需要展示更多代碼,這是您應用中的真實世界示例。這僅僅是理論。 –

回答

7

插入數據庫時​​,你不應該編碼的HTML specialChars中,(在編輯數據集時,也許不同),這樣的數據被操縱。您應該在顯示時對它們進行編碼。

但是,只要您不忘記使用它,htmlspecialchars()就足以阻止XSS。然而,您使用它的方式與以前一樣安全。 XSS通過編碼版本被阻止,數據庫不關心它。

+4

你說的幾乎所有東西都是正確的,但仔細看看OP的代碼 - 他使用'htmlspecialchars()'的方式,它不會*阻止XSS –

+0

@Pekka你是對的,我已經添加了一個通知。謝謝。 – TimWolla

+0

是否使用htmlspecialchars取決於上下文。請參閱下面的答案。 – Erlend

1

不是 - 您在將數據放入數據庫(這是不必要的)之前過濾數據,但在輸出數據時取消過濾器。

在數據庫中存儲未經過濾的數據,並輸出時逃避它:

echo htmlspecialchars($unfiltered_data_from_database); 
+0

在放入數據庫之前,請務必使用'mysql_real_escape_string'。 –

+0

@皮卡,但我需要使用標籤,這樣我會失去標籤,我什麼也沒做! – wfareed

+1

@wfareed你知道嗎:防止XSS是關於編碼標籤?您還需要諸如減價或BBCodes之類的東西。 – TimWolla

3

沒有,XSS是獨立於數據庫。爲避免SQL注入,您希望使用類似mysql_real_escape_string的函數或使用預準備語句進行轉義,但爲避免XSS,在輸出爲HTML時需要轉義。

還有一些陷阱。看看OWASP XSS prevention cheat sheet。它解釋瞭如何逃避不同的環境。

用htmlspecialchars /ヶ輛會保護你,如果你是輸出標籤之間不受信任的數據,但不會保護你,如果你是在說其輸出的JavaScript事件處理程序是這樣的:

&lt;button onclick="confirm('do you want to delete &lt;?php echo htmlspecialhars($untrusted_data) ?&gt;')"&gt; 

這是因爲你轉義爲HTML而不是javascript。