标头位置 - 在帖子中返回网址 - 是否安全


Header Location - return url in post - is it safe?

我有这样的东西(简短版本):索引.php:

<?PHP
echo "<form action='process_form.php?action=do_something' method='post'>";
echo "<input type='hidden' name='return_url' value='index.php?".$_SERVER['QUERY_STRING']."'>";
?>

现在在process_form.php我已经处理了该表格,并在最后我写了这个:

<?PHP
$return_url = $_POST['return_url'];
header ("location: $return_url");
die();
?>

我的问题是 - 我做得对吗?这是处理 POST 表单数据并重定向回来的正确方法吗?问题是我的返回网址可以是任何东西,但我希望用户被准确地重定向到他们提交该表单的位置。

我应该特别注意一些安全问题吗?谢谢

我会用这个:

索引.php

<form action="process_form.php" method="post">
    <input type="hidden" name="action" value="do_something" />
    <input type="submit" value="Submit" />
</form>

process_form.php

<?php
header('Location: ' . $_SERVER['HTTP_REFERER']);
?>

我没有看到任何问题。黑客通过修改 POST 变量不会获得任何好处。他只是弄乱了他自己将要得到的HTTP响应。由于请求是 POST,因此缓存服务器不会保存响应。响应拆分在这里不是潜在的攻击媒介。

你正在做的事情是正确的。如果要重定向 $_SESSION 变量而不是 $_POST,那么将存在多个漏洞。

代码中的任何位置使用$_POST而不进行过滤可能会导致不需要的行为;在您的情况下,您应该注意响应拆分攻击。

好消息是,从 PHP 5.1.2 开始,不再可能在单个 header() 调用中不知不觉地设置多个标头。

也就是说,您仍然可以查看通常随PHP附带的各种输入过滤器 - 例如 FILTER_VALIDATE_URL .