为啥 ASP.NET MVC 中的本地 URL 的 Url.IsLocalUrl 为 false?
Posted
技术标签:
【中文标题】为啥 ASP.NET MVC 中的本地 URL 的 Url.IsLocalUrl 为 false?【英文标题】:Why Url.IsLocalUrl is false for local URLs in ASP.NET MVC?为什么 ASP.NET MVC 中的本地 URL 的 Url.IsLocalUrl 为 false? 【发布时间】:2016-04-15 08:43:52 【问题描述】:使命:
在ASP.NET MVC 5 应用程序中防止open redirection
故事:
用户在网站/
的某个网页上,说概览页面/Home/Overview
并点击登录
登录后,服务器返回一些绝密用户特定数据并重定向到用户发起登录请求的同一页面。
我需要确保服务器在登录后不会愚蠢地重定向到黑客的网站,并且还传递绝密用户特定数据。
价值观
_Controller.Request.UrlReferrer
_Controller.Request.UrlReferrer.AbsoluteUri
_Controller.Request.Url.AbsoluteUri
_Controller.Url.IsLocalUrl(returnUrl)
分别是:
https://localhost:44300/Home/Overview
"https://localhost:44300/Home/Overview"
"https://localhost:44300/Account/Login?returnUrl=%2FHome%2FOverview"
false
Url.IsLocalUrl
的值为 false,逻辑错误。
在这种情况下,如何确保用户在成功登录后安全地重定向到/Home/Overview
而不是http://blackHatHackerWebsite.com?
为什么 Url.IsLocalUrl 对于 ASP.NET MVC 中的本地 URL 为 false?
【问题讨论】:
这些解决方案你试过了吗***.com/questions/12642436/…***.com/questions/8633782/… @karthiksubramaniam 让我看看他们 【参考方案1】:Url.IsLocalUrl("/Home/Overview")
绝对是true
。你得到false
,因为它正在评估Url.IsLocalUrl("%2fHome%2fOverview")
。也就是说,你returnUrl
被url 编码了两次。试着找出你有不必要的编码的地方。
【讨论】:
我可能没有进行任何双 URL 编码。顺便说一句,我一定会检查我的代码。谢谢!!顺便说一句,我正在阅读@karthiksubramaniam 引用的posts 不确定双重编码在哪里。无法使用它检查 url 是否是本地的,我很想看一个例子。以上是关于为啥 ASP.NET MVC 中的本地 URL 的 Url.IsLocalUrl 为 false?的主要内容,如果未能解决你的问题,请参考以下文章
为啥在 asp.net mvc 中的公共路由之前先映射特殊路由?
IIS 7.5 中的 Asp.net mvc 4 应用程序问题