ASP.NET MVC 1.0, 2.0 응용 프로그램의 샘플 프로젝트에서 AccountController 내의 Return Url 처리시
Return Url을 변조 가능성을 잠재하고 있다.
이러한 문제를 해결하기 위해서 아래의 코드를 통해서 Return Url을 체크를 꼭 해야한다.
MVC 3.0 이상부터는 UrlHelper 클래스안에 IsLocalUrl 이라는 메소드가 정의가 되어있으며, 샘플 코드에도 자동으로
적용이 되어있다.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Routing;
namespace OpenRedirectionAttack.Code
{
public class UrlHelperExtension
{
public bool IsLocalUrl(string url)
{
if (string.IsNullOrEmpty(url))
{
return false;
}
Uri absoluteUri;
if (Uri.TryCreate(url, UriKind.Absolute, out absoluteUri))
{
return String.Equals(HttpContext.Current.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;
}
}
}
}