TP6默认不自动转义$_POST,所谓“自动转义”多为magic_quotes_gpc残留、Nginx配置或前端重复序列化所致;需通过phpinfo()、php://input对比及中间件排查确认来源。

ThinkPHP 6.x 中 POST 参数自动转义是怎么回事
默认情况下,ThinkPHP 6 不会对 $_POST 做任何字符转义或过滤,所谓“自动转义”是早期 ThinkPHP 3/5 版本遗留的误解。TP6 使用的是原生 PHP 的 $_POST 数据,但如果你启用了 app_middleware 中的 CheckRequestCache 或自定义了输入过滤中间件,才可能触发类似行为。
常见误判场景:前端传 {"name": "O'Reilly"},后端用 $this->request->post('name') 拿到 O'Reilly —— 这通常不是 TP6 干的,而是 PHP 的 magic_quotes_gpc(已废弃)残留,或 Nginx/Apache 配置了额外过滤,也可能是前端重复 JSON.stringify 导致反斜杠叠加。
- 检查 PHP 配置:
phpinfo()确认magic_quotes_gpc为Off - 查看 Nginx 配置中是否含
mod_security或自定义rewrite规则对请求体做了处理 - 用
file_get_contents('php://input')直接读原始请求体,对比$this->request->post()输出,确认差异来源
手动处理 POST 字符转义(如需兼容旧逻辑)
如果你确实需要对 POST 参数做统一转义(例如适配老系统、防止 SQL 注入兜底),不建议全局修改 $_POST,而应在业务层按需处理。TP6 推荐方式是使用 thinkacadeRequest 提供的过滤机制:
// 在控制器方法中
$name = $this->request->post('name', '', 'htmlspecialchars'); // 自动 HTML 转义
$content = $this->request->post('content', '', 'addslashes'); // 类似旧版 addslashes 行为
-
addslashes仅对'、"、、