Php 如果使用MySQLi准备的语句,是否需要转义变量?
如果我使用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']); $
$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,每个按钮上都写入不同的值,这是固定的。我需要在那里使用事先准备好的声明吗?