把用户输入直接拼进SQL文本,会混淆查询结构与数据。参数绑定让驱动按数据处理相应值,是数据库访问中的基础防护,但不代表所有权限问题都已经解决。

结构和取值分开传递
下面使用Python内置SQLite在内存中创建练习表,通过问号占位符传入名称。名称里包含单引号仍作为普通数据保存与查找。不要用手工替换引号的方式替代驱动提供的参数机制。
表名和排序字段另作约束
参数占位通常用于值,不是任意SQL语法片段。需要用户选择排序字段时,应从应用允许的固定字段中映射,而不是把输入直接插入语句。查询返回哪些记录,也仍需要遵守当前账户的权限。
示例只验证安全的数据传递
本例不连接任何服务器,也不使用攻击载荷。实际项目应核对驱动的占位符形式、错误处理和事务要求。参数化查询与最小数据库权限、敏感错误信息控制相互配合,不能仅凭一处改动宣称全站已安全。
可以运行的练习
import sqlite3
connection = sqlite3.connect(":memory:")
try:
connection.execute("CREATE TABLE notes (name TEXT)")
name = "O'Reilly"
connection.execute("INSERT INTO notes VALUES (?)", (name,))
result = connection.execute("SELECT name FROM notes WHERE name = ?", (name,)).fetchall()
assert result == [(name,)]
print(result)
finally:
connection.close()
示例已在本地隔离环境运行检查。使用固定输入,不访问外部接口,也不读取真实业务文件。
资料与继续学习
OWASP:参数化查询防护。资料查阅日期:2026年9月27日。步骤与练习由本站整理。
资料查阅与编辑日期:2026年9月27日。作者:玖柒。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END








