You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

fetch发送POST请求时php://input是PHP唯一接收方式吗?是否安全?

问题解答

1. 并发请求访问php://input是否会冲突

不会出现冲突。php://input是请求级别的独立流,每个HTTP请求都会分配专属的请求体缓冲区,不同请求的php://input内容完全隔离,哪怕多个请求同时访问不同/相同的PHP脚本,也不会出现数据串读的情况。

2. fetch请求下的请求来源校验实现

  • 首先php://input仅负责读取请求体内容,本身没有任何请求来源校验的能力。
  • 你可以手动给fetch请求添加X-Requested-With请求头,后端原有的校验逻辑无需修改,fetch配置修改如下:
fetch('/myscript.php', {
    method: 'post',
    mode: "same-origin",
    credentials: "same-origin",
    // 新增headers配置
    headers: {
        'X-Requested-With': 'XMLHttpRequest',
        'Content-Type': 'application/json'
    },
    body: JSON.stringify({par1:par1, par2:par2})
})

注意:X-Requested-With头本身可以被伪造,仅能拦截普通的直接访问请求,要实现更高等级的安全防护建议搭配CSRF Token校验。

3. PHP接收fetch提交数据的最优方式

你当前的写法是JSON请求场景下的标准实现,不存在不适配的问题:PHP的$_POST超全局变量仅会自动解析application/x-www-form-urlencoded、multipart/form-data两种格式的请求体,如果你使用JSON格式传参,必须从php://input读取原始内容后做JSON解码。
如果你想简化代码,可以封装公共的读取助手函数:

// 封装公共助手函数,全局调用即可
function get_json_post(): array {
    $input = file_get_contents('php://input');
    return json_decode($input, true) ?: [];
}

如果你想沿用之前$_POST直接读取参数的写法,不需要用JSON传参,把fetch的请求体改成URLSearchParams格式即可,示例如下:

const params = new URLSearchParams();
params.append('par1', par1);
params.append('par2', par2);

fetch('/myscript.php', {
    method: 'post',
    mode: "same-origin",
    credentials: "same-origin",
    headers: {
        'X-Requested-With': 'XMLHttpRequest'
    },
    body: params
})

这种写法下PHP端可以直接通过$_POST['par1']、$_POST['par2']读取参数,和之前JQuery $.post的使用体验完全一致。

内容的提问来源于stack exchange,提问作者klm123

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 17:18:00