Input Validation 输入验证

验证用户和其他程序输入的编程。安全开发的基本功——所有外部进来的东西都不可信,必须先检查。

永远不要信任的输入

  • 表单字段
  • URL 参数 / Path 参数
  • HTTP Header(包括 User-Agent、Cookie、Referer)
  • 上传的文件(包括文件名、内容、MIME)
  • API 调用的 JSON / XML
  • 数据库读出的内容(别人写进去的!)
  • 配置文件、环境变量

两种思路

思路解释推荐度
白名单 (Allow-list)只允许已知合法的优先用
黑名单 (Deny-list)拒绝已知恶意的兜底,总有绕过

验证什么

  1. 类型 —— 数字就必须是数字
  2. 长度 —— 防 buffer overflow、防滥用
  3. 格式 —— 正则、JSON schema
  4. 范围 —— 年龄不能 -1
  5. 业务逻辑 —— 转账金额不能超过余额

在哪做

前后端都要做,后端必须做。前端只是 UX,任何人都能用 curl 跳过前端。

防住的攻击:

  • 命令注入
  • XSS
  • Path traversal ../../etc/passwd
  • Buffer overflow
  • 业务逻辑漏洞(负数转账、越权)