2011-08-02 57 views
3

<![CDATA[]]>不允许在<![CDATA[ … ]]>块内。这是可以理解的。什么是首选方式句柄“<![CDATA [”在<![CDATA [block?

现在,我必须在<![CDATA[ … ]]>块内传输用户输入的数据。而恶意用户可能会输入<![CDATA[]]>或两者。

问题是:处理这种情况的首选方法是什么?

  • Strip <![CDATA[ and ]]>
  • 用空格替换它吗?
  • 用错误信息敲打用户?
  • 还是有实际传输它们的官方方式?
+2

你为什么要编写自己的XML库?已经有很多成熟的。 – Quentin

+0

@Quentin:在服务器和桌面上,确实有足够的作业库。但我为嵌入式系统(Android)开发。那里所需的库只能从2.2版本开始提供。但我们承诺至少2.0兼容我们的客户。 但我是一个“真正的”程序员,我不介意自己做。 接受可能会惊讶,但有时答案是确实的答案:“你做错了,试试这个另类”,我可以接受。我不使用CDATA任何以上,但选择了编码'<>&“''来代替。 – Martin

回答

2

我认为你在错误地思考CDATA部分--CDATA代表“字符数据”,而CDATA语法只是一段不应被解释为标记的数据块的语法。 CDATA部分可用于将xml文档嵌入到另一个xml文档中,但是,如果在文档中包含字符数据(即文本),则不应将数据的含义包含在CDATA部分中,而只需将其编码为文本数据(可能与某些字符转义)。

这个的简短版本是你的应用程序不应该在乎数据是否编码为CDATA或不是。如果你使用xml类语法编码的文本不会过于沉重,那么你最好只是转义&<个字符 - 这是你的XML API可能为你做的一切。例如,XmlNode的InnerText属性将根据需要转义字符。

如果您仍想使用CDATA标记(转义大的xml片段可能会过度扩大生成的文档的大小),那么您只需要转义代码CDATA语法分段(]]>),例如,可以通过只需将]]>替换为]]]]><![CDATA[>即可。

+0

只有当你能够重新设计的XML应用程序。这是一个可怕的想法呢‘XML’是简单的,然后“嵌入XML Base 64编码数据“,因此要好得多。 – Quentin

+0

@Quentin我意识到这是一个可怕的想法和固定我的答案。 – Justin

+0

后端团队建议使用'<![CDATA [...]]>'。读你的评论不知这是一个好主意,因为我们所说的姓名,地址,电话号码。'&'应该很少出现,'>'从来没有在所有。 除非用户是恶意的,并尝试一些XML注入。 – Martin

0

如果必须包含该字符串,请使用字符引用代替CDATA。

7

CDATA部分在技术上可以包含另一个起始标记 - <![CDATA[ - 它只是被解释为字符数据。它不能包含的是]]>。通常的做法是在编码时将用户提供的数据中的CDATA拆分为]]>。从Wikipedia

CDATA节不能包含字符串“]]>”,因此CDATA节不可能包含嵌套的CDATA节。使用CDATA节编码包含三元组“”]>“的文本的首选方法是使用多个CDATA节,即在”>“之前分割每个出现的三元组。例如,以编码 “]]>” 一将写:

<![CDATA[]]]]><![CDATA[>]]> 

这意味着,要编码 “]]>” 在CDATA部的中间,取代的“]所有出现] >”用下面的:

]]]]><![CDATA[> 

这有效地停止并重新启动CDATA部。

[结束维基百科报价]

见什么在做什么?实际上,你最终得到的是:

<![CDATA[ ]] ]]> 
<![CDATA[ > ]]> 

(空间添加了强调。)所以,你得到编码为旁边>一个]]]]> - 在解码过程中的XML处理器一起放回,您将以]]>作为字符数据,但]]>实际上从未在您的CDATA部分出现。

但是,不应该有任何需要,在这个时代,你可以担心这个。无论您使用哪种工具/库创建XML,都应该简单地为您进行管理,如果将字符数据放入XML元素中,则应该按照XML库适合的方式自动转换为字符数据,所有必要的转义,而不必考虑它。

关注恶意用户数据是很好的,但在这种情况下处理它的最好方法是正确使用一个成熟的库,其中某个人已经为你关心了它。

+0

和你谈话的工具大约仅适用于Android 2.1的,我要开发Android 1.6。这基本上意味着我不得不写:-(工具自己。所以,感谢您的回答这是真正需要的。 – Martin