我正在使用FreeTextBox编辑器来获取用户创建的一些HTML。
这个问题是这个编辑器除了“<>”之外没有转换HTML实体中的特殊字符。我无法使用theHTML = Server.HtmlEncode(theHTML)
,因为它会转换所有HTML,包括标记和参数,而且我不想创建一个不可完整的theHTML.Replace
行列表。
是否有任何其他功能或方法可用于转换为html实体但仅限于外部标记?
答案 0 :(得分:1)
如果你混合了<
意味着开始标记而<
意味着文字小于标志,你就不可能知道哪个'标签'要忽略哪个不是
关于你所能做的就是检测<
不是传统形式的开始或结束标记的用法,使用令人讨厌的不可靠的正则表达式:
<(?!\w+(\s+\w+="[^"<]*")*\s*/?>|/\w+\s*>)
并将其替换为<
。同样适用于&
&
:
&(?!\w+;|#\d+;|#x[0-9A-Fa-f]+;)
(>
通常不必转义。)
这将不允许构造元素的每种可能的有效方式,并且它将允许破坏的错误嵌套元素和不存在的实体,并且会混淆非元素构造,如注释。因为正则表达式无法解析HTML,更不用说添加了破碎的碎片。
所以它几乎不是万无一失的。如果你想要在不小心打开div时不会破坏你的页面的正确标记,最好的第一步是将它解析为XHTML,如果它不是格式良好的XML,则拒绝它。
如果你有一个富文本编辑器组件生成输出文件<
没有被转义,那么是时候用不那么令人震惊的东西替换那个组件了。但总的来说,让用户创建HTML并不是一个好主意,因为他们真的很垃圾。另外,允许任何人输入HTML,使他们能够完全控制使用JavaScript破坏网站及其安全性。更简单的文本标记语言通常是一种胜利。
答案 1 :(得分:0)
我建议使用Linq到Xml解析每个元素并编码每个元素和属性节点的值。我会尝试提出一些代码,但嘿,这是星期五下午5点!
答案 2 :(得分:0)
经过大量搜索后,我发现我使用的是FreeTextBox组件的错误属性。该属性是 ConvertHtmlSymbolsToHtmlCodes 必须是真的。
如果您需要将代码插入XHTML页面,也可以使用 FormatHtmlTagsToXhtml ,因为它使用标签参数和围绕它们的引号进行强验证。