$this->request->post() 必须带类型后缀(如/s、/d)才能安全使用,否则等同裸读$_post;json请求应改用param(),禁用$_post、input('post.')和request::instance()->post()。

$this->request->post() 是 ThinkPHP5 中最常用、也最推荐的获取 POST 数据方式,但直接调用它不加约束等于裸奔——你拿到的可能是 XSS 脚本、SQL 片段,甚至是超长字符串导致内存溢出。
为什么 $this->request->post() 有时返回空数组
这不是框架 bug,而是请求类型或内容格式不匹配:
• 表单没设 method="post" 或没提交(比如点了 GET 链接);
• 前端用了 Content-Type: application/json,而 post() 默认只解析 application/x-www-form-urlencoded 和 multipart/form-data;
• Nginx/Apache 配置了过严的 body 大小限制(如 client_max_body_size 1m),导致 POST 体被截断;
• CSRF token 校验失败且配置了 token_on_header = false,部分中间件会静默丢弃请求。
$this->request->post() 的安全写法:必须带类型后缀
ThinkPHP5 的 post() 方法支持字段类型声明,这是过滤和转换的核心机制:
• $this->request->post('username/s'):自动 trim() + htmlspecialchars(),适合文本输入;
• $this->request->post('age/d'):强制转为整型,非数字返回 0;
• $this->request->post('tags/a'):确保是数组,非数组则返回空数组;
• $this->request->post(['name'=>'s','price'=>'f','status'=>'d']):批量接收并逐字段校验,比循环判断更可靠;
• 别用 $this->request->post('content') 这种无类型写法——它等价于裸读 $_POST['content'],毫无防护。
JSON 提交时该用 param() 而不是 post()
当前端用 fetch('/api/save', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ name: '张三' }) }) 时:
• $this->request->post() 返回空数组,因为框架不解析 JSON body;
• 正确做法是改用 $this->request->param(),它会自动识别并解析 JSON、表单、路由参数;
• 若需严格区分来源,可手动读取原始流:$raw = file_get_contents('php://input');,再 json_decode($raw, true);
• 注意:启用 param() 后,GET 参数会和 POST 混合,若业务逻辑依赖“仅 POST 字段”,得用 only() 显式过滤:$this->request->only(['name', 'email'], 'post')。
绝对不要碰的三个写法
• 直接访问 $_POST:绕过所有框架过滤,XSS/SQL 注入风险直连;
• 使用 input('post.'):这是 ThinkPHP3 的遗留接口,在 TP5 中已废弃,行为不稳定且无类型支持;
• 在控制器里写 Request::instance()->post():冗余、低效,且无法享受 $this->request 的依赖注入与上下文感知能力。
/s、/d)不是可选项,是数据入口的安检门。漏掉一个,就可能让恶意 payload 穿透到模型层甚至数据库。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











