gpt4 book ai didi

php - bind_param() 仅对用户输入的值或全部是必要的?

转载 作者:行者123 更新时间:2023-11-29 03:48:02 27 4
gpt4 key购买 nike

我一直在阅读 SQL 注入(inject),但我找不到这个问题的答案。

我明白如果我这样查询

prepare("SELECT id, foo, bar FROM table WHERE username = ?");

然后我应该使用 bind_param('s', $username) 来避免 SQL 注入(inject)的可能性。

但是,如果我在不是用户输入而是自动生成的 ID 之类的东西上运行我的查询怎么办?示例:

prepare("SELECT username, foo, bar from table where id = ?");

其中 id 是自生成的(自动递增的值)。我是否也必须在这里使用 bind_param('i', $id) 还是我可以将查询准备为:

prepare("SELECT username, foo, bar from table where id = '$id'");

如果需要 bind_param();,为什么?

谢谢!

最佳答案

从技术上讲,如果您不准备并非来自用户输入的数据,就不会面临风险。但是,出于以下几个原因,强烈建议您这样做:

  1. 如果您忘记在某处准备任何用户输入数据,则该用户可能会向数据行中注入(inject)您不希望成为用户输入的内容。
  2. 最好重复您正在做的事情来确保您的服务器安全。如果您开始混淆,您很可能会忘记在实际需要的地方准备数据。
  3. 准备数据不仅仅是为了防止攻击者进行 SQL 注入(inject)。如果您不小心在代码中创建错误,它还会防止一些数据库问题。例如:

在您的代码中的某处,您有一个日志系统,该系统将错误日志添加到您的数据库中。该字符串将是:

Error: User "xxx" with IP "x.x.x.x" used a wrong password.


该字符串由您的脚本生成。所以你不准备它。然而,此字符串中的引号会导致您的数据库出现错误,如果您准备好它,这些错误本来是可以避免的。

关于php - bind_param() 仅对用户输入的值或全部是必要的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31230504/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com