编程中注意事项

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          接口防重入

  • 问题:
  1. 各种Worker、调用方会重试失败的调用
  2. 前台用户提交后,再次刷新
  3. 恶意重试
  • 方案:
  1. 调用方提供UUID
  2. 被调用方根据UUID重复与否决定是否处理
    1. 没有重复,处理并返回结果
    2. 有重复,直接返回上次处理结果
  3. 完全是利用数据库的约束来实现
  4. 并发较低

2            防轮询

  • 问题:
  1. 有序的数字URL
  • 方案:
  1. 服务端增加验证,确认是本人访问
    1. 增加访问日志,某个帐号访问量大,报警(ERP后台)
  2. Id无序
  3. Id有序的,url中增加passkey,并且验证
    1. Passkey=hash(id+key)

3            xss攻击

  • 问题:
  1. 恶意上传js(恶意伪造文件扩展名)
  2. 生成恶意链接(url中提交内容带有脚本引用 )
  3. 发送给其它用户
    1. 偷取用户cookie
    2. 自动下单
  • 方案:
  1. 上传图片时,一定要对content-type和文件头判断
    1. PNG图片,文件头会有PNG字样
    2. GIF图片,文件头是GIF89A
  2. 任何场景下输出时,对于字符串输出进行htmljs等等编码
    1. 转义><&、”等等特殊字符
    2. 如果要输出富文件
      1. 必须过滤scriptobject
               2. 可以使用 UBB 代码
 

2   极值处理

1            最大范围-内存溢出

  • PermGen space
  1. Class太多,实时编译内容多
  2. 常量太多(String.intern())
  3. 代码增强技术产生class太多
  • Java heap space
  1. 缓存内容太多
  2. 队列太大,只移指针,不清空
  3. 访问量太大,回收器来不及回收
  • 处理:
  1. Jmap工具
  2. 垃圾回收日志输出
  3. Java探针
  4. 最好分页取出数据、然后再处理

2           最大范围-最大装载量

  • 问题:
  1. 从磁盘读入文件,文件大小超过JVM内存
  2. Socket读入数据,读入内容超过JVM内存
  3. 从数据库读入数据,读入数据超过JVM内存
  4. 创建byte数组时,初始化大小超JVM内存
  • 建议:
  1. 分步读入安全量数据
  2. 处理完成后,释放内存
  3. 再读入

3            最大范围-循环阀值

  • For循环
  1. 循环结束条件来自外部参数
    1. 这个值不受你控制
    2. 需要判断这个值不能超过阀值
  • While循环
  1. While(true)里面的break来自外部参数
  2. While(条件)来自外部参数
  • 方案:
  1. 设置计数器,达到阀值后强制跳出

 

4            最大范围-边界

  • 各种对象为null
  • 各种字符串为null和超长
  • 各种数字为0或越界
  1. 尤其定义成int,外面传入long
  • 数组的大小

5            最大范围-各种超时

  • 读取文件超时
  1. 文件太大
  2. 磁盘出问题
  • 各种网络接口超时
  1. 设置默认超时
  2. 设置特定超时设置
  3. 连接被断开
  • Web ServiceICESAF调用超时
  1. 尽量并行调用接口
    1. 三个接口abc,相互无影响。
      1. 一般情况 a()b()c()
      2. 并行调用: 利用FutureTask先创建异步调用,最后get结果
  • 后台记录页面的执行时间

6          最大范围-限流

  • 问题:
  1. 并行请求太大,超过系统能力
  • 方案:
  1. 设置最大执行线程数量
  2. 执行中的线程数量记录
  3. 新请求后,检查是否超最大数
    1. 超了,提示您先坐会儿,重新点击按钮提交
      1. 12306这次应用了
    2. 对于反复刷新的,必须限制
 
 
梁飞总结的:
     •敲每个点号时,考虑:
–会不会出现空指针?
–有没有异常抛出?
–是不是在热点区域?
–在哪个线程执行?
–有没有并发锁间隙?
–会不会并发修改不可见?

猜你喜欢

转载自magicyang919.iteye.com/blog/2112487