Java安全编程规范总结


说明:收录日常工作中会涉及到的

不可信数据定义

  • 文件(包括程序的配置文件)
  • 注册表
  • 网络
  • 环境变量
  • 命令行
  • 用户输入(包括命令行、界面)
  • 用户态数据(对于内核程序)
  • 进程间通信(包括管道、消息、共享内存、socket等、RPC)
  • 函数参数(对于API)
  • 全局变量(在本函数内,其他线程会修改全局变量)

数据校验

规则1.1:跨信任边界传递的不可信数据使用前必须进行校验

Low Level分析中信任边界的意识
4种方式:

  1. 白名单校验:接受已知的合法数据集。此种最为推荐。
  2. 黑名单校验:拒绝已知的非法数据集。
  3. 白名单净化:对任何不属于已验证合法字符数据中的字符进行净化,然后再使用净化后的数据,净化的方式包括删除、编码、替换。
  4. 黑名单净化:剔除或者转换某些字符(例如,删除引号、转换成HTML实体)。

对不可信数据进行校验时,禁止使用assert语句。使用断言进行不可信数据校验存在以下问题:
对不可信数据校验是系统实现逻辑的一部分,是必须要执行的;而断言是否生效依赖于运行时属性的状态,存在被禁用的场景,导致不可信数据校验失效。

禁止直接使用不可信数据来拼接SQL语句

防止SQL注入的方式主要有以下三类:
使用参数化查询:最有效的防护手段,对于sql语句中的表名、字段名、部分场景下的in条件不适用;
对不可信数据进行白名单校验:适用于拼接sql语句中的表名、字段名;
对不可信数据进行转码:适用于拼接到sql语句中的由引号限制的字段

2个path的区别
在这里插入图片描述
先签名后加密的原因
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_38370441/article/details/111192818