php 如果使用MySQLi预准备语句,是否需要转义变量?[duplicate]

dpiehjr4  于 2023-03-11  发布在  PHP
关注(0)|答案(2)|浏览(174)

此问题在此处已有答案

Is mysql_real_escape_string() necessary when using prepared statements?(1个答案)
昨天关门了。
如果我使用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();
l7mqbcuq

l7mqbcuq1#

不,如果在应用程序中的任何地方都使用预准备语句,则不会发生SQL注入。
您必须对所有查询使用预准备语句,而不仅仅是处理用户输入的查询。如果您不这样做,您的应用程序仍然会有缺陷,并且容易受到二阶注入攻击,当一些查询使用预准备语句而其他查询不使用时,就会发生这种攻击。根据this对SO上类似问题的回答:
预准备语句/参数化查询足以防止该语句上的一阶注入。如果在应用程序中的其他任何地方使用未经检查的动态sql,则仍然容易受到二阶注入的攻击。
总之,预准备语句将发送的数据与SQL查询本身分隔开,确保数据不会被误解为SQL查询。但是,攻击者仍然可以将SQL作为数据输入,尽管如果使用预准备语句,在第一次存储SQL时不会执行SQL。当检索上述结果时,你仍然必须小心。2准备好的语句在那个特定的地方保护你的应用程序,但是因为SQL仍然被允许存储在数据库中,如果您以后使用该数据时没有进行参数化,则应用程序是不安全的。

mkshixfv

mkshixfv2#

不,你没有。

这是你唯一需要的答案
另一个答案中所有的混乱说法都是不相干的。这个人试图告诉你,如果你愚蠢到不到处使用事先准备好的陈述,那么你就有危险了。这是很明显的,而且与事先准备好的陈述本身无关。

相关问题