说明:收录日常工作中会涉及到的
不可信数据定义
- 文件(包括程序的配置文件)
- 注册表
- 网络
- 环境变量
- 命令行
- 用户输入(包括命令行、界面)
- 用户态数据(对于内核程序)
- 进程间通信(包括管道、消息、共享内存、socket等、RPC)
- 函数参数(对于API)
- 全局变量(在本函数内,其他线程会修改全局变量)
数据校验
规则1.1:跨信任边界传递的不可信数据使用前必须进行校验
Low Level分析中信任边界的意识
4种方式:
- 白名单校验:接受已知的合法数据集。此种最为推荐。
- 黑名单校验:拒绝已知的非法数据集。
- 白名单净化:对任何不属于已验证合法字符数据中的字符进行净化,然后再使用净化后的数据,净化的方式包括删除、编码、替换。
- 黑名单净化:剔除或者转换某些字符(例如,删除引号、转换成HTML实体)。
对不可信数据进行校验时,禁止使用assert语句。使用断言进行不可信数据校验存在以下问题:
对不可信数据校验是系统实现逻辑的一部分,是必须要执行的;而断言是否生效依赖于运行时属性的状态,存在被禁用的场景,导致不可信数据校验失效。
禁止直接使用不可信数据来拼接SQL语句
防止SQL注入的方式主要有以下三类:
使用参数化查询:最有效的防护手段,对于sql语句中的表名、字段名、部分场景下的in条件不适用;
对不可信数据进行白名单校验:适用于拼接sql语句中的表名、字段名;
对不可信数据进行转码:适用于拼接到sql语句中的由引号限制的字段