2 回答

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