2011-12-20 89 views
3

什麼是防止開放重定向攻擊的最佳方法。目前我正在開發asp.net網站。我想確保在成功登錄時不會將用戶重定向到外部鏈接?如何防止開放重定向攻擊?

編輯:是否有可能實現在不改變現有代碼的解決方案?

+0

web表單或MVC的IsLocalUrl的定義是什麼? – 2011-12-20 11:50:49

+0

我正在使用webforms – kvc 2011-12-20 11:52:04

回答

9

我假設你正在使用的login control。 您應該連接檢查ReturnUrl參數是否爲本地URL(而不是指向其他域)。該loggedin event將做這樣的事情的好去處:

void OnLoggedIn(object sender, EventArgs e) 
{ 
    string returnto = Request.QueryString["ReturnUrl"]; 
    if (returnto != "" and isLocalUrl(returnto)) Response.Redirect(returnto); 
} 

在那裏你可以使用給出here

private bool IsLocalUrl(string url) 
{ 
    if (string.IsNullOrEmpty(url)) 
    { 
     return false; 
    } 

    Uri absoluteUri; 
    if (Uri.TryCreate(url, UriKind.Absolute, out absoluteUri)) 
    { 
     return String.Equals(this.Request.Url.Host, absoluteUri.Host, 
        StringComparison.OrdinalIgnoreCase); 
    } 
    else 
    { 
     bool isLocal = !url.StartsWith("http:", StringComparison.OrdinalIgnoreCase) 
      && !url.StartsWith("https:", StringComparison.OrdinalIgnoreCase) 
      && Uri.IsWellFormedUriString(url, UriKind.Relative); 
     return isLocal; 
    } 
} 
+0

謝謝,@ Paolo,但我不想改變現有的代碼,是否有可能實現? – kvc 2011-12-20 12:21:33

+0

如果您的約束是無法重新編譯,則此更改應直接在登錄頁面的HTML中內聯執行(請參閱[LoggedIn事件的文檔](http://msdn.microsoft.com/zh-cn/library例如/system.web.ui.webcontrols.login.loggedin.aspx) – 2011-12-20 13:32:30