Comments (23)
mybatis-plus 中的 wrapper 不是面向用户的,就像 jdbc 一样,完全信任程序员。一般情况下,用户都不应该能直接与 wrapper 存在交互。
我们不会也没有办法来纠正程序员本身的行为造成的错误!在基础设施层增加不必要的校验会有各种问题出现,自由度也会降低。
from mybatis-plus.
其实官方把方法的名字改了不就好了。 比如ruby方法名字加个! 那样,名字加一个admin(AdminUpdate)之类.
为啥不想着更好的方法呢? 类似的方法本来就极为容易混淆。 不想着改进。天天强调我没错,我没有bug,我没有cve。有意义吗?
1+1=2也要人提醒?
from mybatis-plus.
CVE权威受到我的质疑了
SpringBoot引入的snakeyaml包也有类似的恶意CVE,被开发者直接挂在主页怼:https://github.com/snakeyaml/snakeyaml
两码事,snakeyaml包那个CVE是纯后端故意改,外部不可能改的,所以才被挂上去。这个不一样,可以从前端注入的。不要说什么程序员低级之类的话,很多知名后端知名admin都中过奖,比如JeecgBoot,被开过很多这种SQL注入CVE,较真的讲,都是MybatisPlus的Wrapper没做安全性检查,只不过没甩锅到MyBatisPlus这边罢了。对很多很早用MyBatisPlus的项目来讲,特别是MyBatisPlus还没有引入LambdaWrapper的时候,是有很多历史包袱再里面,为开发方便Request参数直接传进Wrapper很常见的。不要指望程序员有怎么高的安全意识,1+1=2也要人提醒之类的,要不然也不会有Log4j的惊天大漏洞。
那你意思是为了小水坑放弃一片大海是吧?有LambdaWrapper只是为了省事又不是为了强字段,你没用过eq("函数(字段)","值")不代表不存在
不是小水坑,是大水坑。这种开发其实并不少见。 很多大型企业都是有购买安全服务,其中就包含CVE检查,虽然很少有细到工具包,但是影响大的CVE还是有的,比如log4j的那个漏洞。MybatisPlus虽然是mybatis增强工具中起的最早最有名气的一个,但也不是不可替换的。如果因为这个问题而失去大批企业市场值得吗?真的要甩锅程序员低级,也应该默认把这个功能给关掉,而不是在文档豆腐大的地方加个提醒就完事的。
屁股决定脑袋,看你这回复就是被所谓的大企业领导催的不行了,唯招标论,无非是想绑架社区快点出包升级而已,不然不好交差。
from mybatis-plus.
MybatisPlus 最新漏洞 CVE-2024-35548 申明
from mybatis-plus.
CVE权威受到我的质疑了
from mybatis-plus.
CVE权威受到我的质疑了
SpringBoot引入的snakeyaml包也有类似的恶意CVE,被开发者直接挂在主页怼:https://github.com/snakeyaml/snakeyaml
两码事,snakeyaml包那个CVE是纯后端故意改,外部不可能改的,所以才被挂上去。这个不一样,可以从前端注入的。不要说什么程序员低级之类的话,很多知名后端知名admin都中过奖,比如JeecgBoot,被开过很多这种SQL注入CVE,较真的讲,都是MybatisPlus的Wrapper没做安全性检查,只不过没甩锅到MyBatisPlus这边罢了。对很多很早用MyBatisPlus的项目来讲,特别是MyBatisPlus还没有引入LambdaWrapper的时候,是有很多历史包袱再里面,为开发方便Request参数直接传进Wrapper很常见的。不要指望程序员有怎么高的安全意识,1+1=2也要人提醒之类的,要不然也不会有Log4j的惊天大漏洞。
from mybatis-plus.
from mybatis-plus.
CVE权威受到我的质疑了
SpringBoot引入的snakeyaml包也有类似的恶意CVE,被开发者直接挂在主页怼:https://github.com/snakeyaml/snakeyaml
两码事,snakeyaml包那个CVE是纯后端故意改,外部不可能改的,所以才被挂上去。这个不一样,可以从前端注入的。不要说什么程序员低级之类的话,很多知名后端知名admin都中过奖,比如JeecgBoot,被开过很多这种SQL注入CVE,较真的讲,都是MybatisPlus的Wrapper没做安全性检查,只不过没甩锅到MyBatisPlus这边罢了。对很多很早用MyBatisPlus的项目来讲,特别是MyBatisPlus还没有引入LambdaWrapper的时候,是有很多历史包袱再里面,为开发方便Request参数直接传进Wrapper很常见的。不要指望程序员有怎么高的安全意识,1+1=2也要人提醒之类的,要不然也不会有Log4j的惊天大漏洞。
那你意思是为了小水坑放弃一片大海是吧?有LambdaWrapper只是为了省事又不是为了强字段,你没用过eq("函数(字段)","值")不代表不存在
from mybatis-plus.
其实官方把方法的名字改了不就好了。
比如ruby方法名字加个! 那样,名字加一个admin(AdminUpdate)之类.
为啥不想着更好的方法呢?
类似的方法本来就极为容易混淆。
不想着改进。天天强调我没错,我没有bug,我没有cve。有意义吗?
from mybatis-plus.
CVE权威受到我的质疑了
SpringBoot引入的snakeyaml包也有类似的恶意CVE,被开发者直接挂在主页怼:https://github.com/snakeyaml/snakeyaml
from mybatis-plus.
CVE权威受到我的质疑了
SpringBoot引入的snakeyaml包也有类似的恶意CVE,被开发者直接挂在主页怼:https://github.com/snakeyaml/snakeyaml
两码事,snakeyaml包那个CVE是纯后端故意改,外部不可能改的,所以才被挂上去。这个不一样,可以从前端注入的。不要说什么程序员低级之类的话,很多知名后端知名admin都中过奖,比如JeecgBoot,被开过很多这种SQL注入CVE,较真的讲,都是MybatisPlus的Wrapper没做安全性检查,只不过没甩锅到MyBatisPlus这边罢了。对很多很早用MyBatisPlus的项目来讲,特别是MyBatisPlus还没有引入LambdaWrapper的时候,是有很多历史包袱再里面,为开发方便Request参数直接传进Wrapper很常见的。不要指望程序员有怎么高的安全意识,1+1=2也要人提醒之类的,要不然也不会有Log4j的惊天大漏洞。
那你意思是为了小水坑放弃一片大海是吧?有LambdaWrapper只是为了省事又不是为了强字段,你没用过eq("函数(字段)","值")不代表不存在
不是小水坑,是大水坑。这种开发其实并不少见。
很多大型企业都是有购买安全服务,其中就包含CVE检查,虽然很少有细到工具包,但是影响大的CVE还是有的,比如log4j的那个漏洞。MybatisPlus虽然是mybatis增强工具中起的最早最有名气的一个,但也不是不可替换的。如果因为这个问题而失去大批企业市场值得吗?真的要甩锅程序员低级,也应该默认把这个功能给关掉,而不是在文档豆腐大的地方加个提醒就完事的。
from mybatis-plus.
CVE权威受到我的质疑了
SpringBoot引入的snakeyaml包也有类似的恶意CVE,被开发者直接挂在主页怼:https://github.com/snakeyaml/snakeyaml
两码事,snakeyaml包那个CVE是纯后端故意改,外部不可能改的,所以才被挂上去。这个不一样,可以从前端注入的。不要说什么程序员低级之类的话,很多知名后端知名admin都中过奖,比如JeecgBoot,被开过很多这种SQL注入CVE,较真的讲,都是MybatisPlus的Wrapper没做安全性检查,只不过没甩锅到MyBatisPlus这边罢了。对很多很早用MyBatisPlus的项目来讲,特别是MyBatisPlus还没有引入LambdaWrapper的时候,是有很多历史包袱再里面,为开发方便Request参数直接传进Wrapper很常见的。不要指望程序员有怎么高的安全意识,1+1=2也要人提醒之类的,要不然也不会有Log4j的惊天大漏洞。
那你意思是为了小水坑放弃一片大海是吧?有LambdaWrapper只是为了省事又不是为了强字段,你没用过eq("函数(字段)","值")不代表不存在
不是小水坑,是大水坑。这种开发其实并不少见。 很多大型企业都是有购买安全服务,其中就包含CVE检查,虽然很少有细到工具包,但是影响大的CVE还是有的,比如log4j的那个漏洞。MybatisPlus虽然是mybatis增强工具中起的最早最有名气的一个,但也不是不可替换的。如果因为这个问题而失去大批企业市场值得吗?真的要甩锅程序员低级,也应该默认把这个功能给关掉,而不是在文档豆腐大的地方加个提醒就完事的。
真想搞事那mybatis增强工具没一个跑得掉,全都得有cve,只要有拼sql的功能那就都是隐藏的cve
from mybatis-plus.
真想搞事那mybatis增强工具没一个跑得掉,全都得有cve,只要有拼sql的功能那就都是隐藏的cve
的确,谁让MP是最知名和用户最多的呢,被盯上是必然的。说回漏洞本身,官方的回答属于站在上帝视角看问题了,官方认为用户知道,所以MP没加,用户也的确知道,同时也认为MP知道,其实MP不知道,漏洞就产生了。其实很多用MP的项目已经吃过这个漏洞的CVE了,只不过都没甩锅到MP头上罢了。
from mybatis-plus.
真想搞事那mybatis增强工具没一个跑得掉,全都得有cve,只要有拼sql的功能那就都是隐藏的cve
另外说一句,特地去看了下前段时间对MP贴脸开大的某MF框架,是有对column做安全检查的哦
from mybatis-plus.
MP也做了检查:
https://baomidou.com/reference/about-cve/
如何预防漏洞
明白漏洞产生的主要原因,那么我们只需要控制好表结构、参数相关的数据,避免他们暴露到前端既可避免漏洞攻击。
表字段部分
对于表字段部分通常来说应该由后端控制,但有些系统为了保持足够大的灵活性,允许前端动态传入数据库字段名称。这种做法虽然满足了系统的灵活性要求,却面临着极大的 SQL 注入风险。
如果想要规避风险,就必须要求系统设计者或开发人员自行控制字段的安全性,绝对不能让前端任意传入字符串直接转换为 SQL 字段,应通过字段映射逻辑来阻断攻击,避免前端接口传入的字段内容直接进入 SQL 编译阶段中生成最终 SQL。
字段参数/变量部分
对于字段参数部分,ORM 框架通常有做预编译防止 SQL 注入攻击的逻辑,在 MyBatis 中,通过使用 # 占位符,而不是 $ 占位符来避免 SQL 注入攻击。
MyBatis-Plus 在生成相关的 SQL 时底层能力同样来自 MyBatis,所以一样的可以是用 # 占位符来避免攻击,只不过这一个步骤由 MyBatis-Plus 自动完成了。
使用工具类预防
一般来说,通过上面的处理就可以避免 SQL 注入攻击了,如果您还不放心,可以使用 MyBatis-Plus 提供的工具类
SqlInjectionUtils.check(内容) 来验证字符串是否存在 SQL 注入,如果存在则会抛出对应的异常,
// 开启自动检查 SQL 注入 (3.5.3.2+ 版本支持
Wrappers.query().checkSqlInjection().orderByDesc("任意前端传入字段")
// 手动校验方式 (3.4.3.2+ 版本支持)
SqlInjectionUtils.check("任意前端传入字段")
注意
最好的预防方式仍旧是不允许任何SQL片段由前端传到后台,我们强烈建议不要开放给前端太多的动态 SQL,这样最安全。
from mybatis-plus.
真想搞事那mybatis增强工具没一个跑得掉,全都得有cve,只要有拼sql的功能那就都是隐藏的cve
另外说一句,特地去看了下前段时间对MP贴脸开大的某MF框架,是有对column做安全检查的哦
from mybatis-plus.
真想搞事那mybatis增强工具没一个跑得掉,全都得有cve,只要有拼sql的功能那就都是隐藏的cve
另外说一句,特地去看了下前段时间对MP贴脸开大的某MF框架,是有对column做安全检查的哦
的确,如果用MP兼容写法的话,对方一样有问题,你也可以提交下CVE了。我也很好奇对方对同一CVE的应对方式,会不会一样写小作文:)
from mybatis-plus.
真想搞事那mybatis增强工具没一个跑得掉,全都得有cve,只要有拼sql的功能那就都是隐藏的cve
另外说一句,特地去看了下前段时间对MP贴脸开大的某MF框架,是有对column做安全检查的哦
的确,如果用MP兼容写法的话,对方一样有问题,你也可以提交下CVE了。我也很好奇对方对同一CVE的应对方式,会不会一样写小作文:)
为什么你要我去提cve?我像会干这破事的人吗?而且我也说了只要有拼sql的功能那就都是隐藏的cve
from mybatis-plus.
小刀有切JJ功能,但并不建议你使用呀。你要挥刀自宫,完又把责任推到小刀身上,小刀多冤!
from mybatis-plus.
其实我觉得可以加个InnerInterceptor,全局拦截进行sql注入检查,这样就不用在代码中每次都加checkSqlInjection了
from mybatis-plus.
建议重载相关函数,然后给这些重载函数添加一个参数来控制是否允许任意sql执行,老函数就默认不支持任意sql执行了;
或者干脆新增一批函数,新增函数支持任意sql执行,老函数默认不支持;
或者默认情况下老函数不支持任意sql执行,要执行任意sql时再手动设置。
老放着cve也不是一个事,弄得很多人在新项目都不敢用mp了,包括我自己。
from mybatis-plus.
建议重载相关函数,然后给这些重载函数添加一个参数来控制是否允许任意sql执行,老函数就默认不支持任意sql执行了; 或者干脆新增一批函数,新增函数支持任意sql执行,老函数默认不支持; 或者默认情况下老函数不支持任意sql执行,要执行任意sql时再手动设置。
老放着cve也不是一个事,弄得很多人在新项目都不敢用mp了,包括我自己。
争议cve,又不是定性的严重CVE,对项目有个毛线影响。官方态度也很明确了,我负责优雅美丽,你负责安全检查。不然也不会在打了补丁的情况下这么久不发布3.5.7了。MP的QueryWrapper作为所有国产ORM的老祖宗,是不可能有漏洞的,不然一条绳上的蚂蚱全部BBQ。自己项目做好安全检查吧。
from mybatis-plus.
建议重载相关函数,然后给这些重载函数添加一个参数来控制是否允许任意sql执行,老函数就默认不支持任意sql执行了; 或者干脆新增一批函数,新增函数支持任意sql执行,老函数默认不支持; 或者默认情况下老函数不支持任意sql执行,要执行任意sql时再手动设置。
老放着cve也不是一个事,弄得很多人在新项目都不敢用mp了,包括我自己。争议cve,又不是定性的严重CVE,对项目有个毛线影响。官方态度也很明确了,我负责优雅美丽,你负责安全检查。不然也不会在打了补丁的情况下这么久不发布3.5.7了。MP的QueryWrapper作为所有国产ORM的老祖宗,是不可能有漏洞的,不然一条绳上的蚂蚱全部BBQ。自己项目做好安全检查吧。
有的客户安全团队会扫描jar包,有漏洞的话版本验收不了,即使去解释客户不一定认,认了也是浪费彼此的时间,这是站在个人立场的问题,跟我一样困惑的人肯定有不少。站在开源项目的立场,我也理解他们坚守的是什么,虽然了解事实的人都觉得这不是漏洞,无需改变,但是能不能稍微调整一下,在不影响原有功能的情况下,来避开这个所谓的“漏洞”呢,毕竟确实给很多mp使用者带来了很多困扰和心理负担。
from mybatis-plus.
Related Issues (20)
- 代码生成器,entity格式不准确 HOT 3
- 希望能解析到合并注解的自定义注解 HOT 3
- mybatisplus-generator 没有实现 notLike table HOT 2
- 3.4.3.4 怎么没有源码了或者式标签呢 HOT 1
- xml 取值错误 #{param.msgStatus}
- QueryWrapper 的 and 方法,其能否改变里面嵌套的wrapper为自定义的wrapper HOT 2
- 分页插件在处理 pageSize 为 -1 不拼接 limit 时的判断 bug HOT 4
- 代码生成器期望能多加点功能 HOT 3
- dynamic-datasource can not find primary datasource HOT 7
- sql server 分页的时候查询语句有排序字段会出现 除非另外还指定了 TOP、OFFSET 或 FOR XML,否则,ORDER BY 子句在视图、内联函数、派生表、子查询和公用表表达式中无效。 HOT 2
- mybatis-plus 什么时候支持cte HOT 1
- 主键生成策略的一个问题 HOT 5
- 在添加了PaginationInnerInterceptor后,无法对查询的数据作特殊处理 HOT 3
- 代码生成器 - strategyConfig 配置不生效 HOT 2
- kotlin下使用对象当做别名去引用属性传入Compare的方法无法编译通过了 HOT 1
- 批量插入,短批量间断性对象某一属性为null时,会间断预处理INSERT INTO导致插入变慢很多 HOT 2
- ServiceImpl新增方法,基于wrapper批量更新,根据ID 批量修改插入优化查询效率,希望能优化进去 HOT 5
- 流式查询问题,表数量非常大,导致oom HOT 4
- 3.5.5升级3.5.6后,调用ServiceImpl.saveBatch方法在多SqlSessionFactory场景下获取SqlSessionFactory错误导致异常 HOT 2
- 声明自定义继承的Entity类后,不会去实现序列化接口 HOT 2
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from mybatis-plus.