1。 防空指针异常。不要相信db中数据,和外部传参过来的数据,包括必输项。
2。 不允许for循环中调用mc或db
3。 一定要考虑调用量,减少对db,mc,redis操作次数。
4。 封装变化,把可能变化的逻辑写在一处。
5。 调用别的接口或者rpc,要进行异常的处理和超时处理。或者新的功能也对自己加异常处理,免的影响线上已有逻辑。
6。 比较大有风险的功能加降级开关控制。
7。 异步操作和同步操作的相互影响问题。注意不要让异步的处理结果覆盖了同步的处理结果
8。 并发请求防止串数据,localcache防并发串数据。
9。 测试环境没问题,线上有问题。可能是并发或者缓存的问题 。
10。多线程操作时或者无限for循环,注意cpu资源消耗,如有可能,可以短暂线程sleep。
11。
调用外部接口要用try-catch 捕获,最好能捕获throwable,以防对自己程序造成影响。
12。
设计SOA接口时,任务worker时要防重入,特别是插入类接口,
即所谓的幂等性
。
之前公司总结的:
数据安全
:
1 接口防重入
- 问题:
- 各种Worker、调用方会重试失败的调用
- 前台用户提交后,再次刷新
- 恶意重试
- 方案:
- 调用方提供UUID
- 被调用方根据UUID重复与否决定是否处理
- 没有重复,处理并返回结果
- 有重复,直接返回上次处理结果
- 完全是利用数据库的约束来实现
- 并发较低
2 防轮询
- 问题:
- 有序的数字URL
- 方案:
- 服务端增加验证,确认是本人访问
- 增加访问日志,某个帐号访问量大,报警(ERP后台)
- Id无序
- Id有序的,url中增加passkey,并且验证
- Passkey=hash(id+key)
3 防xss攻击
- 问题:
- 恶意上传js(恶意伪造文件扩展名)
- 生成恶意链接(url中提交内容带有脚本引用 )
- 发送给其它用户
- 偷取用户cookie
- 自动下单
- 方案:
- 上传图片时,一定要对content-type和文件头判断
- PNG图片,文件头会有PNG字样
- GIF图片,文件头是GIF89A
- 任何场景下输出时,对于字符串输出进行html、js等等编码
- 转义>、<、&、”等等特殊字符
- 如果要输出富文件
- 必须过滤script、object
- For循环
- 循环结束条件来自外部参数
- 这个值不受你控制
- 需要判断这个值不能超过阀值
- While循环
- While(true)里面的break来自外部参数
- While(条件)来自外部参数
- 方案:
- 设置计数器,达到阀值后强制跳出
4 最大范围-边界
- 各种对象为null
- 各种字符串为null和超长
- 各种数字为0或越界
- 尤其定义成int,外面传入long。
- 数组的大小
5 最大范围-各种超时
- 读取文件超时
- 文件太大
- 磁盘出问题
- 各种网络接口超时
- 设置默认超时
- 设置特定超时设置
- 连接被断开
- Web Service、ICE、SAF调用超时
- 尽量并行调用接口
- 三个接口abc,相互无影响。
- 一般情况 :a()、b()、c()
- 并行调用: 利用FutureTask先创建异步调用,最后get结果
- 三个接口abc,相互无影响。
- 后台记录页面的执行时间
6 最大范围-限流
- 问题:
- 并行请求太大,超过系统能力
- 方案:
- 设置最大执行线程数量
- 执行中的线程数量记录
- 新请求后,检查是否超最大数
- 超了,提示您先坐会儿,重新点击按钮提交
- 12306这次应用了
- 对于反复刷新的,必须限制
- 超了,提示您先坐会儿,重新点击按钮提交
梁飞总结的:
•敲每个点号时,考虑:
–会不会出现空指针?–有没有异常抛出?–是不是在热点区域?–在哪个线程执行?–有没有并发锁间隙?–会不会并发修改不可见?