1 回答

TA貢獻(xiàn)1898條經(jīng)驗(yàn) 獲得超8個贊
輸入清理是一個誤導(dǎo)性術(shù)語,表示您可以對所有數(shù)據(jù)揮動魔杖并將其設(shè)為“安全數(shù)據(jù)”。問題是當(dāng)數(shù)據(jù)被不同的軟件解釋為編碼要求時,“安全”的定義會發(fā)生變化。同樣,“有效”數(shù)據(jù)的概念因上下文而異——您的數(shù)據(jù)很可能需要特殊字符('、、&、<)——請注意,SO 允許所有這些作為數(shù)據(jù)。
可以安全嵌入到 SQL 查詢中的輸出可能不安全地嵌入到 HTML 中。或斯威夫特。或 JSON。或外殼命令?;?CSV。并且剝離(或徹底拒絕)值以便它們可以安全地嵌入所有這些上下文(以及許多其他上下文)中,限制性太強(qiáng)。
那么我們應(yīng)該怎么做呢?確保數(shù)據(jù)永遠(yuǎn)不會造成損害。實(shí)現(xiàn)這一點(diǎn)的最佳方法是首先避免解釋數(shù)據(jù)。參數(shù)化 SQL 查詢就是一個很好的例子;參數(shù)永遠(yuǎn)不會被解釋為 SQL,它們只是作為數(shù)據(jù)放入數(shù)據(jù)庫中。
相同的數(shù)據(jù)可用于其他其他格式,例如 HTML。在這種情況下,數(shù)據(jù)應(yīng)在嵌入時針對該特定語言進(jìn)行編碼/轉(zhuǎn)義。因此,為了防止 XSS,數(shù)據(jù)在被放入輸出時應(yīng)該是 HTML 轉(zhuǎn)義(或 javascript 或 URL 轉(zhuǎn)義)。不是在輸入時。這同樣適用于其他嵌入情況。
那么,我們應(yīng)該直接將我們得到的任何東西傳遞給數(shù)據(jù)庫嗎?
不 - 您肯定可以檢查有關(guān)用戶輸入的內(nèi)容,但這高度依賴于上下文。讓我們稱其為 - 驗(yàn)證。確保這是在服務(wù)器上完成的。一些例子:
如果一個字段應(yīng)該是一個整數(shù),你當(dāng)然可以驗(yàn)證這個字段以確保它包含一個整數(shù)(或者可能是 NULL)。
您通??梢詸z查特定值是否是一組已知值中的一個(白名單驗(yàn)證)
您可以要求大多數(shù)字段具有最小和最大長度。
您通常應(yīng)該驗(yàn)證任何字符串僅包含對其編碼的有效字符(例如,沒有無效的 UTF-8 序列)
如您所見,這些檢查非常依賴于上下文。所有這些都是為了幫助增加您最終獲得有意義數(shù)據(jù)的幾率。它們不應(yīng)該是保護(hù)您的應(yīng)用程序免受惡意輸入(SQL 注入、XSS、命令注入等)的唯一防御,因?yàn)檫@不是這樣做的地方。
- 1 回答
- 0 關(guān)注
- 152 瀏覽
添加回答
舉報(bào)