接口是数据的入口,也是事故最常发生的地方。这份清单给自己写的接口用,全部是防御方向。

一、参数校验:不信任任何输入

  • 类型、长度、范围都校验,别只在前端做(前端只是给用户体验用的)
  • 不要直接把用户输入拼进文件名、SQL、命令里
  • 查询参数里出现数组(?id[]=1)要能安全处理,而不是报 500
  • 所有输出到 HTML 的地方做转义,富文本单独走白名单

二、鉴权与越权:最容易被忽略的一条

很多人只验证"登录了吗",忘了验证"这条数据是不是他的"。改个 ID 就能看别人的订单,这类问题至今仍常见。

// 反例:只判断登录
if (is_login()) { echo get_order($_GET['id']); }

// 正确:数据归属也判断
$order = get_order($_GET['id']);
if (!$order || $order['user_id'] !== current_user_id()) {
    http_response_code(404);
    exit;
}

三、限流:让接口在被打的时候还能用

  • 按 IP、按账号、按接口分别限流(只按 IP 容易误伤共用出口的用户)
  • 验证码、登录、发信这类接口单独定更严的阈值
  • 返回 429 并带上"多久之后重试",前端才好提示

四、日志:出问题时的唯一证据

  • 记录时间、IP、账号、动作、结果,不记密码和完整令牌
  • 敏感字段脱敏(邮箱打码、长数字打码)
  • 日志按天分割并设定保留期,别让它把磁盘写满

五、几条小习惯

  • 给用户看的错误和写进日志的错误分开 —— 别把数据库报错回给前端
  • 接口只允许需要的 HTTP 方法
  • 涉及状态的写操作加 CSRF 或同源校验