维护一个老系统,有很多让用户输入 int 字段值的接口,且前端没做数字范围校验,
数据库 int 字段值有最大值 21 亿多点,很多 html 表单里用户可以直接提交这种 int 值,
于是报错到数据库时就抛超出数据库数字范围异常了。
这种 html 表单很多,数据库实体类也很多,六七十个吧,我是应该人肉手动在所有 XX 是 int 类型的 setXX 方法里,判断 XX 大于最大值,就覆盖为最大值,还是研究代码找一种改动最少的办法,让后端判断是 int 类型,且数字大于最大值时用 int 最大值覆盖掉?
1
zhx1991 2018-01-06 14:19:30 +08:00
底层设计不合理, 怎么改都很恶心.
感觉前端做限制更简单. |
2
wekw 2018-01-06 14:26:21 +08:00
直接写一个检查函数,把需要过滤的字段名传进去,做统一校验和修改。
|
3
southsala 2018-01-06 14:27:45 +08:00
如果不怕费工夫最好后端限制,而且不光是 int,其他字符串也要用正则限制好
|
4
lihongjie0209 2018-01-06 14:37:20 +08:00
你难道在 Controller 中直接 Request.getParam()???? 不应该是用 DTO 接受参数吗? 一般的框架都有参数绑定异常的处理方式, 不需要自己手写.
如果你想一劳永逸的话, 写一个 Filter 吧, 在入口函数处理之前都要经过 Filter 的 |
5
WatcherHangzhou OP @lihongjie0209
有 request.getInt("XX") 获取 int 值, 我在考虑重新注入个新的 request 重写这个 getInt 方法,判断参数 XX 是不是要限制最大值的那几个字段 |
6
lihongjie0209 2018-01-06 15:01:32 +08:00
@WatcherHangzhou #5 这不是个好习惯, 后面想要重构就会遇到你现在的问题.
|
7
bxb100 2018-01-06 15:29:02 +08:00
可以试试 xwork-validator, hibernate validate
|
8
cxbig 2018-01-06 15:33:27 +08:00
一般用户接口,我们都是前后端都验证的。
前端可以规范一般用户输入,对于恶意的 POST,后端会再次验证 token 和 data。 |