php - 为什么准备好的语句可以防止注入(inject)?

标签 php mysql sql-injection

我已经对准备好的语句有了基本的了解,并且我知道它们可以防止 SQL 注入(inject)攻击。但我还不明白为什么他们可以防御上述攻击。我知道也有人提出类似的问题,但我没有找到完全令人满意的答案。

示例 - 非常不安全的代码
所以这里我们有与数据库通信的最基本的方法:

$query = "SELECT * FROM users where id=$username";

在没有任何保护的情况下,用户可以输入恶意代码,从而“欺骗”数据库引擎执行毁灭性的查询:

$username = "1; DROP TABLE users;"
SELECT * FROM users where id=1; DROP TABLE users;

我不明白的是准备好的语句如何设法“过滤掉”此类数据。它背后的机制是什么,不会诱使数据库生成如上所示的 SQL 查询?就像转义某些字符一样简单,例如上面示例中的分号,还是更复杂?

如果我要像示例中那样进行精确的注入(inject)攻击,但通过准备好的语句运行它,什么样的命令字符串将到达数据库引擎?

最佳答案

准备好的语句不只是添加文本,它们将其作为数据发送,并让数据库单独处理它。因为实际上数据库并不真正使用 SQL 语句,而是使用它们的“编译”版本。

不太确定我是否清楚,但这取决于查询如何发送到数据库。

关于php - 为什么准备好的语句可以防止注入(inject)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11216823/

相关文章:

php - SQL注入(inject)-通过URL访问

php - CakePHP 是否有内置函数来检查 MySQL 注入(inject)?

c# - 防止SQL注入(inject)

php - Laravel ClassLoader 包含一个不正确/旧的文件

php - Laravel队列-在特定条件下防止作业重试

php - Elasticsearch 评分始终为 0

mysql - 如何在MySQL和phpMyAdmin的两个不同数据库中定义外键

php - 我可以在 MYSQL 查询中使用 '$_POST(s)' 字符串吗?

php - 从 XML 文件中检索 URL 并将 URL 中的数据收集到我的数据库 - PHP/cURL/XML

mysql - 查找 MySQL 表之间的差异,仅返回特定列已更改的行