我有一个 JavaScript,它通过设置来处理“登录后重定向”问题
window.location = url;
其中“url”由 GET 参数提供。 这听起来是一种不好的做法,因为它允许重定向到当前域之外。
所以我想知道是否有一种简单且安全的方法来检查“url”是否是同一域内的绝对网址,并仅在这种情况下允许重定向。 目前我只是检查 url 是否以“/”开头并且不包含“http”,但我不确定它是否足以完全防止开放重定向。
if (url[0] === '/' && url.indexOf('http') === -1)
{
window.location = url;
}
当我在客户端执行此操作时,我知道它仍然不完美,但以前根本没有任何保护。
我可以使用好的旧 JS 或 jquery。我还必须支持 IE9。
后期编辑:也许我没有提到得不够清楚,但“url”应该是一个绝对url,没有域规范。 例如我有这种地址(末尾带有 url 参数的完整地址): http://example.com/Account/Login.aspx?ReturnUrl=%2fCheckout.aspx
我需要避免: http://example.com/Account/Login.aspx?ReturnUrl=http://otherdomain/badintention.aspx
这就是为什么我上面说我目前检查它是否以“/”开头,但我不确定这是否足以确保安全。所以我不能使用你的一些建议。
谢谢
最佳答案
您可以使用(相当新的)URL API:
var redirUrl = "http://www.somewebsite.com/some/path";
var currentHost = location.host;
if (new URL(redirUrl).host != currentHost)
return false;
关于javascript 只允许重定向同一域内的 url,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30173053/