数据库注入(为什么 ORM、MyBatis、EF Core 有时仍然会产生 SQL 注入?)

数据库注入(为什么 ORM、MyBatis、EF Core 有时仍然会产生 SQL 注入?)

数据库注入的问题你了解吗,本站通过大数据汇集了数据库注入的相关解答,希望对你有所帮助。



“我用了 ORM(MyBatis、EF Core、Hibernate),SQL 注入就自动消失了。”

原因很简单:ORM 不是防注入工具,ORM 只是 SQL 的生成器。它能帮你写 SQL,但不会替你判断“哪些是用户输入”。

一、ORM 能防的,是“参数化场景”;防不了的,是“字符串拼接场景”

ORM 的核心思想是在内部帮你做:

SELECT * FROM users WHERE name = @p0

参数自动绑定,确实能防注入。

但问题来了——只要你让 ORM 进入“拼接模式”,风险就直接回来了。

例如 MyBatis:

SELECT * FROM users WHERE name = ${name}

这就是直接把字符串塞进 SQL,和手写拼接没区别。

同样的,在 EF Core 中:

context.Users.FromSqlRaw($"SELECT * FROM Users WHERE Name = '{name}'");

这也是纯注入。

ORM 可以保证自身生成的 SQL 是安全的,但它无法保证你写的那段字符串是安全的。

一旦开发者绕过参数绑定,ORM 就彻底失去了防注入能力。

数据库注入(为什么 ORM、MyBatis、EF Core 有时仍然会产生 SQL 注入?)

动态排序字段 ORDER BY ${sort}动态列名动态表名动态过滤条件模糊搜索的拼接用户可配置的 SQL 片段

ORM 不是安全工具,它只是代码生成工具。

因为参数化只能绑定“值”,却不能绑定:

表名列名排序字段SQL 运算符(> < LIKE 等)SQL 关键字

这些必须拼接,而只要拼接,就会有注入风险。

ORM 再强,也无法把“数据库结构”当成参数绑定。

四、错误的误解:以为 ORM 就是“自动安全”

很多开发者把 ORM 当成安全框架,于是放心大胆地拼接。

但 ORM 的安全能力永远只有一条:

你用参数,它就安全;你用拼接,它就和 JDBC、ADO.NET 一样危险。

五、ORM 避免不了注入,但你可以

ORM 不能帮你做的事情:

所以 ORM 并不是防注入系统,它只是帮你写 SQL。

真正防注入的原则永远只有一条:

所有输入值必须参数化;所有结构性内容必须白名单。

这也是 ORM、MyBatis、EF Core 仍然会产生 SQL 注入的根本原因。

关于数据库注入的内容到此结束,希望对大家有所帮助。

文章版权声明:除非注明,否则均为边学边练网络文章,版权归原作者所有

相关阅读