防止PHP中的SQL注入攻击



我想防止SQL对这段PHP代码的攻击(这只是课堂上的练习(。通过将@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());
}

我该怎么解决这个问题?

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)

相关内容

  • 没有找到相关文章