【问题标题】:Do I need to escape my variables if I use MySQLi prepared statements?如果我使用 MySQLi 准备好的语句,是否需要转义变量?
【发布时间】:2014-09-03 04:34:24
【问题描述】:

如果我使用 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();

【问题讨论】:

  • 不,这就是你使用准备好的语句的原因
  • 附带说明一下,拥有一个名为 $Session 的变量将来可能会让您或其他人感到困惑。
  • @aldanux @JiFus 所以如果我理解正确,我不能将mysqli_real_escape_string(); 与准备好的语句一起使用。因为我是实习生,我需要做的任务之一是从mysql_* 更新代码?而且我还想知道是否有必要在只有固定值的情况下使用准备好的语句?例如,有人需要批准或拒绝请求,而该人获得的唯一输入是选择 2 个按钮批准和拒绝,每个按钮写入不同的值,这些值是固定的。我需要在那里使用准备好的语句吗?

标签: php mysql mysqli prepared-statement


【解决方案1】:

不,如果您在应用程序中的任何地方都使用准备好的语句,那么您可以安全地避免 SQL 注入。然而,一个重要的“陷阱”是二阶注入攻击,当某些查询使用准备好的语句而其他查询不使用时,就会发生这种攻击。

根据this对SO类似问题的回答:

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

总之,准备好的语句将发送的数据与 SQL 查询本身分开,确保数据不会被误解为 SQL 查询。但是,攻击者仍然可以将 SQL 作为数据输入,并且如果您使用准备好的语句,虽然它在首次存储时不会执行,但在检索所述结果时仍然必须小心。准备好的语句在该特定位置保护您的应用程序,但由于仍然允许将 SQL 存储在数据库中,因此如果您稍后在没有参数化的情况下使用该数据,则您的应用程序是不安全的。

【讨论】:

    【解决方案2】:

    不,你没有。

    这是您需要的唯一答案。

    其他答案中所有混乱的谈话都是无关紧要的。那家伙试图告诉你,如果你愚蠢到不到处使用准备好的语句,那么你就有危险了。这很明显,与准备好的语句本身无关。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-08
      • 1970-01-01
      • 2012-12-01
      • 2012-03-26
      相关资源
      最近更新 更多