asp.net-mvc – 如何避免打开重定向漏洞并成功登录安全地重定向(提示:ASP.NET MVC 2默认代码是脆弱
|
通常情况下,当网站要求您登录之前,您可以访问某个页面,您将进入登录屏幕,并在成功验证自己之后,将其重定向到原始请求的页面。这对于可用性非常有用 – 但是如果没有仔细检查,这个功能很容易成为一个 open redirect漏洞。 遗憾的是,有关此漏洞的示例,请查看ASP.NET MVC 2提供的默认LogOn操作: [HttpPost]
public ActionResult LogOn(LogOnModel model,string returnUrl)
{
if (ModelState.IsValid) {
if (MembershipService.ValidateUser(model.UserName,model.Password)) {
FormsService.SignIn(model.UserName,model.RememberMe);
if (!String.IsNullOrEmpty(returnUrl)) {
return Redirect(returnUrl); // open redirect vulnerability HERE
} else {
return RedirectToAction("Index","Home");
}
} else {
ModelState.AddModelError("","User name or password incorrect...");
}
}
return View(model);
}
如果用户成功通过身份验证,则将其重定向到“returnUrl”(如果通过登录表单提交提供)。 这是一个简单的示例攻击(实际上是许多的一个),它利用了这个漏洞: >攻击者假装成为受害者的银行,向受害者发送电子邮件,其中包含一个链接,如:http://www.mybank.com/logon ?returnUrl = https://www.badsite.com 关于如何维护这种重定向登录功能的任何想法,避免了开放式重定向漏洞? 我倾向于将“returnUrl”参数拆分为控制器/操作部件,并使用“RedirectToRouteResult”而不是简单的“重定向”。这种方法是否会开启任何新的漏洞? 更新 通过将自己限制在控制器/动作路由上,我无法重定向到自定义路由(例如/ backend / calendar / 2010/05/21)。我知道通过将更多的参数传递给LogOn动作,我可以让它工作,但我觉得我总是会重新访问这种方法 – 使用我们的路由方案来保持最新状态。所以,我不是将returnUrl分解为其控制器/动作部分,而是按原样保持returnUrl,并解析它,以确保它只包含相对路径(例如/ users / 1),而不是绝对路径(例如http ://www.badsite.com/users/1)。这是我使用的代码: private static bool CheckRedirect(string url) {
try {
new Uri(url,UriKind.Relative);
}
catch (UriFormatException e) {
return false;
}
return true;
}
旁注:我知道,与XSS和CSRF相比,这种开放式重定向可能不是一件大事,但是我们的开发人员是保护我们的客户免受坏人的唯一保护 – 我们可以做坏事“我的书更难获得胜利。 谢谢Brad 解决方法Jon Galloway为MVC 2(和1)写了一个 article的解决方案。这是您的问题应该有助于您的代码段: 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;
}
} (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- .net – WinInet如何确定缓存的内容和时间?
- asp.net – 如何从url中删除returnurl?
- asp.net-mvc – 在asp.net MVC3中调用局部视图
- 在ASP.NET 5中获取AuthenticationProperties
- asp.net-mvc – ASP.NET MVC – 能够处理数组的自定义模型绑
- asp.net – 如何防止Azure网站进入睡眠状态?
- asp.net中的会话,缓存和配置文件有什么区别
- asp.net – Oracle中的参数化查询问题
- asp.net-mvc-3 – MVC直接在单个对象上调用模型绑定器
- .Net 更容易的使用配置文件 SuperConfig
- asp.net-mvc-3 – Microsoft AntiXSS替代
- asp.net – 如何从浏览器历史记录中删除页面?
- 如何在自动生成的列中隐藏ASP.NET GridView中的列
- asp.net-mvc – 如何在mvc网格格式中格式化日期
- asp.net-mvc-3 – @ Html.TextBoxFor文本框在验证
- asp.net-mvc – 具有Fluent nHibernate和Ninject
- ASP.NET网站或Web项目
- asp.net-mvc – 如何阻止URL.Action包含参数?
- asp.net – 为什么IIS Express使用而不是?
- 如果验证失败,如何在ASP.NET MVC中阻止jquery aj
