2 回答

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