Input Validation 输入验证
验证用户和其他程序输入的编程。安全开发的基本功——所有外部进来的东西都不可信,必须先检查。
永远不要信任的输入
- 表单字段
- URL 参数 / Path 参数
- HTTP Header(包括 User-Agent、Cookie、Referer)
- 上传的文件(包括文件名、内容、MIME)
- API 调用的 JSON / XML
- 数据库读出的内容(别人写进去的!)
- 配置文件、环境变量
两种思路
| 思路 | 解释 | 推荐度 |
|---|---|---|
| 白名单 (Allow-list) | 只允许已知合法的 | 优先用 |
| 黑名单 (Deny-list) | 拒绝已知恶意的 | 兜底,总有绕过 |
验证什么
- 类型 —— 数字就必须是数字
- 长度 —— 防 buffer overflow、防滥用
- 格式 —— 正则、JSON schema
- 范围 —— 年龄不能 -1
- 业务逻辑 —— 转账金额不能超过余额
在哪做
前后端都要做,后端必须做。前端只是 UX,任何人都能用 curl 跳过前端。
防住的攻击: