Skip to content

Instantly share code, notes, and snippets.

@ruiqiliu
Last active September 17, 2019 07:16
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • 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

ruiqiliu commented Sep 16, 2019

Web的四种常见攻击方法及防范

XSS

  • Cross Site Scripting
  • 一个用户提交的输入,通过网站,发布到了其他的用户终端,从而造成用户数据泄露
  • 存储型XSS:恶意用户的嵌入式html,通过网站的DB,发布到其他用户
  • 反射型XSS:恶意用户将脚本嵌入到URL地址的请求参数里,其他用户点击恶意链接时受到攻击
  • 防范:
    • 过滤URL中的特殊字符
    • 请求头中设置指定的类型

SQL Injection

  • 用户输入的数据作为SQL查询的条件,造成查询时,查询条件不准确、多执行sql语句
  • 防范:
    • filtering and escaping user input
    • 使用PreparedStatment
    • 使用专业的SQL注入检测工具
    • 避免把网站的sql错误暴露出来

DDOS

  • DOS:单挑
  • DDOS:群殴
  • 攻击类型:
    • TCP:SYN Flood、ACK Flood
    • UDP:Fraggle、Trinoo
    • DNS query Flood
    • ICMP Flood
    • Slowloris
  • 防范:
    • 检测技术: 检测网站是否遭受DDos攻击
    • 清洗技术:清洗掉异常流量

CSRF

  • cross-site request forgery 跨站请求伪造 (one-click-attck)
  • 登录受信任网站A后,Cookie中保存了授权信息,再访问攻击网站B,侵入的有害链接会利用当前登录用户的cookie,向受信任网站A发送请求
  • 网站A无法识别B网站的恶意请求,正常处理了有害请求
  • 防范:
    • 在Cookie验证的基础上, 添加额外的验证机制,例如:
      1. 在Http Header中提交CSRF-Token,网站B无法获取请求头,从而无法伪造请求
      1. 提交表单时,添加隐藏字段csrf-token,token值是根据cookie的授权信息得到的加密结果,服务端验证这个token,通过后才认为是合法请求

同源策略: 不能解析第三方网站的返回结果

  • 所谓同源是指,域名,协议,端口相同
  • 同源策略是浏览器的行为,是为了保护本地数据不被JavaScript代码获取回来的数据污染,因此拦截的是客户端发出的请求回来的数据接收,即请求发送了,服务器响应了,但是无法被浏览器接收
    解决方法:

1.通过JSONP功能实现跨域请求
2. 通过添加Access-Control-Allow-Origin = “*” 来允许简单请求跨域

@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