Xml 首选的处理方式是什么&书信电报;![CDATA[“在”![CDATA[街区中?”?

Xml 首选的处理方式是什么&书信电报;![CDATA[“在”![CDATA[街区中?”?,xml,xml-serialization,cdata,Xml,Xml Serialization,Cdata,和]]>不允许在块内。这是可以理解的 现在,我必须在块中传输用户输入的数据。恶意用户可能会输入或]>,或者两者都输入 问题是:处理这种情况的首选方法是什么 剥离和]> 用空格替换它 向用户发出错误消息 或者是否有官方的方式实际传播这些信息 我认为您对CDATA部分的思考是错误的-CDATA代表“字符数据”,CDATA语法只是不应解释为标记的数据块的语法。CDATA节对于将xml文档嵌入到另一个xml文档中非常有用,但是,当在文档中包含字符数据(即文本)时,如果数据包含在CDATA节中,而不是简

]]>
不允许在
块内。这是可以理解的

现在,我必须在
块中传输用户输入的数据。恶意用户可能会输入
]>
,或者两者都输入

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

  • 剥离
    ]>
  • 用空格替换它
  • 向用户发出错误消息
  • 或者是否有官方的方式实际传播这些信息

我认为您对CDATA部分的思考是错误的-CDATA代表“字符数据”,CDATA语法只是不应解释为标记的数据块的语法。CDATA节对于将xml文档嵌入到另一个xml文档中非常有用,但是,当在文档中包含字符数据(即文本)时,如果数据包含在CDATA节中,而不是简单地编码为文本数据(可能转义了某些字符),则不应更改数据的含义

简而言之,您的应用程序不应该关心数据是否编码为CDATA。如果您正在编码的文本没有过多使用类似xml的语法,那么您最好简单地转义
&
如果您仍然希望使用CDATA标记(转义一个大的xml片段可能会使生成文档的大小过度膨胀),那么您只需要转义代码CDATA语法片段(代码]]>
),例如,这可以通过简单地将
]]>
替换为
]]]>

当您必须包含该字符串时,使用字符引用而不是CDATA来完成。

CDATA节在技术上可以包含另一个起始标记--
--它只是被解释为字符数据。它不能包含的是
]>
。通常的方法是在编码时在用户提供的数据中拆分
]>
处的CDATA。发件人:

CDATA节不能包含字符串“]]>,因此CDATA节不可能包含嵌套的CDATA节。使用CDATA节对包含空间坐标轴“]]>”的文本进行编码的首选方法是通过在“>”之前拆分空间坐标轴的每次出现来使用多个CDATA节。例如,要对“]]>”进行编码,可以编写:

]>

这意味着要编码“”] >“在CDATA节的中间,替换所有出现的”[] ] >如下:

]]>
这将有效地停止并重新启动CDATA部分

[结束维基百科引用]

看到了吗?实际上,你最终得到的是:

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

]]> 
(为了强调而添加空格。)因此,您将
]]>
编码为
]
旁边的
>
——当您的XML处理器在解码过程中重新组合时,您将以
]>
作为字符数据结束,但是
]>
实际上不会出现在CDATA区域中

然而,在这个时代,你不必担心这件事。无论您使用什么工具/库来创建XML,都应该简单地为您管理它,如果您将字符数据放入XML的元素中,那么到字符数据的转换应该以XML库认为合适的方式自动完成,并进行所有必要的转义,而无需您考虑


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

在CDATA部分中,将所有
]]>
替换为
]]]]>

您为什么要编写自己的XML库?已经有很多成熟的库了。@Quentin:在服务器和台式机上,确实有足够的lib来完成这项工作。但我开发的是嵌入式系统(Android)。在那里,所需的LIB仅从版本2.2开始提供。但我们承诺至少向客户提供2.0兼容性。但我是一个“真正的”程序员,我不介意自己做。被接受的答案可能会令人惊讶,但有时答案确实是:“你做错了,试试这个替代方案”,我可以接受。我不再使用CDATA,而是选择编码
&“
。请注意,CDATA内容仅限于编码中可用的字符。数字实体引用(&nnn;)可以对整个Unicode集进行编码,而不考虑编码方式,甚至ASCII。因此,我建议Martin改用数字字符引用。前提是您可以重新设计XML应用程序。无论如何,“XML”比“嵌入在XML中的Base 64编码数据”更简单,这是一个糟糕的想法“这样就好多了。”昆汀我意识到这是一个糟糕的主意,并修正了我的答案。后端团队建议使用
。阅读你的评论,我想知道这是否是一个好主意,因为我们在谈论姓名、地址、电话号码<代码>&
应该很少出现,
根本不会出现。除非用户是恶意的,并尝试一些xml注入。你所说的工具只适用于android 2.1,我必须为android 1.6开发。这基本上意味着我必须自己写这个工具:-(。所以谢谢你的回答,它确实是需要的。
]]]]><![CDATA[>
<![CDATA[ ]] ]]> 
<![CDATA[ > ]]>