---
title: "PHP 安全清单：预编译、CSRF 与输出转义"
date: 2025-12-18
category: "后端开发"
---

# PHP 安全清单：预编译、CSRF 与输出转义

写第一版注册接口的那天晚上，我把用户输入直接拼进了 SQL。测试用的用户名叫 o'neill，页面当场报错。

报错还是好事。真正麻烦的是那种不报错的写法：输入被某层过滤净化过，看起来安全了，换个编码就绕过去了。从那以后我养成了几个习惯，列在这里当自查表。

数据库只走预编译。不管输入是什么，参数永远交给 PDO 的占位符处理，代码里不允许出现字符串拼接的 SQL。

写操作必须有 CSRF 令牌。浏览器会自动带 Cookie，这是跨站请求伪造的根子，令牌是唯一靠谱的反制。站内用 fetch 的地方统一放请求头里。

输出必须转义。存进去的时候干净不代表输出的时候安全，同一条数据会在不同的上下文里出现。所有变量进 HTML 之前过一遍 htmlspecialchars。

跳转参数白名单。登录后回跳只接受 / 开头的站内路径，协议相对地址一律拒绝，这是钓鱼最爱钻的口子。

会话方面：Cookie 加 HttpOnly 和 SameSite，登录成功换一次会话 ID，改密码后踢掉其他设备。

这张表不高深。难的是每个入口都过一遍，而不是出事之后补。