【问题标题】:How can I check for any html <script> tags in C#, plus anything else nasty?如何检查 C# 中的任何 html <script> 标签,以及其他讨厌的东西?
【发布时间】:2013-02-08 05:49:12
【问题描述】:

允许用户在文本框中格式化他们的 html。然后将其发送到后端进行验证。然后其他用户可能会看到此文本框。

我想检查后端中的任何标签。我知道这可以用一个相对简单的正则表达式来完成。我会做类似&lt;\s*?script\s*?&gt;

我的问题是,如果有人这样做:

<a href="http://example.com" onClick="alert(1);">test</a>

这将通过验证。我也可以对 onClick 进行正则表达式检查,但我相信还有其他方法可以解决这个问题。

我的问题:有没有好的方法可以做到这一点?我是否只需要依靠正则表达式和我自己的研究来弄清楚它们还能如何运行脚本?

编辑

我想我可以创建一个他们可以输入的白名单。它主要用于格式化文本,所以&lt;b&gt;, &lt;i&gt;, &lt;h&gt; 等。虽然这可能是也可能不是可接受的解决方案,但我需要查看实际用例是什么。我希望对此有不同的解决方案。

【问题讨论】:

  • 创建一个 JS 函数数组,然后通过函数解析 HTML 以检查多个“被阻止”关键字之一
  • 是否需要用户输入any html?
  • 不确定这是否可能超出您所要求的主题,但可能值得一试:stackoverflow.com/questions/4683907/…wpl.codeplex.com 它可能仍然是相关的,因为您正在处理 HTML 中的 JavaScript。
  • Stack Overflow 通过要求用户输入 Markdown 来解决这个问题。那怎么样?

标签: c# html regex


【解决方案1】:

确实,您应该使用白名单验证(即只允许您知道安全的特定示例),而不是尝试检测和删除潜在的危险输入。

一个非常好的方法是使用 Markdown 而不仅仅是允许 HTML 输入。

OWASP Guidelines for HTML injection

【讨论】:

  • 我同意白名单。这是一个 C# 库,它可能对解析 HTML 以清理它很有用:htmlagilitypack.codeplex.com
  • 所以我想了更多。白名单如何处理像 这样的攻击。 IMG 和 SRC 都会在白名单上,所以这会通过。
【解决方案2】:

从内容中删除所有 HTML 标记的简单方法

public string Strip(string text)
{
    return Regex.Replace(text, @”<(.|\n)*?>”, string.Empty);
}

【讨论】:

  • 我不想删除所有 HTML 标签。用户应该能够将文本设置为粗体、斜体等。我只是不希望他们能够执行脚本。
  • 然后使用此正则表达式删除 javascript 标签 "
  • 我想这会对你有所帮助link
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多