2009-02-08 75 views

回答

10

我通常在輸入字段使用

htmlspecialchars($var, ENT_QUOTES) 

。我創建了一個這樣做的方法,因爲我使用了很多,它使代碼更短,更易讀。

+1

爲什麼使用`ENT_QUOTES`(而不是我所建議的`ENT_NOQUOTES`)? – 2009-02-08 21:30:05

+2

我使用ENT_QUOTES輸入來自數據庫的數據。因此,如果數據中有'或',它將不會關閉輸入標籤中的值變量。 – 2009-02-08 21:33:43

7

讓有爲什麼需要在不同的上下文中逃逸的快速回顧:

如果你是在一個引號分隔字符串,你需要能夠逃脫引號。 如果你是在XML中,則需要從「標記」 如果你在SQL,你需要的,如果你是在命令行中,從「數據」分離「命令」 單獨的「內容」,你需要單獨從「數據」

「命令」這是計算的一般一個非常基本的方面。因爲劃分數據的語法可能發生在數據中,所以需要有一種方法來區分DATA和SYNTAX,從而轉義。

在網頁編程,共同逃逸案件是:1。 輸出文本到HTML 2.輸出數據到HTML屬性 3.輸出HTML的成HTML 4.將數據插入到JavaScript 5.將數據插入SQL 6.將數據插入到外殼命令

如果處理不當每一個都有不同的安全隱患。這非常重要!讓我們回顧一下這個在PHP的背景:

  1. 文成HTML:用htmlspecialchars (...)

  2. 數據轉換成HTML屬性 用htmlspecialchars(...,ENT_QUOTES)

  3. HTML轉換爲HTML 使用諸如HTMLPurifier之類的庫來確保只存在有效標籤。數據轉換成Javascript 我更喜歡json_encode。如果你把它放在一個屬性,你仍然需要使用#2,如

  4. 將數據插入SQL 每個驅動程序都有某種形式的escape()函數。這是最好的。如果您正在使用正常的latin1字符集,則addslashes(...)是合適的。不要忘了周圍的和addslashes引號()調用:

    「INSERT INTO table1的SET field1的=「」。 addslashes($ data)。「'」

  5. 數據在命令行 escapeshellarg()和escapeshellcmd()將 - 閱讀手冊

- 把這些對心臟,你會消除常見的95%*網絡安全風險! (*猜一猜)

-5

你不應該在輸出上清理文本,它應該發生在輸入上。我使用過濾器來過濾應用程序的所有輸入。它是可配置的,以便它可以在需要時允許特定的標籤/數據通過(例如對於wysiwig編輯器)。

您應儘可能少地處理輸出文本,以確保速度。處理它一次會產生更少的應變,然後處理它500,000次。

相關問題