2015-05-11 21 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