业务表单修改实现安全性疑问

发布于 2022-09-13 00:05:22 字数 1023 浏览 19 评论 0

现在公司的程序在修改业务表单时碰到了安全性问题,现在分别有人提出三种实现方式。
程序架构:
SpringBoot、SpringMVC、Mybatis等
开发场景:
现有一个用户表,主要字段编号、昵称、余额、赠送余额。用户执行查看并修改个人信息,在页面展示所有字段,但是只允许用户修改昵称,其它字段设置为只读,现在争议发生在后端修改的实现方式。
方案一
通过SrpingMVC接收数据并注入到对象newUser中,然后直接使用MyBatis的updateByPrimaryKey方法执行修改。
代码:userMapper.updateByPrimaryKey(newUser);
发现问题:

  1. 脏数据覆盖,当用户在页面操作时其它模块操作了用户表的数据,此时用户再执行保存会用脏数据覆盖正确数据。

方案二
通过SrpingMVC接收数据并注入到对象newUser中,先通过MyBatis的selectByPrimaryKey查询到原用户对象oldUser,然后将newUser中的昵称赋值给oldUser,最后使用updateByPrimaryKey方法执行修改。
代码:
oldUser.setNickname(newUser.getNickname());
userMapper.updateByPrimaryKey(oldUser);
发现问题:

  1. 并发问题,当其它功能同时修改用户表的其它字段时,会导致修改数据被脏数据覆盖。

方案三
通过SrpingMVC接收数据并注入到对象newUser中,然后调用MyBatis的自定义语句执行修改,只修改用户的昵称。
代码:userMapper.updateNicknameByPrimaryKey(newUser);
sql:update user set nickname=#{nickname} where id=#{id}

求问
求问这三种方案各有什么优劣?哪种方案最安全?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

吲‖鸣 2022-09-20 00:05:22

方案一修改的时候如果没做判断会修改到敏感数据 不可行
方案二、多了一个查询,并且明明是修改昵称,还更新了其他数据,虽然不影响。
方案三,前端直接传递nickname,和id字段即可,不用将所有字段全部暴露出去

橘味果▽酱 2022-09-20 00:05:22

方案三最优但是实现麻烦
方案二差一点但是最好实现
方案一要做字段过滤,有遗漏会改到不能改的数据,有风险,不行

断舍离 2022-09-20 00:05:22

如果表维护有最后操作时间,可以将这个时间传到前端,然后保存的时候也传这个值来判断数据库是否更改了。

清晰传感 2022-09-20 00:05:22

谢邀,我对 JEE 栈不熟,只能给点建议:

我觉得关键是要解决「只更新需要更新的字段」这个问题,当然方案三。

不过用 MyBatis 就是为了减少 SQL,所以最好能找个方案三的等价 MyBatis 方案。据说 MyBatis-Plus 能解决,可以研究下。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文