2 回答

TA貢獻(xiàn)1880條經(jīng)驗(yàn) 獲得超4個(gè)贊
任何查詢都可以被注入,無(wú)論是讀取還是寫(xiě)入,持久性還是瞬時(shí)性??梢酝ㄟ^(guò)結(jié)束一個(gè)查詢并運(yùn)行一個(gè)單獨(dú)的查詢(可能帶有mysqli)來(lái)執(zhí)行注入,這會(huì)使所需的查詢變得無(wú)關(guān)緊要。
來(lái)自外部源的查詢的任何輸入,無(wú)論是來(lái)自用戶還是內(nèi)部的輸入,都應(yīng)視為該查詢的參數(shù)以及該查詢上下文中的參數(shù)。查詢中的任何參數(shù)都需要參數(shù)化。這會(huì)導(dǎo)致參數(shù)化查詢正確,您可以從中創(chuàng)建準(zhǔn)備好的語(yǔ)句并使用參數(shù)執(zhí)行。例如:
SELECT col1 FROM t1 WHERE col2 = ?
?是參數(shù)的占位符。使用mysqli,您可以使用創(chuàng)建一個(gè)準(zhǔn)備好的語(yǔ)句,使用來(lái)prepare將變量(參數(shù))綁定到參數(shù)bind_param,然后使用來(lái)運(yùn)行查詢execute。您根本不需要清理參數(shù)(實(shí)際上這樣做是有害的)。 mysqli為您做到這一點(diǎn)。整個(gè)過(guò)程將是:
$stmt = mysqli->prepare("SELECT col1 FROM t1 WHERE col2 = ?");
$stmt->bind_param("s", $col2_arg);
$stmt->execute();
參數(shù)化查詢和預(yù)備語(yǔ)句之間也有重要區(qū)別。該語(yǔ)句在準(zhǔn)備時(shí)并未進(jìn)行參數(shù)化,因此容易注入:
$stmt = mysqli->prepare("INSERT INTO t1 VALUES ($_POST[user_input])");
總結(jié)一下:
所有查詢都應(yīng)正確參數(shù)化(除非它們沒(méi)有參數(shù))
不論其來(lái)源如何,查詢的所有參數(shù)都應(yīng)被視為具有敵意
添加回答
舉報(bào)