使用正则表达式防止 XSS

Preventing XSS using Regex

我正在使用一些正则表达式来清理文本中的标签

static string Pattern = "<(?:[^>=]|='[^']*'|=\"[^\"]*\"|=[^'\"][^\s>]*)*>";

static public string StripHtml(string Value)
{
    return Regex.Replace(Value, Pattern, string.Empty);
}

虽然这看起来很安全,但我想知道它是否真的安全?有没有不使用标签就可以执行 XSS 的方法?

使用 markdown 编辑器会更好吗,还是因为它们也允许标签,所以仍然会出现类似的问题?

或者我应该手动解析我想要的标签并允许它们放置任何内容?

您可以使用ESAPI,它将帮助您防止XSS 以及其他安全漏洞。那里已经有一些验证,并且还为此定义了正则表达式。但是,如果您想要自定义正则表达式,则必须明确定义它。

您没有指定您使用的是哪种 ESAPI 语言,但正则表达式是 100% 错误的 解决方案,如果您需要接受 HTML 到你的申请。这是因为 HTML is a context free language 和正则表达式无法解析它。

你想要像 OWASP's HTML Sanitizer 这样的东西,或者虽然它已经有一段时间没有更新了,Antisamy。这由实际的 HTML 解析器支持,并允许您指定合法标签,然后为其中的合法内容指定正则表达式。

另请注意,在您担心 HTML 卫生之前,确保您的应用程序已成功实现输出转义对您来说 更为重要。如果对每个上下文都正确转义,则可以完全忽略 XSS 验证。 (反过来,是不正确的。)