在PHP中,$_GET
和 $_POST
是两种独立的超全局数组,它们的参数来源和处理逻辑有本质区别:
$_GET
的底层逻辑
- 参数来源:URL查询字符串(如
?key1=value1&key2=value2
)。 - 无关请求方法:无论请求是
GET
、POST
还是其他方法,只要URL中存在查询字符串,PHP都会自动解析到$_GET
数组中。
$_POST
的底层逻辑
- 参数来源:请求体(Body),且仅当请求头的
Content-Type
是application/x-www-form-urlencoded
或multipart/form-data
时(如表单提交)。 - 依赖请求方法:只有使用
POST
方法时,PHP才会自动解析请求体到$_POST
数组。 - 注意:如果要在 Burp Suite 中将 GET 请求修改为 POST 请求并修改请求体,请在修改完请求行的
GET
后在右侧 Inspector 内修改请求体,否则 Burp Suite 不会自动向请求头中添加Content-Type
字段,导致参数无法传给$_POST
数组。
由此可得:只要 URL 中存在查询字符串,都会被解析到 $_GET
数组;但 $_POST
数组依赖 POST
方法与请求头,条件不满足时会有参数无法传到 $_POST
数组中的情况。
关于 php://input
伪协议
php://input
伪协议可用于读取请求体的原始数据,不管请求方法是 GET
还是 POST
还是其他方法。类似 URL 传参时的 $_GET
数组。