我有一个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
这就是为什么我在上面说过我目前检查它是否以" /"但我不确定它是否足够安全。所以我无法使用你的一些建议。
由于
答案 0 :(得分:4)
你可以使用(而不是新的)URL Api:
var redirUrl = "http://www.somewebsite.com/some/path";
var currentHost = location.host;
if (new URL(redirUrl).host != currentHost)
return false;
答案 1 :(得分:2)
您是否可以从服务器发出HTTP 307临时重定向,而不必担心客户端代码?这样看起来更安全。 http://en.wikipedia.org/wiki/URL_redirection
否则,你的javascript也可以检查window.location.hostname。
编辑:如果你只是允许相对网址,那么只要你100%确定它是一个网址,看起来在开始时检查'/'应该是相当安全的,但你甚至可以添加window.location.hostname一开始就绝对肯定你正在压制语义欺骗的可能性。答案 2 :(得分:2)
您可以使用window.document.domain获取当前域名,并检查GET操作提供的URL是否具有此功能?
抱歉,理想情况下,它应该是评论但没有足够的权限。