技术与生活 / 一篇记录
SQL 参数绑定,到底替你解决了什么?
参数绑定负责区分代码与数据,字符串拼接不能提供同等保障。
查询结构保持固定,把外部输入作为独立值交给驱动处理,就不会把引号等字符误当成 SQL 语法。这比手动替换引号更可靠,也让接口约束更清晰。
从一个例子看起
查询示例以 SQLite 为例;notes 为测试表,包含 id、title、score、category、created_at 字段。本例使用 Python sqlite3 的参数绑定接口。
cursor.execute('SELECT title FROM notes WHERE id = ?', (1,))
在 Python sqlite3 中传入不同类型并核对结果。
排查时再往前走一步
参数元组即使只有一个值,也要保留末尾逗号。动态选择列名或排序方式时,应在代码中使用允许列表,而不是尝试把标识符塞进值占位符。
参数绑定处理值的语法边界,却不会替你验证权限。用户传入另一个合法编号时,查询仍需要加入访问范围条件,确保结果属于当前用户可以查看的对象。
参数占位符不能直接替代任意表名或排序关键字。
参考:SQL 文档。