使用header()安全地重定向到$ _GET变量

时间:2011-03-22 13:49:52

标签: php security header

我正在浏览当前的登录系统,只需使用header("Location: ".$_POST['url']);成功登录后即可进行重定向。加载表单时,$_POST['url']本身是从隐藏字段中的$_GET['url']参数设置的。

正如您所看到的,有一种显而易见的方法可以劫持用户,甚至可能让他们登录钓鱼网站。

是否有一种防止劫持$_POST['url']的简单方法?我最初的想法是basename(),但有时候所需的页面在一个目录中,所以这不起作用。

4 个答案:

答案 0 :(得分:4)

您应该在用户会话中设置重定向URL,并在成功登录后将用户重定向到该URL。这样就无法劫持URL。

答案 1 :(得分:3)

我认为最安全的方法是仅使用域名后面的部分,并制作允许的文件/目录的白名单,并检查这些内容。

答案 2 :(得分:1)

使用parse_url()获取PHP_URL_PATHPHP_URL_QUERY个部分,然后重定向到相对路径。

但最好在会话中存储重定向链接。

答案 3 :(得分:0)

它将来自使用该代码的POST变量,而不是GET变量。然而,在两者都可以相对容易地伪造的意义上,它们都不再是“安全的”。如果您担心可能传递的值,则需要以某种方式验证它们。如果只有少量可能的网址,只需检查该值是否为in_array(),如果没有,则重定向到默认位置。

但是,我不确定你对发生的事情感到担忧。用户无法在地址栏中输入任何网址吗?将自己重定向到另一个网址这个的方式有什么用呢?除非这个软件依赖HTTP_REFERER来保证安全......这也是不安全的。