编码安全问题规避
1.参数要做校验:
- 验证所有的从不信任的数据源来的输入,默认其为不安全的数据,不仅要验证类型,也要验证参数长度值范围
- 尽量使用白名单不使用黑名单
- 所有客户端验过得参数,在服务器端要在验一遍
2.禁止日志及异常中打印敏感信息
- 要注意日志信息info、wran、error级别的控制,禁止打印明文密码、身份证号等证件号码、系统敏感信息、姓名、电话号码等
3.用完的临时文件要及时删除
- 例如:临时上传的测试文件等
4.用完的调试代码要及时删除
- 例如:代码调试时的main方法、为方便查看日志时加的多余的日志打印、业务代码中加的UT
5.禁止使用弱加密算法
参考:
加密算法的安全级别(Security Level of Cryptographic Algorithms)
安全级别 | 工作因素 | 算法 | ||
薄弱(Weak) | O(240) | |||
传统(Legacy) | O(264) | |||
基准(Baseline) | O(280) | |||
标准(Standard) | O(2128) | |||
较高(High) | O(2192) | |||
超高(Ultra) | O(2256) |
6.防止注入攻击
- 例如XML攻击、SQL注入攻击等
7.禁止代码中存在硬编码
- 例如将URL直接写在业务代码里,应该学会定义成员变量,常用的数据可以定义到Common类中,整个包都可以引用
8.使用强的随机数字生成器
- 例如不适用Random生成伪随机数,可以SecurityRandom等,或改用UUID,时间戳等
9.对于传输的敏感数据,做到先签名,再加密
10.充分的异常管理
- 异常抛出时做到准确、精细、可控,防止接口处异常吞掉业务深处的异常信息。
11.代码简单易读,可以有效的解决问题。
- 尽量做到clean code的标准(《代码简洁之道》《阿里巴巴编码规范》这一类的编码规范类书籍可以借鉴一下)
12.注意编译器警告。
- 编译时,用最高的告警级别,并且清除所有的警告。
- 使用好的编程习惯避免这些错误的发生。
- 用工具辅助贯彻落实编码(CheckStyle、FindBug、CodeDEX、PMD等)
13.坚持最小权限原则。
14.使用有效的质量保证技术。
- 单元测试、测试覆盖率
- 异常数据测试、Fuzz测试
- 自动化代码扫描工具、自动化漏洞扫描工具
- 人工代码审查