2014-01-09 90 views
0

如果我需要輸出像用htmlspecialchars()和htmlspecialchars_decode()

<div><a>Some link</a></div> 

不是從數據庫中檢索到的字符串,是有必要使用

echo htmlspecialchars_decode(htmlspecialchars('<div><a>Some link</a></div>')); 

或者是它已經安全地直接回聲

echo '<div><a>Some link</a></div>'; 

防止XSS攻擊?

我應該消毒文本,其中;:'「{} [] $%#@^& *()-_ + = | <>〜是允許的,將其插入到數據庫之前 !?我的意思是,我應該將它們插入到數據庫之前轉換特殊字符?

我使用的PDO。

+0

如果您直接從PHP代碼回顯它,它是安全的。 – mkabanen

+0

因此,HTML在您的代碼中是硬編碼的?那麼不需要轉義。 –

+0

fyi:XSS攻擊是從客戶端到服務器,而不是從服務器到客戶端 – lordkain

回答

1

如果特殊字符進行編碼,然後立即對其進行解碼,你最終會回到原來的地方下手,所以這是毫無意義的

如果你把用戶輸入,存儲在數據庫中,把它從數據庫中取出並回顯到第e頁面,那麼您很容易受到XSS攻擊。

如果要抵禦它,那麼:

  • 不要讓用戶編寫HTML。在將數據插入頁面之前,對數據使用htmlspecialchars
  • 允許使用HTML,但是可以通過HTML解析器和白名單元素和屬性來運行它,這些元素和屬性既安全又可以接受。

如果在數據庫中的HTML來自受信任的來源(這意味着你必須對用戶進行認證,抵禦CSRF攻擊,並且不相信人是惡意的或白癡),那麼你是安全的只需輸出它而不需要修改。

我的意思是,在將特殊字符插入數據庫之前,我應該轉換特殊字符嗎?

一般而言,對於任何給定的格式,您應該在插入該格式之前立即轉義該格式的數據。如果您需要晚些時候以不同的格式呈現相同的數據,它可以節省問題。

也就是說,對數據運行白名單HTML解析器是一個相對昂貴的操作,因此您可能需要創建一個已清理的版本並將其存儲在數據庫中的未脫機版本旁邊。