在<中处理"<![CDATA["的首选方法是什么![CDATA[ 块?



<![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。

相关内容

最新更新