我想防止對這段 PHP 代碼的 SQL 攻擊(這只是課堂練習)。這可以很容易地通過設置@mail等于類似的東西來利用'); DROP TABLE PURCHASE; --$db = new SQLite3 ($db_name);$sql = sprintf ("INSERT INTO PURCHASE (quantity, name, password, mail) VALUES ('%s', '%s', '%s', '%s')\n", $Quantity, $Name, $Password, $Mail );echo $sql;if (!$db->exec ($sql)) { throw new Exception($db->lastErrorMsg());}我試圖通過傳遞這樣的參數來防止這種情況發生,但我得到了500 Internal Server Error$db = new SQLite3 ($db_name);$sql = $db->prepare("INSERT INTO PURCHASE(quantity, name, password, mail) VALUES (:Quantity, :Name, :Password, :Mail)");$sql->bindValue(':Quantity', $Quantity, SQLITE3_TEXT);$sql->bindValue(':Name', $Name, SQLITE3_TEXT);$sql->bindValue(':Password', $Password, SQLITE3_TEXT);$sql->bindValue(':Mail', $Mail, SQLITE3_TEXT);echo $sql;if (!$db->exec ($sql)) { throw new Exception($db->lastErrorMsg());}我怎樣才能解決這個問題?
1 回答

明月笑刀無情
TA貢獻1828條經驗 獲得超4個贊
SQLite3::exec
用于執行查詢字符串,而不是準備好的語句。您需要改為使用SQLite3Stmt::execute
。改變:
if (!$db->exec ($sql)) {
throw new Exception($db->lastErrorMsg());
}
到
if (!$sql->execute()) {
throw new Exception($db->lastErrorMsg());
}
請注意你不能echo $sql,因為它是一個對象,而不是一個簡單的類型。如果您想查看SQLite3Stmt對象的外觀,則需要print_r($sql)或var_dump($sql)。
- 1 回答
- 0 關注
- 83 瀏覽
添加回答
舉報
0/150
提交
取消