javascript仅允许重定向同一域内的URL

时间:2015-05-11 16:35:37

标签: javascript jquery url redirect

我有一个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

这就是为什么我在上面说过我目前检查它是否以" /"但我不确定它是否足够安全。所以我无法使用你的一些建议。

由于

3 个答案:

答案 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是否具有此功能?

抱歉,理想情况下,它应该是评论但没有足够的权限。