php - 为什么使用 mysql 准备好的语句比使用常见的转义函数更安全?

标签 php mysql security sql-injection prepared-statement

另一个问题中有一条评论如下:

"When it comes to database queries, always try and use prepared parameterised queries. The mysqli and PDO libraries support this. This is infinitely safer than using escaping functions such as mysql_real_escape_string."

Source

那么,我想问的是:为什么准备好的参数化查询更安全?

最佳答案

我认为这里的人们缺少的重要一点是,使用支持参数化查询的数据库,无需担心“转义”。数据库引擎不会将绑定(bind)的变量组合到 SQL 语句中,然后解析整个事情;绑定(bind)的变量是独立的,永远不会被解析为通用 SQL 语句。

这就是安全性和速度的来源。数据库引擎知道占位符仅包含数据,因此它永远不会被解析为完整的 SQL 语句。当您准备一条语句然后多次执行它时,速度就会提高;将多条记录插入同一个表的规范示例。这种情况下,数据库引擎只需要解析、优化等一次。

现在,一个问题是数据库抽象库。他们有时会通过将绑定(bind)变量插入到带有适当转义的 SQL 语句中来伪造它。不过,这比自己做要好。

关于php - 为什么使用 mysql 准备好的语句比使用常见的转义函数更安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/732561/

相关文章:

php - PHP 中的依赖注入(inject)

php - Laravel 不接受我的数据库输入

PHP MYSQL 检查行数据是否与

php - UTF-8 与 PHP DOMDocument loadHTML?

php - 连接到目标机器上的 mySql 数据库的问题

javascript - React 未捕获类型错误 : Cannot read property 'replace' of undefined

php - 为 Joomla 或 PHP 网站准备 Mysql 数据库

php - 这就是用 PHP 和 Ajax 防止 CSRF 所需要做的全部工作吗?

security - 让客户选择首选的 SSL/TLS 证书

security - 如何演示CSRF攻击