加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php – 如果我使用MySQLi预处理语句,我是否需要转义我的变量?

发布时间:2020-12-13 13:23:17 所属栏目:PHP教程 来源:网络整理
导读:如果我使用 MySQLi准备好的语句,如下所示: $stmt = $con1-prepare("UPDATE Login SET Session='LoggedOut' where Session=?");$stmt-bind_param('s',$Session);$stmt-execute();$stmt-close(); 我是否还需要使用mysqli_real_escape_string()来转义$Session
如果我使用 MySQLi准备好的语句,如下所示:
$stmt = $con1->prepare("UPDATE Login SET Session='LoggedOut' where Session=?");
$stmt->bind_param('s',$Session);
$stmt->execute();
$stmt->close();

我是否还需要使用mysqli_real_escape_string()来转义$Session等变量;如下:

$Session = mysqli_real_escape_string($con1,$_COOKIE['Session']);
$stmt = $con1->prepare("UPDATE Login SET Session='LoggedOut' where Session=?");
$stmt->bind_param('s',$Session);
$stmt->execute();
$stmt->close();
不,如果您在应用程序中的任何地方使用预准备语句,则可以安全地进行SQL注入.然而,一个重要的“陷阱”是二阶段注入攻击,当某些查询使用预处理语句而其他查询不使用时,会发生这种情况.

根据关于SO的类似问题的this回答:

prepared statements / parameterized queries are sufficient to prevent 1st order injection on that statement. If you use un-checked dynamic sql anywhere else in your application you are still vulnerable to 2nd order injection.

总之,预处理语句在发送的数据和SQL查询本身之间创建了一个分隔,确保数据不会被误解为SQL查询.但是,攻击者仍然可以将SQL作为数据输入,虽然在使用预准备语句时首次存储它时不会执行,但在检索结果时仍必须谨慎.准备好的语句可以保护您在该特定位置的应用程序,但由于SQL仍然允许存储在数据库中,因此如果您以后在没有参数化的情况下使用该数据,则您的应用程序是不安全的.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读