目录
安全编码规范
安全目标
- 机密性:数据不被非法访问和窃取
- 完整性:数据完整,未被篡改
- 可用性:保护资源在需要时可以访问
数据校验
信任域:一个域包含了一个或者多个组件,不同的域有不同的权限,不同域的组件互不信任
信任边界:域之间的边界
不可信数据:来自信任边界外的数据,比如外部输入数据,第三方输入数据。
信任域A和信任域B中间有个信任边界,互相不信任!于对方而言都是不可信的数据。
-
不可信数据的列表:文件(包括程序的配置文件),注册表,网络,环境变量,命令行,用户输入,用户态数据,进程间通信(管道,消息,共享内存,socket,RPC),函数的参数,全局变量(其他线程可能会改变全局变量)
-
校验的含义
校验对象时来自边界之外的不可信数据,防止不可以或对系统造成伤害。比如SQL注入攻击,OS命令注入攻击,目录遍历攻击 -
数据校验的步骤
不可信输入->标准化和归一化(把路径的… 符号链接处理&&最简单格式)->输入清理(删除,替换不期望的字符,满足约束)->验证(确保输入格式是符合的)->输出清理(对敏感信息过滤,防止信息泄露)->命令解释器(下面注入攻击会用到) -
注入攻击
SQL注入----命令解释器(RDBMS)
OS命令注入----命令解释器(OS)
XML注入----命令解释器(XML解析器)
上面的----分别用于处理以上的注入攻击,防止注入
SQL注入
- 定义:未经校验的外部输入要构造SQL语句,导致SQL注入漏洞。攻击者构造恶意输入来改变原本的SQL逻辑或者执行额外的SQL语句。
比如 用户登录Ycx password123 ,输入Ycx’ or ‘1’='1 也是会登陆成功 - 危害:绕开检查,业务异常;获取和修改数据库数据,敏感信息泄露或者篡改;修改服务器配置
- 案例:SQL注入盗取网站的所有用户信息
- 防御策略:
1.参数化查询(预编译):使用PreparedStatement,sql语句中的参数使用占位符?来替换(不能解决所有问题)
2.验证输入:白名单验证参数是否符合类型,大小,长度,格式。黑名单查找是否存在已知的不良字符。
3.转码:特殊字符转码
具体实施会将3个策略串联起来防御
案例分析:
MySQL
典型错误:直接在SQL中拼接外部输入
SELECT * FROM db_user WHERE username = ‘Ycx’ AND password= ‘password123’ or ‘1’='1’永远是真
正确:使用预编译语句,参数化查询将查询逻辑和数据分离,互不干扰。
Hibernate
和上述类似
MyBatis
错误:
用$符号传参,类似拼接方式构造SQL语句
正确:
用#符号,达到语义逻辑和数据分离的效果
存储过程
错误:还是拼接