课程目录:Java安全编码高级培训
4401 人关注
(78637/99817)
课程大纲:

Java安全编码高级培训

 

 

1 安全编码概述
1.1 错位的信任
1.2 注入攻击
1.3 敏感数据泄露
1.4 效能泄露
1.5 拒绝服务
1.6 序列化
1.7 并发性、可见性和内存
1.8 低权限原则
1.9 安全管理器
1.10 类装载器
2 输入验证和数据净化(IDS)规则风险评估概要
2.1 净化穿越受信边界的非受信数据
2.2 验证前标准化字符串
2.3 在验证之前标准化路径名
2.4 不要记录未经净化的用户输入
2.5 限制传递给ZipInputStream的文件大小
2.6 使用ASCII字符集的子集作为文件名和路径名
2.7 从格式字符串中排除用户输入
2.8 不要向Runtime.exec 方法传递非受信、未净化的数据
3 声明和初始化(DCL)规则风险评估概要
3.1 防止类的循环初始化;
3.2 不要重用Java标准库的已经公开的标识;
3.3 将所有增强for语句的循环变量声明为final类型
4 表达式(EXP)规则风险评估概要
4.1 不要忽略方法的返回值
4.2 不要解引用空指针
4.3 使用两个参数的Arrays.equals方法来比较两个数组的内容
4.4 不要用相等操作符来比较两个基础数据类型的值
4.5 确保使用正确的类型来自动封装数值
4.6 不要在一个表达式中对同一变量进行多次写入
4.7 不要在断言中使用有副作用的表达式
5 数值类型与运算(NUM)规则风险评估概要
5.1 检测和避免整数溢出
5.2 不要对同一数据进行位运算和数学运算
5.3 确保除法运算和模运算中的除数不为0
5.4 使用可容纳无符号数据合法取值范围的整数类型
5.5 不要使用浮点数进行精细计算
5.6 不要使用非标准化数
5.7 使用strictfp修饰符确保跨平台浮点运算的一致性
5.8 不要尝试与NaN进行比较
5.9 检查浮点输入特殊的数值
5.10 不要从浮点字元构造BigDecimal对象
5.11 不要使用浮点变量作为循环计数器
5.11.1 确保将数值转换成较小类型时不会产生数据丢失或曲解
6 面向对象(OBJ)规则风险评估概要
6.1 只有受信子类能对具有不变性的类和方法进行扩展
6.2 声明数据成员为私有并提供可访问的封装器方法
6.3 当改变基类时,保存子类之间的依赖关系
6.4 在新代码中,不要混用具有泛型和非泛型的原始数据类型
6.5 为可变类提供复制功能,并通过此功能允许将实例传递给非受信代码
6.6 在返回引用之前,防御性复制私有的可变的类成员
6.7 对可变输入和可变的内部组件创建防御性复制
6.8 不允许敏感类复制其自身
6.9 不要在嵌套类中暴露外部类的私有字段
6.10 比较类而不是类名称
6.11 不要使用公有静态的非final变量
6.12 小心处理构造函数抛出异常的情况
7 方法(MET)规则风险评估概要
7.1 验证方法参数
7.2 不要使用断言验证方法参数
7.3 不要使用弃用的或过时的类和方法
7.4 进行安全检测的方法必须声明为private或final
7.5 不要增加被覆写方法和被隐藏方法的可访问性
7.6 确保构造函数不会调用可覆写的方法
7.7 不要在clone中调用可覆写的方法
7.8 不要定义类方法来隐藏基类或基类接口中声明的方法
7.9 确保比较等同的对象能得到相等的结果
7.10 定义了equlas方法的类必须定义hashCode方法
7.11 实现compareTo方法时遵守常规合约
7.12 确保比较中的关键码是不可变的
7.13 不要使用析构函数
8 异常行为(ERR)规则风险评估概要
8.1 不要消除或忽略可检查的异常
8.2 不能允许异常泄露敏感信息
8.3 记录日志时应避免异常
8.4 在方法失败时恢复对象先前的状态
8.5 不要在finally程序段非正常退出
8.6 不要在finally程序段中遗漏可检查异常
8.7 不要抛出未声明的可检查异常
8.8 不要抛出RuntimeException、Exception或Throwable
8.9 不要捕捉NullPointerException或任何它的基类
8.10 禁止非受信代码终止JVM
9 可见性和原子性(VNA)规则风险评估概要
9.1 当需要读取共享基础数据类型变量时,需要保证其可见性
9.2 保证对一个不可变对象的共享引用的可见性
9.3 保证对于共享变量的组合操作是原子性的
9.4 即使每一个方法都是相互独立并且是原子性的,也不要假设一组调用是原子性的
9.5 保证串联在一起的方法调用是原子性的
9.6 保证在读写64位的数值时的原子性