我正在浏览当前的登录系统,只需使用header("Location: ".$_POST['url']);
成功登录后即可进行重定向。加载表单时,$_POST['url']
本身是从隐藏字段中的$_GET['url']
参数设置的。
正如您所看到的,有一种显而易见的方法可以劫持用户,甚至可能让他们登录钓鱼网站。
是否有一种防止劫持$_POST['url']
的简单方法?我最初的想法是basename()
,但有时候所需的页面在一个目录中,所以这不起作用。
答案 0 :(得分:4)
您应该在用户会话中设置重定向URL,并在成功登录后将用户重定向到该URL。这样就无法劫持URL。
答案 1 :(得分:3)
我认为最安全的方法是仅使用域名后面的部分,并制作允许的文件/目录的白名单,并检查这些内容。
答案 2 :(得分:1)
使用parse_url()
获取PHP_URL_PATH
和PHP_URL_QUERY
个部分,然后重定向到相对路径。
但最好在会话中存储重定向链接。
答案 3 :(得分:0)
它将来自使用该代码的POST变量,而不是GET变量。然而,在两者都可以相对容易地伪造的意义上,它们都不再是“安全的”。如果您担心可能传递的值,则需要以某种方式验证它们。如果只有少量可能的网址,只需检查该值是否为in_array()
,如果没有,则重定向到默认位置。
HTTP_REFERER
来保证安全......这也是不安全的。