Javascript 如何在ASP.NET MVC中编码值以放入iframe src属性以防止XSS

Javascript 如何在ASP.NET MVC中编码值以放入iframe src属性以防止XSS,javascript,asp.net,asp.net-mvc,iframe,xss,Javascript,Asp.net,Asp.net Mvc,Iframe,Xss,使用ASP.NET MVC,我有一个url,它采用一个名为path的查询字符串参数,该参数可以是我的站点中的url。我发现了一个XSS漏洞,无法正确编码路径值以防止XSS(但没有编写大量代码将可接受的URL列入白名单) 因此,用户访问的url是: /iFrame?path=mypage.aspx XSS可以如下所示: /iFrame?path=javascript:alert%281%29 使用路径查询字符串值的iFrame的HTML为: <iframe src="@Model.Sou

使用ASP.NET MVC,我有一个url,它采用一个名为path的查询字符串参数,该参数可以是我的站点中的url。我发现了一个XSS漏洞,无法正确编码路径值以防止XSS(但没有编写大量代码将可接受的URL列入白名单)

因此,用户访问的url是:

/iFrame?path=mypage.aspx
XSS可以如下所示:

/iFrame?path=javascript:alert%281%29
使用路径查询字符串值的iFrame的HTML为:

<iframe src="@Model.Source"></iframe>

我也试过:

这两种方法仍然显示javascript警报框


是否有ASP.NET MVC的内置编码器对其进行编码,以便src不会执行javascript?或者我需要做一些白名单或其他方法来防止它吗?

您需要解析URL并白名单协议

调用
Uri.TryParse()
,并拒绝任何返回false或具有HTTP或HTTPS以外协议的URL

您还需要决定是否允许相对URL。

我建议阅读ASP.NET MVC 3 UrlHelper类中有关使用IsLocalUrl()方法的内容:

public bool IsLocalUrl(string url) {
  return System.Web.WebPages.RequestExtensions.IsUrlLocalToHost(
    RequestContext.HttpContext.Request, url);
}
System.Web.WebPages RequestExtensions类中的IsUrlLocalToHost()方法:

public static bool IsUrlLocalToHost(this HttpRequestBase request, string url)
{
  return !url.IsEmpty() &&
      ((url[0] == '/' && (url.Length == 1 ||
       (url[1] != '/' && url[1] != '\\'))) ||   // "/" or "/foo" but not "//" or "/\"
       (url.Length > 1 &&
        url[0] == '~' && url[1] == '/'));   // "~/" or "~/foo"
}

我没有投反对票。我选择埃里克的答案是因为它易于使用。@slolife:Yes;他的答案更好。(假设不允许任何绝对URL)