Skip to content

Instantly share code, notes, and snippets.

@ruiqiliu
Last active September 17, 2019 07:16
Show Gist options
  • Save ruiqiliu/af1314f4ec1f4d6703104f9128df9fe6 to your computer and use it in GitHub Desktop.
Save ruiqiliu/af1314f4ec1f4d6703104f9128df9fe6 to your computer and use it in GitHub Desktop.
Java安全编程规范-HW

数据校验

  1. 跨越信任边界的数据必须校验后才能使用
    • 只接受已知合法的数据:正则、白名单
    • 拒绝已知坏的数据
  2. 禁止不可信数据拼接SQL
    • 注意表明、字段名限制
    • 使用prepareStatement
  3. 禁止使用不可信数据记录日志
    • 注意日志换行即可
  4. 禁止使用不可信数据进行字符串格式化
  5. 文件路径要进行标准化处理
  6. 解压文件须进行安全检查
  7. 禁止不可信数据构造正则表达式
  8. 字符串校验前先进行标准化
    • Normalizer.normalize(s,Form.NFKC)
    • 防止XSS攻击

方法与表达式

  1. 禁止直接使用可能为null的对象,防止出现NPE
  2. 不要在断言中使用有副作用的表达式
  3. 不要增加隐藏方法的可访问性

数值与运算

  1. 确保除法运算和模运算中的除数不为0
  2. 不要整数溢出

异常行为

  1. 防止通过异常泄露敏感信息
    • 文件路径
    • InsufficientResourcesException
    • BindException
    • OOM
    • SQLException
  2. 不要调用System.exit
  3. 不要捕获NPE

线程同步

  1. 禁止将系统内部使用的锁对象暴露给不可信代码
    • synchronized的代码块和方法使用了对象所,这个对象就要是私有的
  2. 禁止基于可被重用的对象进行同步
    • 比如:Boolean.FALSE这个对象锁是全局的
  3. 禁止基于getClass()返回的类对象进行同步
  4. 禁止使用实例锁同步共享静态数据:这样做无效,起不到同步的效果
  5. 使用相同的方式请求和释放锁,避免死锁:使用顺序锁,保证相同的顺序
  6. 在异常条件下,保证释放已持有的锁
  7. 禁止使用Thread.stop()方法
    • 可以使用volatile标志位来控制线程执行
    • 使用interrupt方法
  8. 禁止使用非线程安全的方法覆写线程安全的方法
  9. 避免在产生阻塞操作中持有锁
  10. 避免使用不正确形式的双重锁

IO操作

  1. 临时文件使用完毕后要及时删除
    • finallly代码块中删除文件
    • DELETE_ON_CLOSE属性对linux平台无效
  2. 禁止将内部Buffer暴露给外部不可信代码
  3. 创建子进程时,不要阻塞在输入输出流上
  4. 创建文件时,正确设置文件权限

序列化

  1. 禁止序列化敏感字段,设置为 transient
  2. 敏感数据跨信任域传递前必须进行签名并加密
  3. 序列化和反序列化时,也要考虑权限校验,防止绕过安全检查
  4. 禁止反序列化不可信对象
    • fastjson要关闭type解析:ParserConfig.getGlobalInstance().setAutoTypeSupport(false);
  5. 禁止序列化非静态内部类

平台安全

  1. 进行安全检查的方法必须声明为private或final
  2. 编写自定义的类加载器时,必须调用超类的getPermission()函数

其他

  1. 禁止日志中记录口令、密钥
  2. 禁止使用弱加密算法
  3. 基于Hash算法的口令安全必须加入盐值
  4. 禁止将敏感信息硬编码到程序中
  5. 必须使用SSLSocket代替socket
  6. 使用char[],而不是String存储敏感信息
    • string是不可变对象,不会被GC
@ruiqiliu
Copy link
Author

限流算法

  • 令牌桶
    • 固定速率往桶中放入令牌,处理消息时,删除令牌,无令牌时阻塞
  • 漏桶
    • 使用Java-Semaphore限制同时处理数
    • 通过semaphore.getQueueLength()判断等待数量,限制等待容量
  • 计数器
    • 通过AtomicInteger记录同时消费的个数,超过限制就丢弃
  • 滑动窗口
    • 拥塞控制中的算法

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment