JAVA安全编码[一]

 编程过程中应该时刻保持以下的假设:
    1. 程序所处理的所有外部数据都是不可信的攻击数据
    2. 攻击者时刻试图监听、篡改、破坏程序运行环境、外部数据
安全编码基本思想
    基于以上的假设,得出安全编码基本思想:
    1. 程序在处理外部数据时必须经过严格的合法性校验 编程人员在处理外部数据过程中必须时刻保持这种思维意
识,不能做出任何外部数据符合预期的假设,外部数据必须经过严格判断后才能使用。编码人员必须在这种
严酷的攻击环境下通过遵守这一原则保证程序的执行过程符合预期结果。
    2. 尽量减少代码的攻击面 代码的实现应该尽量简单,避免与外部环境做多余的数据交互,过多的攻击面增加了
被攻击的概率,尽量避免将程序内部的数据处理过程暴露到外部环境。
    3. 通过防御性的编码策略来弥补潜在的编码人员的疏忽 粗心是人类的天性。由于外部环境的不确定性,以及编
码人员的经验、习惯的差异,代码的执行过程很难达到完全符合预期设想的情况。因此在编码过程中必须采
取防御性的策略,尽量缓解由于编码人员疏忽导致的缺陷。

1 数据校验
    规则 1.1 跨信任边界传递的不可信数据使用前必须进行校验
    规则 1.2 禁止直接使用不可信数据来拼接SQL语句
    规则 1.3 禁止直接使用不可信数据记录日志
    规则 1.4 禁止使用不可信数据构造格式化字符串
    规则 1.5 禁止向Runtime.exec()方法或java.lang.ProcessBuilder类传递不可信数据
    规则 1.6 文件路径校验前必须先进行标准化处理
    规则 1.7 从ZipInputStream中解压文件必须进行安全检查
    规则 1.8 禁止直接使用不可信数据来拼接XML
    规则 1.9 防止解析不可信来源的XML导致的外部实体(XML External Entity)攻击
    规则 1.10 防止解析不可信来源的XML导致的内部实体扩展(XML Entity Expansion)攻击
    规则 1.11 禁止使用不安全的XSLT转换XML文件
    规则 1.12 禁止直接使用不可信数据构造正则表达式
    建议 1.1 字符串校验前先进行标准化
2 方法与表达式
    规则 2.1 禁止解引用空指针
    建议 2.1 不要在断言中使用有副作用的表达式
    建议 2.2 不要增加重载或隐藏方法的可访问性
    建议 2.3 不要忽略方法的返回值
3 数值与运算
    规则 3.1 确保除法运算和模运算中的除数不为0
    建议 3.1 进行数值运算,避免整数溢出
4 异常行为
    规则 4.1 防止通过异常泄露敏感信息
    建议 4.1 不要调用System.exit()终止JVM
    建议 4.2 不要直接捕获NullPointException
5 线程同步
    规则 5.1 禁止将系统内部使用的锁对象暴露给不可信代码
    规则 5.2 禁止基于可被重用的对象进行同步
    规则 5.3 禁止基于getClass()返回的类对象进行同步
    规则 5.4 禁止基于高层并发对象的内置锁来实现同步
    规则 5.5 禁止使用一个实例锁来同步共享静态数据
    规则 5.6 使用相同的方式请求和释放锁,避免死锁
    规则 5.7 在异常条件下,保证释放已持有的锁
    规则 5.8 禁止调用Thread.run()
    规则 5.9 禁止使用Thread.stop()来终止线程
    规则 5.10 禁止使用非线程安全的方法来覆写线程安全的方法
    建议 5.1 避免在产生阻塞操作中持有锁
    建议 5.2 避免使用不正确形式的双重锁定检查
6 I/O操作
    规则 6.1 临时文件使用完毕必须及时删除
    规则 6.2 禁止将Buffer对象封装的数据暴露给不可信代码规则 6.3 防止让外部进程阻塞在输入输出流上
    规则 6.4 对于从流中读取一个字符或字节的方法,使用int类型的返回值
    建议 6.1 在多用户系统中创建文件时指定合适的访问许可
7 序列化和反序列化
    规则 7.1 禁止序列化未加密的敏感数据
    规则 7.2 将含敏感数据的对象跨信任域传递前必须进行签名并加密
    规则 7.3 防止序列化和反序列化被利用来绕过安全管理器
    规则 7.4 禁止直接将不可信数据进行反序列化
    规则 7.5 禁止序列化非静态的内部类
8 平台安全
    规则 8.1 进行安全检查的方法必须声明为private或final
    规则 8.2 编写自定义类加载器时必须调用超类的getPermission()函数
    规则 8.3 避免使用URLClassLoader和java.util.jar提供的自动签名检查机制
    建议 8.1 使用安全管理器来保护敏感操作
    建议 8.2 不要基于不可信数据做安全检查
9 其他
    规则 9.1 禁止在日志中保存口令、密钥和其他敏感数据
    规则 9.2 禁止使用私有或者弱加密算法
    规则 9.3 基于哈希算法的口令安全存储必须加入盐值(salt)
    规则 9.4 禁止将敏感信息硬编码在程序中
    规则 9.5 安全场景下必须使用强随机数
    规则 9.6 必须使用SSLSocket代替Socket来进行安全数据交互

你可能感兴趣的:(JAVA安全编码)