2015-05-11 22 views
2

里面的URL我有一个处理一个javascript一种关注“登录后重定向”设置的JavaScript重定向允许只为同一个域

window.location = url; 

其中“URL”由GET参数提供。 这听起来很糟糕,因为它允许在当前域之外重定向。

所以我想知道如果有一个简单和安全的方式检查“url”是一个绝对的url在同一个域内,只允许在这种情况下重定向。 目前我只是检查URL是否以“/”开头,并且不包含“http”,但我不确定它足以完全防止打开重定向。

if (url[0] === '/' && url.indexOf('http') === -1) 
{ 
    window.location = url; 
} 

正如我在客户端这样做,我知道它仍然不完美,但以前没有保护。

我可以使用好老的JS或jQuery。我也必须支持IE9。

后期编辑:也许我没有提及它清楚,但“网址”应该是一个绝对的网址,没有域的规范。 例如,我有这种地址(与最终URL参数详细地址): http://example.com/Account/Login.aspx?ReturnUrl=%2fCheckout.aspx

我需要避免: http://example.com/Account/Login.aspx?ReturnUrl=http://otherdomain/badintention.aspx

这就是为什么我对上面我目前正在检查,如果它开始由“ /“但我不确定是否足够安全。所以我不能使用你的一些建议。

感谢

回答

3

可以使用(而新)URL API:

var redirUrl = "http://www.somewebsite.com/some/path"; 
var currentHost = location.host; 

if (new URL(redirUrl).host != currentHost) 
    return false; 
+0

谢谢,很高兴知道。不幸的是我不得不支持IE9和其他相当老的浏览器。我编辑了这个问题。 – AFract

2

你能刚发出来自服务器的HTTP 307临时重定向,而不必担心客户端代码?这样看来更安全。 http://en.wikipedia.org/wiki/URL_redirection

否则,您的JavaScript也可以检查window.location.hostname。

编辑:如果你只打算允许相对URL,它似乎在开始时检查'/'应该是相当安全的,只要你100%确定它是一个URL,但你甚至可以将window.location.hostname添加到开头,绝对确保你正在压缩语义欺骗的可能性。

+0

谢谢,我编辑了这个问题。也许我不够清楚,但提供的网址根本不应该包含域名,只有绝对网址以“/”开头。 – AFract

+0

您的意思是相对URL?我正在调整我的答案来提出建议。 – Colin

2

您可以使用window.document.domain获取当前域名并检查GET操作提供的url是否有这个?

对不起,它应该是一个理想的评论,但没有足够的特权。

+0

任何应该是评论的东西都不应该是答案。 – DrCord

+0

谢谢,我编辑了这个问题。也许我不够清楚,但提供的网址根本不应该包含域名,只有绝对网址以“/”开头。 – AFract