【问题标题】:Whitelisting, preventing XSS with WMD control in C#白名单,在 C# 中使用 WMD 控制防止 XSS
【发布时间】:2011-01-07 10:51:00
【问题描述】:

我在这里做的有什么问题吗?这是我第一次处理这样的事情,我只是想确保我了解不同方法的所有风险等。

我正在使用 WMD 获取用户输入,并使用文字控件显示它。 由于一旦输入就无法编辑,我将存储 HTML 而不是 Markdown,

input = Server.HTMLEncode(stringThatComesFromWMDTextArea)

然后为我希望用户能够使用的标签运行类似以下的内容。

// Unescape whitelisted tags.
string output = input.Replace("&lt;b&gt;", "<b>").Replace("&lt;/b&gt;", "</b>")
                     .Replace("&lt;i&gt;", "<i>").Replace("&lt;/i&gt;", "</i>");

编辑这是我目前正在做的事情:

 public static string EncodeAndWhitelist(string html)
 {
     string[] whiteList = { "b", "i", "strong", "img", "ul", "li" };
     string encodedHTML = HttpUtility.HtmlEncode(html);
     foreach (string wl in whiteList)
         encodedHTML = encodedHTML.Replace("&lt;" + wl + "&gt;", "<" + wl + ">").Replace("&lt;/" + wl + "&gt;", "</" + wl + ">");
     return encodedHTML;
 }
  1. 我在这里所做的事情会保护我免受XSS 的侵害吗?
  2. 还有其他注意事项吗 那应该做吗?
  3. 有没有正常的好列表 将标签列入白名单?

【问题讨论】:

  • 自从替换“<img>”后,该代码将不适用于“IMG”标签不允许“src”属性”。

标签: c# asp.net xss wmd whitelist


【解决方案1】:

如果你的要求真的是基本的,你可以做这样简单的字符串替换,那么是的,这对 XSS 来说是“安全的”。 (但是,仍然可以在 &lt;i&gt;&lt;b&gt; 错误嵌套或未关闭的情况下提交格式不正确的内容,这可能会弄乱内容最终插入的页面。)

但这很少是足够的。例如,目前不允许使用 &lt;a href="..."&gt;&lt;img src="..." /&gt;。如果您想允许这些或其他带有属性值的标记,那么您还有很多工作要做。然后,您可能会使用正则表达式来处理它,但这会给您带来无穷无尽的问题,即意外嵌套和替换已替换的内容,例如正则表达式无法解析 HTML 等等。

为了解决这两个问题,通常的方法是在输入上使用 [X][HT]ML 解析器,然后遍历 DOM 删除除已知良好元素和属性之外的所有元素和属性,最后重新序列化为 [X] HTML。然后保证结果格式正确且仅包含安全内容。

【讨论】:

  • 那么,假设我想要更健壮的东西,您对您提到的解析器有什么建议? HTML Agility Pack 可以处理它吗?难道没有什么东西已经可以做到这一切了吗?
  • 是的,HTML Agility Pack 是一个不错的选择。解析完 DOM 后,编写一个从 DOM 树中删除除已知良好元素/属性之外的所有元素/属性的递归函数是一个相对简单的练习。此外,如果您允许 href/src/etc.,请记住检查已知良好方案的 URL,例如 http/https,以避免通过 javascript: URL 等进行注入。
猜你喜欢
  • 1970-01-01
  • 2017-06-15
  • 2013-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-25
相关资源
最近更新 更多