【问题标题】:How to encode value to put in iframe src attribute to prevent XSS in ASP.NET MVC如何编码值以放入 iframe src 属性以防止 ASP.NET MVC 中的 XSS
【发布时间】:2014-07-24 05:03:29
【问题描述】:

使用 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?还是我需要做一些白名单或其他方法来防止它?

【问题讨论】:

    标签: javascript asp.net asp.net-mvc iframe xss


    【解决方案1】:

    我建议阅读Preventing Open Redirection Attacks (C#),它讨论了使用 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"
    }
    

    【讨论】:

      【解决方案2】:

      您需要解析 URL 并将协议列入白名单。

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

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

      【讨论】:

      • 我没有投反对票。我选择 Erik 的答案是因为易于使用。
      • @slolife:是的;他的回答更好。 (假设您不想允许任何绝对 URL)
      猜你喜欢
      • 2013-02-23
      • 1970-01-01
      • 2018-09-12
      • 2011-10-26
      • 2011-07-03
      • 1970-01-01
      • 2014-11-14
      • 2012-04-24
      相关资源
      最近更新 更多