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