代码之家  ›  专栏  ›  技术社区  ›  Anu

我们应该总是在mysql和php中使用准备好的语句,还是在什么时候使用这些语句?

  •  1
  • Anu  · 技术社区  · 6 年前

    我读了很多文章说,使用准备好的语句是非常安全的,并且很好地防止SQL注入。我建立了一些网站,没有使用准备好的声明。但是在阅读了所有这些文章之后,我想用准备好的语句来修改整个代码。

    我的问题

    是否需要始终使用准备好的语句?或者,是否有任何情况下,正常的陈述将是充分的过度准备的陈述?

    2 回复  |  直到 6 年前
        1
  •  4
  •   Bill Karwin    6 年前

    如果您有一个完全硬编码的SQL查询,并且SQL中不需要PHP变量,那么不准备语句就足够了。

    下面是一个例子:

    $result = $mysqli->query("SELECT * FROM mytable WHERE updated_at > NOW() - INTERVAL 7 DAY");
    

    查询是独立的。它只是一个固定的字符串,完全由应用程序控制。任何不受信任的内容都不会影响查询。

    如果查询需要一些变量部分,请使用查询参数,如下所示:

    $stmt = $mysqli->prepare("SELECT * FROM mytable WHERE updated_at > NOW() - INTERVAL ? DAY");
    $stmt->bind_param("i", $number_of_days);
    $stmt->execute();
    

    查询参数的作用是将可能不受信任的内容从SQL解析步骤中分离出来。通过使用参数,绑定变量的值在解析SQL之前不会与查询组合。因此,绑定参数不可能影响查询逻辑。该参数将被限制为查询中的单个标量值。

        2
  •  1
  •   Sanu_012    6 年前

    刚发现你的问题,我就想起了过去的美好时光。我也发现实现准备好的语句很困难,因为乍一看,没有它就很容易编码。然后在另一个时候,我用PHP创建了一个登录系统,我为此感到自豪。它感觉很好,尽管它完全从头开始。但是,我犯了一个错误,不使用它们,然后我检查了谷歌如何绕过登录系统。第一个技巧让我头疼,因为我现在不知道用户名或密码就可以登录到我的网页,只需要使用一些字符,比如 '-' 然后我进入了我的网页。所以我回到过去,用参数化查询保护它,现在它是安全的。既然你我都是初学者,这些事情肯定会让我们头疼。此外,只有在接受用户输入的内容时,才需要使用它们。否则你就可以走了。只需四处查看其他漏洞,如XSS等。这些漏洞也很危险。祝你好运