- 跨越信任边界的数据必须校验后才能使用
- 只接受已知合法的数据:正则、白名单
- 拒绝已知坏的数据
- 禁止不可信数据拼接SQL
- 注意表明、字段名限制
- 使用prepareStatement
- 禁止使用不可信数据记录日志
- 注意日志换行即可
- 禁止使用不可信数据进行字符串格式化
- 文件路径要进行标准化处理
- 解压文件须进行安全检查
- 禁止不可信数据构造正则表达式
- 字符串校验前先进行标准化
- Normalizer.normalize(s,Form.NFKC)
- 防止XSS攻击
- 禁止直接使用可能为null的对象,防止出现NPE
- 不要在断言中使用有副作用的表达式
- 不要增加隐藏方法的可访问性
- 确保除法运算和模运算中的除数不为0
- 不要整数溢出
- 防止通过异常泄露敏感信息
- 文件路径
- InsufficientResourcesException
- BindException
- OOM
- SQLException
- 不要调用System.exit
- 不要捕获NPE
- 禁止将系统内部使用的锁对象暴露给不可信代码
- synchronized的代码块和方法使用了对象所,这个对象就要是私有的
- 禁止基于可被重用的对象进行同步
- 比如:Boolean.FALSE这个对象锁是全局的
- 禁止基于getClass()返回的类对象进行同步
- 禁止使用实例锁同步共享静态数据:这样做无效,起不到同步的效果
- 使用相同的方式请求和释放锁,避免死锁:使用顺序锁,保证相同的顺序
- 在异常条件下,保证释放已持有的锁
- 禁止使用Thread.stop()方法
- 可以使用volatile标志位来控制线程执行
- 使用interrupt方法
- 禁止使用非线程安全的方法覆写线程安全的方法
- 避免在产生阻塞操作中持有锁
- 避免使用不正确形式的双重锁
- 临时文件使用完毕后要及时删除
- finallly代码块中删除文件
- DELETE_ON_CLOSE属性对linux平台无效
- 禁止将内部Buffer暴露给外部不可信代码
- 创建子进程时,不要阻塞在输入输出流上
- 创建文件时,正确设置文件权限
- 禁止序列化敏感字段,设置为 transient
- 敏感数据跨信任域传递前必须进行签名并加密
- 序列化和反序列化时,也要考虑权限校验,防止绕过安全检查
- 禁止反序列化不可信对象
- fastjson要关闭type解析:ParserConfig.getGlobalInstance().setAutoTypeSupport(false);
- 禁止序列化非静态内部类
- 进行安全检查的方法必须声明为private或final
- 编写自定义的类加载器时,必须调用超类的getPermission()函数
- 禁止日志中记录口令、密钥
- 禁止使用弱加密算法
- 基于Hash算法的口令安全必须加入盐值
- 禁止将敏感信息硬编码到程序中
- 必须使用SSLSocket代替socket
- 使用char[],而不是String存储敏感信息
- string是不可变对象,不会被GC
Web的四种常见攻击方法及防范
XSS
SQL Injection
DDOS
CSRF
同源策略: 不能解析第三方网站的返回结果
解决方法:
1.通过JSONP功能实现跨域请求
2. 通过添加Access-Control-Allow-Origin = “*” 来允许简单请求跨域