为什么使用mysql预处理语句比使用常见转义函数更安全?

Joã*_*nho 27 php mysql security sql-injection prepared-statement

在另一个问题中有评论说:

"当谈到数据库查询时,总是尝试使用准备好的参数化查询.mysqli和PDO库支持这一点.这比使用诸如mysql_real_escape_string之类的转义函数更安全."

资源

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

Mad*_*der 47

我认为人们缺少的一个重点是,使用支持参数化查询的数据库,没有"逃避"担心.数据库引擎不会将绑定变量组合到SQL语句中,然后解析整个事物; 绑定变量保持独立,永远不会被解析为通用SQL语句.

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

现在,有一个问题是数据库抽象库.他们有时通过将绑定的变量插入到具有正确转义的SQL语句中来伪造它.不过,这比自己做的更好.


ale*_*lex 7

首先,你要将危险的角色逃离到数据库,这比人类更安全.

...它不会忘记逃避,或错过任何可用于注入恶意SQL的特殊字符.更不用说,您可能会在启动时获得性能提升!


Unk*_*own 5

我并不是非常精通安全,但这里有一个解释,我希望能帮助你:

假设你有一个声明如下:

从mydb中选择[integer]

假装准备它时,语句在我们想象的sql实现中被编译为字节.

           01                  00 00                  23
Opcode for select          Prepared bytes      number of "mydb"
                          for your integer
Run Code Online (Sandbox Code Playgroud)

现在执行时,您将把数字插入为预备语句保留的空间.

比较它,如果你只是使用转义,你可能会在那里插入尽可能多的乱码,并可能导致内存溢出,或一些bizzare sql命令,他们忘了逃避.