此问题在此处已有答案:
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();
2条答案
按热度按时间l7mqbcuq1#
不,如果在应用程序中的任何地方都使用预准备语句,则不会发生SQL注入。
您必须对所有查询使用预准备语句,而不仅仅是处理用户输入的查询。如果您不这样做,您的应用程序仍然会有缺陷,并且容易受到二阶注入攻击,当一些查询使用预准备语句而其他查询不使用时,就会发生这种攻击。根据this对SO上类似问题的回答:
预准备语句/参数化查询足以防止该语句上的一阶注入。如果在应用程序中的其他任何地方使用未经检查的动态sql,则仍然容易受到二阶注入的攻击。
总之,预准备语句将发送的数据与SQL查询本身分隔开,确保数据不会被误解为SQL查询。但是,攻击者仍然可以将SQL作为数据输入,尽管如果使用预准备语句,在第一次存储SQL时不会执行SQL。当检索上述结果时,你仍然必须小心。2准备好的语句在那个特定的地方保护你的应用程序,但是因为SQL仍然被允许存储在数据库中,如果您以后使用该数据时没有进行参数化,则应用程序是不安全的。
mkshixfv2#
不,你没有。
这是你唯一需要的答案
另一个答案中所有的混乱说法都是不相干的。这个人试图告诉你,如果你愚蠢到不到处使用事先准备好的陈述,那么你就有危险了。这是很明显的,而且与事先准备好的陈述本身无关。