为了账号安全,请及时绑定邮箱和手机立即绑定

防止PHP中的SQL注入攻击

防止PHP中的SQL注入攻击

PHP
小唯快跑啊 2022-12-30 16:00:19
我想防止对这段 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)。


查看完整回答
反对 回复 2022-12-30
  • 1 回答
  • 0 关注
  • 63 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信