如果使用MySQLi预备语句,是否需要转义变量?

如果我使用MySQLi准备的语句,如下所示:

$stmt = $con1->prepare("UPDATE Login SET Session='LoggedOut' where Session=?");
$stmt->bind_param('s',$Session);
$stmt->execute();
$stmt->close();

我是否仍然需要像下面这样$Session变量进行转义mysqli_real_escape_string();

$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类似的问题:

准备好的语句/参数化查询足以防止对该语句进行一阶注入。如果在应用程序的其他任何地方使用未经检查的动态sql,则仍然容易受到二阶注入的攻击。

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如果使用 json_encode,是否需要转义用户输入?

Python是否支持MySQL预备语句?

PDO是否仍在模拟MySQL的预备语句?

我应该如何在Wordpress中将预备语句与查询中的变量一起使用?

我是否需要在第二个if语句中指定不使用第二个变量?如果是这样,怎么办?

致命错误:mysqli_sql_exception未捕获:查询/预备语句SELECT * FROM产品中未使用索引

如果使用准备好的语句,是否需要过滤/清理输入?

与带有转义/引号参数的插值语句相比,具有绑定参数的预备语句的原因

如果在if / else语句中定义了变量,是否可以使用var?

如果使用变量作为条件的语句

如果未设置语句对象,是否需要调用PDOStatement :: closeCursor()?

如果我的输出变量是二进制的,是否需要使用one_hot编码?

使用选项类型是否消除对if语句的需要?

Mysqli到PDO-如果使用else语句尝试捕获

预备语句Mysql

SQL预备语句

如何使用带预备语句的通配符%选择喜欢

如果使用Express,是否需要Nginx

如果使用CoreData,是否需要缓存

查询使用SQL变量时Mysqli PHP准备的语句

如果语句更新变量

是否需要声明函数变量(使用Javascript)?

我是否需要mysqli_string_escape语句来避免SQL注入

使用Printf转义变量

在if语句中,如果我给变量赋值,是否必须在else语句中再次做?

如果需要语句逻辑帮助

如果语句Laravel需要修复

MySqli准备的语句在执行语句时不使用更新的变量值

预备语句在查询时失败