我已经对准备好的语句有了基本的了解,并且我知道它们可以防止SQL注入攻击。但是我还没有理解为什么它们可以抵御上述攻击。我知道有人问过类似的问题,但我没有找到完全令人满意的答案。
示例-非常不安全的代码
因此,这里我们有与数据库通信的最基本方法:
$query = "SELECT * FROM users where id=$username";
在没有任何保护的情况下,用户可以输入恶意代码,从而“欺骗”数据库引擎以执行破坏性查询:
$username = "1; DROP TABLE users;"
SELECT * FROM users where id=1; DROP TABLE users;
我不明白的是,准备好的语句如何设法“过滤”出此类数据。背后的机制是什么,它不会诱使数据库生成如上所述的SQL查询?就像转义某些字符一样简单,例如上例中的分号,还是更复杂?
如果要像示例中那样进行精确的注入攻击,但是通过一条准备好的语句运行它,那么哪种命令字符串将到达数据库引擎?
最佳答案
准备好的语句不只是添加文本,它们还以数据形式发送数据,并让数据库单独处理它。因为实际上数据库实际上并不使用SQL语句,所以它使用了它们的“编译”版本。
不太确定我是否清楚,但这取决于如何将查询发送到数据库。
关于php - 为什么准备好的声明可以防止注入(inject)?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11216823/