<![CDATA[
和]]>
不允许在<![CDATA[ … ]]>
块内。这是可以理解的。什么是首选方式句柄“<![CDATA [”在<![CDATA [block?
现在,我必须在<![CDATA[ … ]]>
块内传输用户输入的数据。而恶意用户可能会输入<![CDATA[
或]]>
或两者。
问题是:处理这种情况的首选方法是什么?
- Strip
<![CDATA[
and]]>
? - 用空格替换它吗?
- 用错误信息敲打用户?
- 还是有实际传输它们的官方方式?
<![CDATA[
和]]>
不允许在<![CDATA[ … ]]>
块内。这是可以理解的。什么是首选方式句柄“<![CDATA [”在<![CDATA [block?
现在,我必须在<![CDATA[ … ]]>
块内传输用户输入的数据。而恶意用户可能会输入<![CDATA[
或]]>
或两者。
问题是:处理这种情况的首选方法是什么?
<![CDATA[
and ]]>
?我认为你在错误地思考CDATA部分--CDATA代表“字符数据”,而CDATA语法只是一段不应被解释为标记的数据块的语法。 CDATA部分可用于将xml文档嵌入到另一个xml文档中,但是,如果在文档中包含字符数据(即文本),则不应将数据的含义包含在CDATA部分中,而只需将其编码为文本数据(可能与某些字符转义)。
这个的简短版本是你的应用程序不应该在乎数据是否编码为CDATA或不是。如果你使用xml类语法编码的文本不会过于沉重,那么你最好只是转义&
和<
个字符 - 这是你的XML API可能为你做的一切。例如,XmlNode的InnerText属性将根据需要转义字符。
如果您仍想使用CDATA标记(转义大的xml片段可能会过度扩大生成的文档的大小),那么您只需要转义代码CDATA语法分段(]]>
),例如,可以通过只需将]]>
替换为]]]]><![CDATA[>
即可。
如果必须包含该字符串,请使用字符引用代替CDATA。
CDATA部分在技术上可以包含另一个起始标记 - <![CDATA[
- 它只是被解释为字符数据。它不能包含的是]]>
。通常的做法是在编码时将用户提供的数据中的CDATA拆分为]]>
。从Wikipedia:
CDATA节不能包含字符串“]]>”,因此CDATA节不可能包含嵌套的CDATA节。使用CDATA节编码包含三元组“”]>“的文本的首选方法是使用多个CDATA节,即在”>“之前分割每个出现的三元组。例如,以编码 “]]>” 一将写:
<![CDATA[]]]]><![CDATA[>]]>
这意味着,要编码 “]]>” 在CDATA部的中间,取代的“]所有出现] >”用下面的:
]]]]><![CDATA[>
这有效地停止并重新启动CDATA部。
[结束维基百科报价]
见什么在做什么?实际上,你最终得到的是:
<![CDATA[ ]] ]]>
<![CDATA[ > ]]>
(空间添加了强调。)所以,你得到编码为旁边>
一个]]
的]]>
- 在解码过程中的XML处理器一起放回,您将以]]>
作为字符数据,但]]>
实际上从未在您的CDATA部分出现。
但是,不应该有任何需要,在这个时代,你可以担心这个。无论您使用哪种工具/库创建XML,都应该简单地为您进行管理,如果将字符数据放入XML元素中,则应该按照XML库适合的方式自动转换为字符数据,所有必要的转义,而不必考虑它。
关注恶意用户数据是很好的,但在这种情况下处理它的最好方法是正确使用一个成熟的库,其中某个人已经为你关心了它。
和你谈话的工具大约仅适用于Android 2.1的,我要开发Android 1.6。这基本上意味着我不得不写:-(工具自己。所以,感谢您的回答这是真正需要的。 – Martin
在CDATA部分,全部更换]]>
与]]]]><![CDATA[>
你为什么要编写自己的XML库?已经有很多成熟的。 – Quentin
@Quentin:在服务器和桌面上,确实有足够的作业库。但我为嵌入式系统(Android)开发。那里所需的库只能从2.2版本开始提供。但我们承诺至少2.0兼容我们的客户。 但我是一个“真正的”程序员,我不介意自己做。 接受可能会惊讶,但有时答案是确实的答案:“你做错了,试试这个另类”,我可以接受。我不使用CDATA任何以上,但选择了编码'<>&“''来代替。 – Martin