JAVA科目二资料
安全
- 不安全的算法: AES-ECB,DES, MD5
- 安全加密算法:RSA,DSA/ECDSA和加入盐值SHA256 , AES-GCM
- 选择AES时需要注意是否切换为GCM模式,默认的ECB模式不安全
- RSA算法需要将证书长度设置为超过2048才算安全算法
- 输入校验不能检验CSRF攻击
- 不要使用XMLDecoder进行反序列化操作
- 一个对象存入Hash集合后hashcode随即发生变化会导致内存泄漏
- 敏感数据传输先前面再加密
- 数值运算,建议使用先决条件检查、Math.*Exact()方法、向上类型转换等方式防止溢出
- 文件路径校验前必须先进行标准化处理,建议使用getCanonicalPath()
- 从ZipInputStream中解压文件必须进行安全检查
-
- 解压出的标准化路径文件在解压目标目录之外
-
- 解压的文件消耗过多的系统资源
-
- 不要依赖平台默认的字符编码方式,使用UTF-8
- 字符串大小写转换(String类的toUpperCase()和toLowerCase()方法、format()方法)必须加上Locale.ROOT或Locale.ENGLISH
- 个人数据:自然人的email地址、电话号码、生物特征(指纹)、位置数据、IP地址、医疗信息、宗教信仰、社保号、婚姻状态、银行卡、口令、身份证、护照号等。
- 敏感个人数据:工会成员信息、个人信仰观念(政治、信仰、党派、宗教、性取向)、个人种族信息、犯罪处分负向记录、权威社会识别标识(政府等权威机构发布的能够唯一识别到用户的标识符,一般终身不可重置)、身份认证凭据、生物特征、健康信息、金融帐号标识;
- SQL注入:
- 使用参数化查询:最有效的防护手段,对于sql语句中的表名、字段名、部分场景下的in条件不适用;
- 对不可信数据进行白名单校验:适用于拼接sql语句中的表名、字段名
- 对不可信数据进行转码:仅适用于SQL语句中由单引号或双引号限制的字段
- XML:
- xml实体解析导致的安全风险:XXE, 内部实体扩展
- 针对XML数据应用的攻击:XPath,XXE, 内部实体扩展
- 防止XML注入不包括使用XML Schema或 DTD校验
- DOS攻击:
- 敏感异常:
- Java.lang.OutOfMemoryError
- Java.lang.StackOverflowError
- javax.naming.InsufficientResourcesException
- 敏感异常:
- 数据校验
- 不可信数据进行校验时,禁止使用assert
- "白名单"方式净化的方式包括删除,编码 ,替换
IO
- Runtime.exec()方法与相关联的ProcessBuilder.start()方法可以用来调用外部程序进程,这些外部程序运行时Process对象会产生哪些流
- 输入流,输出流,错误流
- 规则6.2 禁止将Buffer对象封装的数据暴露给不可信代码
- 规则6.3 防止让外部进程阻塞在输入输出流上
- 规则6.4 对于从流中读取一个字符或字节的方法,使用int类型的返回值
- FileChannel 是写操作 线程安全的
- File:
- 仅创建一个File类实例,Java是不会对文件进行读写的
- File实例可以判断是否目录或文件,因此文件与文件夹都可以处理
- 字符和字节流
- Reader 是字符缓存流,可以支持按字符,数组,行来读取。
- InputSteam是字节缓存流,支持按字节读取文件和二进制数据。
Java 基础
-
优先加载静态方法块,再加载父类代码块和构造方法,再加载子类。
-
?: 三元云算符 会返回一个综合类,例如 condition? int: char 会返回一个int
-
如何遍历删除数组元素避免ConcurrentModificationException
- 使用removeIf方法或者Iterator提供的remove方法,用于删除当前元素
- 使用并发集合类来避免ConcurrentModificationException,比如使用CopyOnArrayList,ConcurrentHashMap或者CopyOnWriteArrayList。而不是ArrayList。
- 如果直接使用stream.list.foreach 或者 foreach 中删除则会引发ConcurrentModificationException
- ArrayList只能删除倒数第二个元素。
- LinkedList只能删除倒数第二和第一个元素。
- 否则抛出ConcurrentModicationException
-
switch
- switch不支持boolean,long,float
- switch中,default都是最后匹配的,如果被匹配到没有break,就会继续往下走。直到执行完或break;
-
Java文件执行顺序选择
- 加载 -> 校验 -> 使用代码
- 父静态代码块> 子静态代码块> 父代属性初始化> 父代码块> 父构造函数> 子代属性初始化> 子代码块> 子构造函数
-
interface的默认修饰符是 public static final
-
try catch final
- 不管有没有出现异常,finally块中代码都会执行;
- 当try和catch中有return时,finally仍然会执行;
- finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,不管finally中的代码怎么样,返回的值都不会改变,任然是之前保存的值),所以函数返回值是在finally执行前确定的;
- finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值。
- 在final中执行代码发生异常时,直接忽略或仅记录日志,否则会导致finally代码块无法正常结束。进而导致try catch中的异常的抛出,也会影响返回值。
-
Optional 类:
- 禁止对Optional对象赋值/返回为null,或与null比较;
- 不应该返回 Optional<'Integer> 、 Optional<'Long> 、 Optional<'Double> ,而应该使用
OptionalInt 、 OptionalLong 、 OptionalDouble
-
java使用DatagramPacket来打包数据,使用DatagramSocket来发送和接收数据.
-
Path中没有exists、isExists方法,Files中没有isExists方法
-
fetchSize控制了JDBC每次读取数据的行数,越大性能越高,太大可能会内存溢出(OOM)
NIO Selector
- 一个Selector对应多个Channel,一个选择器最多可以同时被63个通道
- 注册监听事件:Connect,Accept,Read,Write
- Java普通IO是面向流的,NIO是面向缓冲区的
- Selector等事件就绪后才会返回,避免IO阻塞,NIO各种流是非阻塞的,如果没有数据可用也不会阻塞线程
- Selector是Channel的复用器,不用Close
Buffer
- flip()方法将Buffer