<![CDATA[
块中不允许 ]]>
和<![CDATA[ … ]]>
。这是可以理解的。
现在,我必须在<![CDATA[ … ]]>
块内传输用户输入的数据。恶意用户可能会输入<![CDATA[
或]]>
或两者。
问题是:处理这种情况的首选方法是什么?
<![CDATA[
和]]>
?答案 0 :(得分:7)
CDATA部分在技术上可以包含另一个起始标记 - <![CDATA[
- 它只是被解释为字符数据。它不能包含的是]]>
。通常的方法是在编码时将CDATA在]]>
分割为用户提供的数据。来自Wikipedia:
CDATA部分不能包含字符串“]]&gt;”因此,CDATA部分不可能包含嵌套的CDATA部分。使用CDATA部分编码包含三元组“]]&gt;”的文本的首选方法通过在“&gt;”之前拆分三重态的每次出现来使用多个CDATA部分。例如,要编码“]]&gt;”一个人会写:
<![CDATA[]]]]><![CDATA[>]]>
这意味着编码“]]&gt;”在CDATA部分的中间,替换所有出现的“]]&gt;”以下内容:
]]]]><![CDATA[>
这有效地停止并重新启动CDATA部分。
[结束维基百科报价]
看看那是做什么的?实际上,你最终得到的是:
<![CDATA[ ]] ]]>
<![CDATA[ > ]]>
(为了强调而添加了空格。)因此,在]]>
旁边,]]
编码为>
- 在XML处理器解码过程中重新组合在一起时,您最终会将]]>
作为字符数据,但您的CDATA部分中实际上不会发生]]>
。
然而,在这个时代,你不应该担心这个问题。无论您使用什么工具/库来创建XML,都应该简单地为您管理,如果您将字符数据放入XML的元素中,那么转换为字符数据应该以XML库认为合适的方式自动完成,所有必要的逃避,你不必考虑它。
关注恶意用户数据是件好事,但在这种情况下处理恶意用户数据的最佳方法是正确使用一个成熟的库,其中某人已经为您关注它。
答案 1 :(得分:2)
我认为您正在以错误的方式考虑CDATA部分 - CDATA代表“字符数据”,而CDATA语法只是不应被解释为标记的数据块的语法。 CDATA部分对于将xml文档嵌入到另一个xml文档中非常有用,但是当在文档中包含字符数据(即文本)时,如果数据被封装在CDATA部分而不是简单地编码为文本数据,则不应该更改数据的含义。 (可能某些角色逃脱了)。
短版本是您的应用程序不应该关心数据是否编码为CDATA 。如果您编码的文本不是过于沉重,使用类似xml的语法,那么您最好只是转义&
和<
字符 - 无论如何您的XML API可能会为您做些什么。例如,XmlNode的InnerText属性将根据需要转义字符。
如果您仍想使用CDATA标记(转义大型xml片段可能会过度膨胀生成的文档的大小),那么您只需要转义代码CDATA语法fragement(]]>
),例如这可以只需将]]>
替换为]]]]><![CDATA[>
即可完成。
答案 2 :(得分:1)
在CDATA部分中,将所有]]>
替换为]]]]><![CDATA[>
答案 3 :(得分:0)
当您必须包含该字符串时,请使用字符引用而不是CDATA。