Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如果使用MySQLi准备的语句,是否需要转义变量?_Php_Mysql_Mysqli_Prepared Statement - Fatal编程技术网

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

Php 如果使用MySQLi准备的语句,是否需要转义变量?,php,mysql,mysqli,prepared-statement,Php,Mysql,Mysqli,Prepared Statement,如果我使用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($con1, $_COOKIE['Session']); $

如果我使用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($con1, $_COOKIE['Session']);
$stmt = $con1->prepare("UPDATE Login SET Session='LoggedOut' where Session=?");
$stmt->bind_param('s',$Session);
$stmt->execute();
$stmt->close();
我是否仍然需要使用
mysqli\u real\u escape\u string()转义变量,如
$Session
如下所示:

$stmt = $con1->prepare("UPDATE Login SET Session='LoggedOut' where Session=?");
$stmt->bind_param('s',$Session);
$stmt->execute();
$stmt->close();
$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仍然允许存储在数据库中,因此如果您以后在没有参数化的情况下使用该数据,则您的应用程序是不安全的。

不可以。 这是你唯一需要的答案


另一个答案中所有的含糊其辞都是无关紧要的。这家伙想告诉你,如果你够傻,不到处使用事先准备好的陈述,那么你就有危险了。这是很明显的,与预先准备好的语句本身无关。

不,这就是为什么您使用预先准备好的语句作为旁注,使用名为
$Session
的变量以后可能会让您或其他人感到困惑。@aldanux@JiFus所以如果我理解正确,我就不能使用
mysqli_real_escape_string()和准备好的语句。因为我是一名实习生,我需要做的任务之一就是从
mysql.*
更新代码?我还想知道,在只有固定值的情况下,是否有必要使用一个预先准备好的语句?例如,有人需要批准或拒绝一个请求,该人得到的唯一输入是选择2个按钮approve和deny,每个按钮上都写入不同的值,这是固定的。我需要在那里使用事先准备好的声明吗?