我最近深入研究了Url.IsLocalUrl()方法的实现,该方法被广泛使用并被推荐为用于防止重定向攻击的措施之一。如果我要在我的应用程序中为我的控制器的一个操作提供一个完整的URL,我很惊讶地发现这个方法返回false。
例如,如果我的应用程序托管在http://localhost:422,并且如果我要指定有效的控制器和操作名称,例如http://localhost:422/home/index,我将得到错误。在查看其实现后,我明白了原因。但是开头的实现不正确吗?
我应该实现自己的IsLocalUrl()吗?或者我应该继续使用当前的?
答案 0 :(得分:0)
根据Same Origin Policy,host and port have to be the same。
在实践中,您将看到所有现代Web浏览器都会将具有不同端口的相同主机的2个URL视为不同的站点,无论是读取cookie还是执行脚本。
所以看起来Url.IsLocalUrl()的实现是正确的。
更新:此答案现在不适用,因为问题已更新为2个网址具有相同的主机和端口号。
答案 1 :(得分:0)
如果您查看文章Preventing Open Redirection Attacks,您会看到Url.IsLocalUrl()和ReturnUrl =的预期用途是重定向到同一网站上的内部网页/资源,通常是在登录后。
示例显示,它希望您使用相对或部分URL进行内部重定向,而不是完全限定的URL。
最佳做法是编写如下代码:
// http://localhost:422/?ReturnUrl=/home/index
// returnUrl == "/home/index"
if( Url.IsLocalUrl(returnUrl) )
{
......而不是:
// http://localhost:422/?ReturnUrl=http%3A%2F%2Flocalhost%3A422%2Fhome%2Findex
// returnUrl == "http://localhost:422/home/index"
if( Url.IsLocalUrl(returnUrl) )
{
如果您只在同一站点上使用重定向(对于大多数不是bit.ly类型站点的应用程序,建议安全性),那么您应该可以这样做。
使用现有的Url.IsLocalUrl(),但传递部分网址重定向。