<![CDATA[
和]]>
不允许出现在<![CDATA[ … ]]>
块中。这可以理解。
现在,我必须在<![CDATA[ … ]]>
块内传输用户输入的数据。恶意用户可能会输入<![CDATA[
或]]>
,或者两者都输入。
- 条带
<![CDATA[
和]]>
? - 用空格代替?
- 给用户一个错误信息?
- 或者有官方的方式来传播它们吗?
CDATA节在技术上可以包含另一个起始标记——<![CDATA[
——它只是被解释为字符数据。它不能包含的是]]>
。通常的方法是在编码时在用户提供的数据的]]>
处分割CDATA。从维基百科:
CDATA节不能包含字符串"]]>",因此CDATA节不可能包含嵌套的CDATA节。使用CDATA部分对包含三元组"]]>"的文本进行编码的首选方法是使用多个CDATA部分,方法是在">"之前拆分三元组的每个出现。例如,要对"]]>"进行编码,可以这样写:
<![CDATA[]]]]><![CDATA[>]]>
这意味着要在CDATA部分中间编码"]]>",请用以下内容替换所有出现的"]]>":
]]]]><![CDATA[>
这有效地停止并重新启动CDATA节。
[结束维基百科引用]
看到它在做什么了吗?实际上,你最终得到的是:
<![CDATA[ ]] ]]>
<![CDATA[ > ]]>
(加空格以示强调)因此,您将]]>
编码为]]
旁边的>
-当在XML处理器解码期间放回一起时,您将最终使用]]>
作为字符数据,但]]>
实际上从未出现在您的CDATA部分。
然而,在这个时代,你不需要担心这个。无论您使用什么工具/库来创建XML,都应该为您简单地管理这一点,如果您将字符数据扔到XML的一个元素中,到字符数据的转换应该以XML库认为合适的方式自动完成,并进行所有必要的转义,而不必考虑它。
关注恶意用户数据是件好事,但在这种情况下,处理它的最佳方法是正确使用成熟的库,因为有人已经为您关注过了。
我认为你正在以错误的方式思考CDATA部分- CDATA代表"字符数据",CDATA语法只是不应该被解释为标记的数据块的语法。CDATA节对于将xml文档嵌入到另一个xml文档中是有用的,但是当在文档中包含字符数据(即文本)时,如果它被包含在CDATA节中而不是简单地编码为文本数据(可能带有某些字符转义),则不应该改变数据的含义。
简单地说,您的应用程序不应该关心数据是否编码为CDATA 。如果您正在编码的文本没有过多的类似XML的语法,那么您最好只是转义&
和<
字符—您的XML API可能会为您做一些事情。例如,XmlNode的InnerText属性将根据需要转义字符。
如果你仍然想使用CDATA标签(转义一个大的xml片段可能会过度膨胀结果文档的大小),那么你只需要转义代码CDATA语法片段(]]>
),例如,这可以通过简单地用]]]]><![CDATA[>
替换]]>
来完成。
在CDATA部分中,将所有]]>
替换为]]]]><![CDATA[>
当必须包含该字符串时,请使用字符引用而不是CDATA。