简述:入职菊厂第一周,没什么任务,正全力准备java安全编码考试,跟阿里规范类似,不过要多很多安全攻防的内容和一些之前没注意的知识点,所以记录分享自己学到的经验

命名规范

类似阿里规范,省略一万字...

编码规范

整数溢出

对于整数溢出问题,可以通过先决条件检测、使用Math类的安全方法.向上类型转换或者使用Biglnteger等方法进行规避。

除数不为0

对除数进行非0判断,然后再进行除法或取余运算。

浮点比较

考虑浮点数的精度问题,可在一定的误差范围内判定两个浮点数值相等。这个误差应根据实际需要进行定义

精度计算

涉及精确的数值计算〔货币、金融等),建议使用int , long .BigDecimal 等;在构造BigDecimal 时,使用浮点数容易导致精度损失,应该使用字符串格式的数值构造BigDecimal

字符串换行和分割

用做换行〈回车"\r"、换行"\n")、文件路径分隔《"\"、"/")的字符.在不同探作系统下是有区别的。使用Systerm.lineSeparalor()获攻运行时环境的换行符。文件骛径分割符可以使java.io.File中的separator和pathseparator静态属性。

字符和字节转换

当跨平台实现字符与宁节之间的转换,可能会导致乱码。所以字符与字节之间转换时要明确指定编码方式

包装类型数值运算

包装类型进行加减乘除,涉及拆箱,可能导致空指针

断言

对不可信源进行报错,对可信源进行断言

断言是否生效依赖运行时属性的状态,存在被禁用的场景

信息安全

异常泄露

程序抛出的异常中,可能会包含一些敏感信息,将这些异常直接记录到日志或反馈给用户,会导致敏感信息泄露风险。

应该把原生异常打印记录日志,而向用户抛出自定义异常信息。

日志攻击

直接将外部数据记录到日志中,可能存在以下风险:

·日志注入:恶意用户可利用回车.换行等字符注入一条与系统日志规格类似的伪日志;

·敏感信息泄露:当用户输入敏感信息时,直接记录到日志中可能会导致敏感信息泄露;

·垃圾日志或日志覆盖:当用户输入的是很长的字符串,直接记录到日志中可能会导致产生大量垃圾日志;

·当日志被循环覆盖时,这样还可能会导致有效日志被恶意覆盖。

防御手段:

·换行回车replace其他字符

·敏感信息加密后在打印日志

·截断较长字符串

安全管理器

所有的敏感操作必须经过安全管理器的检查,防止被不可信的代码调用

非法路径参数

文件路径来自外部数据时,必须对其合法性进行校验,否则可能会产生路径遍历(Path Traversal〉漏洞。

对文件路径的规范化处理必须使用getcanonicalPath0,禁止 用getAbsalutePatho〔该方法无法保证在所有的平台上对文件路径进行正碎的规范化处理}

非法解压

使用java.util.zip.ZiplnputStream解压zip文件时,可能会有两类安全风险:

·将文件解压到目标目录之外

压缩包中的文件名中如果包含..,可能导致文件被解压到日标日录之外,造成任意文件注入、文件恶

意篡改等风险。因此,压缩包中的文件在解压前,要先对解压的目标路径进行校验。如果解压目标路径不在预期目录之内,要么拒绝将其解压出来,要么将其解压到一个安全的位置

·解压的文件消耗过多的系统资源

zip压缩算法可能有很大的压缩比,可以把超大文件压缩成很小的zip文件〈例如可以将上G的文件压缩为几K大小,这样的文件解压可能会导致zip炸弹(zip bomb)攻击。所以zip文件解压时,需对解压

的实际文件大小进行检查,若解压之后的文件大小超过一定的限制,必须拒绝解压。具体的大小限制根据实际情况来确定。除此之外,解压时,还需要对解压出来的文件数量进行限制,防止zip压缩包中是数量巨大的小文件说明:在统计解压文件的大小时,不应该使用entry.getsize来统计文件大小, <entry.getSize:是从zip文件中的固定字股中渎取单个文件压缩前的大小,文件压缩前的大小可被恶意篡改。>

非法序列化

当序列化结果中含有敏感信息时,序列化结果在磁盘上存储、跨信任域传递等操作都存在敏感信息泄露风险

  • 如果敏感信息必须序列化,需要先对越感信息迄行加密或对序列化结果进行加密,跨信任边界传递含敏感信良的序列化结果时要先签名后加密。
  • 使用transient关键词修饰含敏感信息的属性,避免这些属性进行序列化

非法反序列化

当反序列化操作的数善是外部数据时,恶意用户可利用反序列化操作构造指定的对象、执行恶意代码、向应用程序中注入有害数据等。

  • 对className进行白名单校验。如果反序列化的类不在白名单之中,直接抛出异常.
  • 如果产品已经使用Java的安全管理器,建议使用Java安全管理器机制进行防护

安全随机数

不安全的随机数可能被部分或全部预测到,导致系统存在安全隐患,安全场景下使用的随机数必须是密码学意义上的安全随机数。

常见安全场景包括但不限于以下场景:

  • 用于密码算法用途,如生成Ⅳ、盐值、密钥等;
  • 会话标识〈sesslonld)的生成;
  • 挑战算法中的随机数生成;·验证码的陆机数生成;

安全随机数产生方式:

  • Linux操作系统的/devrandom没备接口(存在阻塞问题}.
  • windows探作系统的CryptGenRandomn)接口
  • Java中的SecureRandom是一种密码学安全的伪机数产生,对于使用非真随机数产生器产生随机数时,要使用少量真随机数作为种子

网络通信

必须使用SSLSocket代替Socket来进行安全数据交互。在数据非敏感,或数摇已加密的情况下,可以使用Socket进行传输,效率更高。

sql注入

SQL注入产生的根本原因是使用外部数据直接拼接SQL语句

防护手段:

·使用参数化查淘:最有效的防护手段,但对sQL语句中的表名、字段名等不适用;

·对外部数据进行白名单校验:适用于拼接SQL语句中的表名、字段名;

·对外部数据中的与SQL注入相关的特殊字符进行转义:适用于必须通过字符串拼接构造SQL语句的场景,转义仅对由引号限制的字段有效

命令注入

Runtime.exec()方法或java.lang.ProcessBuildier类被用来启动一个新的进程,在新进程中执行

命令。命令执行通常会有两种方式

·直接执行具体命令:例如Runtime.getRuntimel).exec "ping127.0.0.1"");

·通过shell方式执行命令: vindaws下使用cmd.exe、linux下通过sh方式执行命令,或通过脚本文件( *.bati*.sh)执行命令古接使用外部数据构造命令行,会存在以下凤险:

shell方式执行命令时,需要命令行解释器对命令字符串进行拆分,该方式可执行多条命令,存在命令注入风险;

·直接执行具体的命令时,可以通过空格、双引号或以-顽开头的字符串向命令行中注入参数,存在参数注入风险.

防御手段;

·避免直接执行命令,用其他类库函数代替·对外部数据进行白名单([O-9A-Za-z@]+〕校验

·对外部数据进行转义(如果输入校验不能禁止有风险的特殊宁符,需先外部输入进行转义处理,转义后的字段拼接命令行可有效防止命令注入的产生)

XML注入

使用未经校验的数据来构造XML会导致XML注入漏洞

防御手段:

·白名单校验\w

·使用安全的xml库(dom4j)

·转义

XXE攻击(XML External Entity外部实体攻击)

XML实体包括内部实体和外部实体。外部实体格式: <!ENTITY实体名SYSTEM URI"">或者

<!ENTITY实体名PUBLIC"public_ID""URI""> . Java中引入外部实体的协议包括http. https、ftp. file. jar. netdoc. mailto等。XXE漏洞发生在应用程序解析来自外郁的XML数据或文件时没有禁止外部实体的加裁,造成任意文件读取、内网端口扫描、内网网站攻击,DoS攻击等危害

防御手段:

  • 禁止DTDs
  • 白名单校验

XEE攻击(XML Entity Expansion内部实体拓展攻击)

XMIL内部实体格式:<!ENTITY实体名""实体的值"">。内部实体攻击比较常见的是XML EntityExpansion攻击,它主要试图通过消耗目标程序的服务器内存资源导致DoS攻击。例如,解析下面的XML时,因为内部实体lo9是一个非常大的字符串,所以解析<lolz>节点时,会占用大量服务器内存资源,导致拒绝服务攻击。

防御手段;

禁止DTDs

限制实体数量

并发多线程

data race数据竞争

两个线程对一个非volatile的共享变量进行访问操作,其中至少一个是写操作,且两个操作之间没有happends-before关系,就是datarace

通过建立happends-before消除data race.建立happends-betore需要远取合适的同步机制:

  • 消息队列iexecutor. future)
  • synchronize或volatile

happend-before原则

  • 单线程按原代码顺序执行- unlock发生于lock之前
  • volatile变量特性:对此变睑过的写操作发生于读操怍之前isynchronized没有happends-before}
  • 线程启动特性; start先于此线程任何一个动作
  • 线程中断特性:interrupt先于中断事件检测的代码发生
  • 线程终止特性:线程的所有操作都先于终止检测的代码发生
  • 对象络结特性:一个对象的初始化完成都先于其finalize发生开始

实例锁无法同步静态共享变量

锁对象并不是static,但共亨变量是static时,锁代码同步效果失效。

  • 把锁对象也声明为static即可。

错用共享对象锁

如果锁对象是同一个引用内存,容易出现不同的共享变量依赖相同的锁。

eg:private final String lock = "lock"// 或者 = Boolean.TRUE

Java编码安全规范相关推荐

  1. Google 出品的 Java 编码规范,值得借鉴!

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 译者:Hawstein 原文:google.github.io/s ...

  2. Google 出品的 Java 编码规范,权威又科学,强烈推荐

    作者: Hawstein || 编辑:搜云库技术团队 http://www.hawstein.com/posts/google-java-style.html 这份文档是Google Java编程风格 ...

  3. Google 的 Java 编码规范,参考学习!

    这份文档是 Google Java 编程风格规范的完整定义.当且仅当一个 Java 源文件符合此文档中的规则, 我们才认为它符合 Google 的 Java 编程风格. 与其它的编程风格指南一样,这里 ...

  4. java编码ppt_[2018年最新整理]Java编码规范.ppt

    [2018年最新整理]Java编码规范 制定编码规范的最主要的目的是为了对产出代码的长期维护.通常负责 维护代码的人大多都不是开发者本人,如果有一个统一的代码格式以及 说明就可以减少混淆提高理解速度. ...

  5. Google 出品的 Java 编码规范和编程指南!

    这份文档是Google Java编程风格规范的完整定义.当且仅当一个Java源文件符合此文档中的规则, 我们才认为它符合Google的Java编程风格. 与其它的编程风格指南一样,这里所讨论的不仅仅是 ...

  6. 规定自己的Java编码规范

    给自己规定了Java编码规范.编写Java代码严格依照自己规定的格式.欢迎大家指出问题. /* *COPYRIGHT */package com.triangle23.projectabbreviat ...

  7. Java编码规范,在您进行编码之前应该阅读的规范

    为什么80%的码农都做不了架构师?>>>    本文转载于:http://www.web3d.com.cn/new/teach/java3d/2006/11/13/363276161 ...

  8. 掌握Java编码规范

    掌握Java编码规范

  9. Java基础学习总结(92)——Java编码规范之排版、注释及命名

    为使开发人员养成良好的开发习惯,编写可读性强.易维护的程序,结合以往资料,现整理Java编码规范,将之作为开发人员的参照依据. 一.排版 1.相对独立的程序块之间必须加空行

  10. java编码规范文档 下载_软件项目实训及课程设计指导——制定待开发项目中各种文档的规范...

    软件项目实训及课程设计指导--制定待开发项目中各种形式文档的规范 1.制定对课程设计项目开发过程中的规范性要求 (1)从"形式"到"内容"两个方面控制和要求开发 ...

最新文章

  1. 即将到来的金三银四,这10道springboot常见面试题你需要了解下
  2. python正则表达式操作指南_Python正则表达式操作指南
  3. 八进制、十进制、十六进制及字符相互对应表
  4. 显示Flash时控制其的宽度与高度
  5. Uva 11600 期望DP
  6. 关于raid5 5e 5ee的性能 对比及其数据恢复原理
  7. 如何获取LanuchImage
  8. 安川机器人焊枪切换设定方法_【分享】焊接机器人的性能要求与系统构成
  9. PRML笔记:模式识别与机器学习
  10. 操作系统习题解答 (张尧学) 第一章
  11. 网络编程+并发编程总结
  12. 为什么会有Memlink? redis
  13. java 标题栏_如何更改java应用程序标题栏默认图标
  14. 红黄绿灯控制系统c语言,微机课设-红、黄、绿灯的控制系统设计.doc
  15. MFC+Opencv实现图片视频处理和人脸识别
  16. java实习第三周总结
  17. CircuitBreaker断路器
  18. 《机器学习》周志华课后习题答案——第五章(1-7已完结)
  19. 使用css和js实现鼠标拖尾特效(七彩泡泡)
  20. linux lo回环接口与127.0.0.1

热门文章

  1. 5个值得安利的PC软件,建议收藏转发
  2. java实现一台电脑控制多台手机_涨姿势:教你用电脑远程控制多台手机!终于可以挂手机了!...
  3. java如何防止sql注入
  4. SVPWM算法理解(一)——基本原理
  5. python写界面c这算法_OpenCV算法精解:基于Python与C.pdf
  6. FileUtils(文件读写操作工具类)
  7. [ 4w字 ] JavaSE总结(基础+高级+多线程+面试题)
  8. jedate时间插件
  9. 厂商服务器存储默认管理口登录信息 默认IP、用户名、密码
  10. Linux下安装libiconv