2011-12-20 86 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