【发布时间】:2016-12-28 00:16:33
【问题描述】:
所以我一直在编写一个登录脚本,成功登录后,它会重定向到上一页。我见过几种传递引用 URL 的方法:
使用 $_SERVER['HTTP_REFERER'] - 发送整个引用 URL。可能被操纵。所以不值得信任。
$_GET 并将引用者作为 url 参数传递。一点都不安全。
在表单中使用隐藏字段。即使使用 POST 也不那么安全。
所以,由于方法 2 具有最大的灵活性,所以我选择了它。问题是: 如果我传递没有域的 URL('http://www.domain.com/' 被剥离),然后在重定向时手动添加域,我可以确定生成的 URL 重定向保留在我的域中吗?如果没有,我该怎么做才能确保它不会跑偏?
(假设不存在带有结果url的页面,则重定向到首页)
例如:http://www.domain.com/login.php?ref=category/products/product-1.php
登录成功后,页面重定向到'http://www.domain.com/'.$_GET['ref']
我知道应该做些什么来验证referer url参数:
'../' 可以帮助导航到上一个文件夹,如果有,必须将其删除。
必须剥离引用 url 参数中传递的所有标签。
必须删除所有“://”。
【问题讨论】:
-
不确定我是否真的理解,但存储 url 的会话变量(作为数组)可能是合适的 - 您可以在会话变量中查找上一页并重定向到该页面
-
在 $_SESSION 中存储这么多 URL 是否会造成损失?在堆栈表单中使用它可能会有点问题,因为我将不得不检查他们是否导航到之前的页面或使用浏览器上的后退按钮。