5 回答

TA貢獻(xiàn)2036條經(jīng)驗(yàn) 獲得超8個(gè)贊
這是一種常見(jiàn)的誤解,即用戶輸入可以被過(guò)濾。PHP甚至還有一個(gè)(現(xiàn)已棄用的)“功能”,稱為魔術(shù)引號(hào),它建立在這個(gè)想法的基礎(chǔ)之上。這是胡說(shuō)八道。忘記過(guò)濾(或清潔,或任何人稱之為)。
為了避免出現(xiàn)問(wèn)題,你應(yīng)該做的很簡(jiǎn)單:每當(dāng)你在外國(guó)代碼中嵌入一個(gè)字符串時(shí),你必須根據(jù)該語(yǔ)言的規(guī)則來(lái)逃避它。例如,如果在某些SQL目標(biāo)MySql中嵌入字符串,則必須為此目的使用MySql函數(shù)轉(zhuǎn)義字符串(mysqli_real_escape_string
)。(或者,對(duì)于數(shù)據(jù)庫(kù),如果可能,使用預(yù)處理語(yǔ)句是更好的方法)
另一個(gè)例子是HTML:如果在HTML標(biāo)記中嵌入字符串,則必須使用它進(jìn)行轉(zhuǎn)義htmlspecialchars
。這意味著每個(gè)單詞echo
或print
語(yǔ)句都應(yīng)該使用htmlspecialchars
。
第三個(gè)例子可能是shell命令:如果你要將字符串(例如參數(shù))嵌入到外部命令中,并用它們調(diào)用它們exec
,那么你必須使用escapeshellcmd
和escapeshellarg
。
等等等等 ...
您需要主動(dòng)過(guò)濾數(shù)據(jù)的唯一情況是,您是否接受預(yù)先格式化的輸入。例如。如果您允許用戶發(fā)布HTML標(biāo)記,那么您計(jì)劃在網(wǎng)站上顯示該標(biāo)記。但是,你應(yīng)該不惜一切代價(jià)避免這種情況,因?yàn)闊o(wú)論你如何過(guò)濾它,它總是一個(gè)潛在的安全漏洞。

TA貢獻(xiàn)1744條經(jīng)驗(yàn) 獲得超4個(gè)贊
不可以。如果沒(méi)有任何上下文,您無(wú)法對(duì)數(shù)據(jù)進(jìn)行一般過(guò)濾。有時(shí)您想要將SQL查詢作為輸入,有時(shí)您希望將HTML作為輸入。
您需要過(guò)濾白名單上的輸入 - 確保數(shù)據(jù)符合您期望的某些規(guī)范。然后,您需要在使用它之前將其轉(zhuǎn)義,具體取決于您使用它的上下文。
轉(zhuǎn)義SQL數(shù)據(jù)的過(guò)程 - 防止SQL注入 - 與轉(zhuǎn)換(X)HTML數(shù)據(jù)的過(guò)程非常不同,以防止XSS。

TA貢獻(xiàn)1794條經(jīng)驗(yàn) 獲得超7個(gè)贊
不,那里沒(méi)有。
首先,SQL注入是一個(gè)輸入過(guò)濾問(wèn)題,XSS是一個(gè)輸出轉(zhuǎn)義問(wèn)題 - 所以你甚至不會(huì)在代碼生命周期中同時(shí)執(zhí)行這兩個(gè)操作。
基本的經(jīng)驗(yàn)法則
對(duì)于SQL查詢,綁定參數(shù)(與PDO一樣)或?qū)Σ樵冏兞渴褂抿?qū)動(dòng)程序本機(jī)轉(zhuǎn)義函數(shù)(例如
mysql_real_escape_string()
)使用
strip_tags()
過(guò)濾掉不需要的HTMLhtmlspecialchars()
在此處轉(zhuǎn)義所有其他輸出并注意第二和第三參數(shù)。
- 5 回答
- 0 關(guān)注
- 655 瀏覽
添加回答
舉報(bào)