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
相关产品推荐
相关产品推荐

