當輸出用戶輸入,你只能使用htmlspecialchars()
或者是有功能/操作/方法還跑?我正在尋找一些能夠解決XSS的問題。你只在輸出上運行htmlspecialchars()嗎?還有其他功能嗎?
我想知道如果我應該寫逃逸輸出用戶輸入的功能或只是使用htmlspecialchars()
。我正在尋找通用案例,而不是可以單獨處理的具體案例。
當輸出用戶輸入,你只能使用htmlspecialchars()
或者是有功能/操作/方法還跑?我正在尋找一些能夠解決XSS的問題。你只在輸出上運行htmlspecialchars()嗎?還有其他功能嗎?
我想知道如果我應該寫逃逸輸出用戶輸入的功能或只是使用htmlspecialchars()
。我正在尋找通用案例,而不是可以單獨處理的具體案例。
我通常在輸入字段使用
htmlspecialchars($var, ENT_QUOTES)
。我創建了一個這樣做的方法,因爲我使用了很多,它使代碼更短,更易讀。
讓有爲什麼需要在不同的上下文中逃逸的快速回顧:
如果你是在一個引號分隔字符串,你需要能夠逃脫引號。 如果你是在XML中,則需要從「標記」 如果你在SQL,你需要的,如果你是在命令行中,從「數據」分離「命令」 單獨的「內容」,你需要單獨從「數據」
「命令」這是計算的一般一個非常基本的方面。因爲劃分數據的語法可能發生在數據中,所以需要有一種方法來區分DATA和SYNTAX,從而轉義。
在網頁編程,共同逃逸案件是:1。 輸出文本到HTML 2.輸出數據到HTML屬性 3.輸出HTML的成HTML 4.將數據插入到JavaScript 5.將數據插入SQL 6.將數據插入到外殼命令
如果處理不當每一個都有不同的安全隱患。這非常重要!讓我們回顧一下這個在PHP的背景:
文成HTML:用htmlspecialchars (...)
數據轉換成HTML屬性 用htmlspecialchars(...,ENT_QUOTES)
HTML轉換爲HTML 使用諸如HTMLPurifier之類的庫來確保只存在有效標籤。數據轉換成Javascript 我更喜歡json_encode
。如果你把它放在一個屬性,你仍然需要使用#2,如
將數據插入SQL 每個驅動程序都有某種形式的escape()函數。這是最好的。如果您正在使用正常的latin1字符集,則addslashes(...)是合適的。不要忘了周圍的和addslashes引號()調用:
「INSERT INTO table1的SET field1的=「」。 addslashes($ data)。「'」
數據在命令行 escapeshellarg()和escapeshellcmd()將 - 閱讀手冊
- 把這些對心臟,你會消除常見的95%*網絡安全風險! (*猜一猜)
你不應該在輸出上清理文本,它應該發生在輸入上。我使用過濾器來過濾應用程序的所有輸入。它是可配置的,以便它可以在需要時允許特定的標籤/數據通過(例如對於wysiwig編輯器)。
您應儘可能少地處理輸出文本,以確保速度。處理它一次會產生更少的應變,然後處理它500,000次。
爲什麼使用`ENT_QUOTES`(而不是我所建議的`ENT_NOQUOTES`)? – 2009-02-08 21:30:05
我使用ENT_QUOTES輸入來自數據庫的數據。因此,如果數據中有'或',它將不會關閉輸入標籤中的值變量。 – 2009-02-08 21:33:43