说我有一张表格:
<form action="form.php?redirect=false" method="post">
<input type="hidden" name="redirect" value="true" />
<input type="submit" />
</form>
在form.php上:
var_dump($_GET['redirect']) // false
var_dump($_POST['redirect']) // true
var_dump($_REQUEST['redirect']) // true
如何获取注入的查询字符串参数以覆盖$_POST
值,以便$_REQUEST['redirect']
= false
?
答案 0 :(得分:11)
如果要更改$_GET
数组中$_POST
优先于$_REQUEST
的优先级,请更改php.ini中的request_order指令。
默认值为:
request_order = "GP"
P代表POST,G代表GET,后面的值具有优先权,因此在此配置中,查询字符串中的值将覆盖$_REQUEST
数组中POST传递的值。如果你想要POST覆盖GET值,只需按照这样切换它们:
request_order = "PG"
您需要重新启动webserver / php才能生效。
(编辑使用Brad建议的更合适的request_order,而不是variables_order)
答案 1 :(得分:4)
请参阅PHP.ini中的request_order
指令。
但实际上,您应该明确使用您特别想要的超全局。否则,您不能依赖系统之间的一致行为,然后您的变量可能会被意外覆盖。
答案 2 :(得分:2)
请参阅PHP的request order参数。在这里,您可以设置数组是否填充post,get,cookie或其任何组合。
答案 3 :(得分:0)
$_REQUEST['redirect'] = $_POST['redirect'];
或
$_REQUEST['redirect'] = $_GET['redirect'];
取决于你想要的东西
答案 4 :(得分:0)
如果你在那最后一行意味着false
,并且希望$_REQUEST
仍然拥有来自POST和GET数据的数据,并且不想弄乱配置,请使用:< / p>
$_REQUEST = array_merge($_POST, $_GET);
答案 5 :(得分:0)
我只想添加@Chris Hepner 的回答,正如他所说:
<块引用>"后面的值优先",
后面是字母 P 而不是 G,因此这意味着 POST 值具有优先权,并且 POST 值会覆盖 GET 值。
代码示例:
<?php
echo ini_get('request_order')."\n";
echo ini_get('variables_order')."\n";
echo var_export($_REQUEST,1);
?>
结果:
EGPCS
array (
'abc' => '5',
'fed' => '2',
'cde' => '8',
...
)
我添加了这条评论,供其他人寻找相关信息