SQL注入的ORM防护是否绝对安全二阶SQL注入如何绕过ORM

SQL注入的ORM防护是否绝对安全二阶SQL注入如何绕过ORM
最新回答
銱儿鎯筜

2026-06-14 16:43:14

undefined
官网
罂语

2026-07-08 13:26:29

ORM参数化查询能防御标准SQL注入但并非绝对安全,二阶SQL注入先将恶意payload安全存入数据库,后续其他查询拼接该数据时触发注入,ORM的raw query和动态构造场景仍存在风险。
ORM防护原理:ORM使用预编译语句(PreparedStatement),SQL结构和参数分离——SQL模板先编译再绑定参数值,参数值只作数据处理不会被解析为SQL语法。如SQLAlchemy的session.query(User).filter(User.name == input)生成SELECT * FROM users WHERE name = ?参数绑定。ORM不安全的场景:一是raw query——session.execute(text(f"SELECT * FROM users WHERE name = '{input}'"))用了f-string拼接,绕过参数化。二是动态构造——ORM的order_by或table_name无法参数化,如果接受用户输入拼接表名/列名仍有注入风险。二阶SQL注入:用户注册时用户名输入admin'--,ORM安全存入数据库(参数化写入)。后台管理员查询用户详情时代码SELECT * FROM logs WHERE username = '${row.username}'从数据库读取username拼接SQL,触发注入。防御:所有SQL拼接处都用参数化,包括从数据库读取的值;输入验证白名单;使用ORM的高级查询API而非raw拼接。