flawopen.com/SQL Injection/什么是参数化查询?
用大白话说,什么是参数化查询?
参考页面
通俗解释
想象一张带标签空格的表单:程序保持指令不变,并让数据库库把每个值放入对应空格。该库可以使用服务器端原生预处理,也可以在客户端模拟;但应用代码不应把用户输入改写进指令。
机制
使用服务器端原生预处理语句时,驱动会预处理带占位符的 SQL,并在执行时提供绑定值。具体协议和时序取决于数据库与驱动。有些驱动可以在客户端模拟预处理;PDO 明确记录了这种模式。因此,仅凭 API 调用无法判断值如何传输。应保持 SQL 结构固定,使用驱动文档说明的绑定 API,并确认当前使用的是原生还是模拟模式。
为什么这不同于"小心地转义"
手动转义要求应用代码在拼接前正确编码值;这种做法脆弱且依赖上下文。参数绑定 API 将值的处理交给驱动。服务器端原生预处理会通过独立的协议参数传值;模拟模式则由驱动在客户端处理占位符。不要把用户输入拼入应用自行构造的 SQL 字符串,并核对驱动文档说明的绑定行为。
FAQ
这和"预处理语句"是一回事吗?
密切相关——预处理语句是根据固定查询结构在数据库端创建的对象;参数化则是把值单独绑定到它上面的做法。这两个术语常被互换使用。
这适用于查询的每个部分吗?
只适用于值(数据),不适用于表名或列名之类的标识符——那些需要另一种防御,通常是白名单。