你如何使string“XML安全”?

我正在通过PHP回应发送一个XML文档来响应AJAX调用。 为了形成这个XML文档,我循环了一个数据库的logging。 问题在于数据库包含其中包含“<”符号的logging。 所以很自然,浏览器会在这个特定的地方抛出一个错误。 这怎么解决?

通过使用htmlspecialchars转义这些字符,或者更恰当地说,使用一个用于构buildXML文档的库(如DOMDocument或XMLWriter) 。

另一种方法是使用CDATA部分,但是你必须注意出现]]>

还要考虑到您必须遵守您为XML文档定义的编码(默认为UTF-8)。

从PHP 5.4开始,你可以使用:

 htmlspecialchars($string, ENT_XML1); 

您应该指定编码,例如:

 htmlspecialchars($string, ENT_XML1, 'UTF-8'); 

更新

请注意,以上只会转换:

  • & to &amp;
  • <&lt;
  • >&gt;

如果您想转义文本以用于用双引号括起来的属性:

 htmlspecialchars($string, ENT_XML1 | ENT_COMPAT, 'UTF-8'); 

除了&<>之外,还会将其转换为&quot;


如果你的属性用单引号括起来:

 htmlspecialchars($string, ENT_XML1 | ENT_QUOTES, 'UTF-8'); 

将“转换'&apos; 除了&<>"

(当然你甚至可以在属性之外使用它)。


请参阅htmlspecialchars的手册条目 。

1)你可以像下面这样把你的文本打包成CDATA:

 <mytag> <![CDATA[Your text goes here. Btw: 5<6 and 6>5]]> </mytag> 

http://www.w3schools.com/xml/xml_cdata.asp

2)正如有人所说:逃避这些字符。 例如像这样:

 5&lt;6 and 6&gt;5 

如果可能的话,使用XML类而不是string处理来创buildXML总是一个好主意 – 其中一个好处就是类会根据需要自动转义字符。

尝试这个:

 $str = htmlentities($str,ENT_QUOTES,'UTF-8'); 

因此,在使用htmlentities()函数过滤数据之后,可以使用XML标记中的数据,如:

 <mytag>$str</mytag> 

添加这个以防万一有用。

由于我正在使用日文字符,编码也已被适当设置。 但是,我不时发现,特性和特性是不够的。

某些用户input包含上述function没有剥离的特殊字符。 在这些情况下,我必须这样做:

 preg_replace('/[\x00-\x1f]/','',htmlspecialchars($string)) 

这也将删除某些xml-unsafe控制字符,如Null characterEOT 。 您可以使用此表来确定您希望忽略哪些字符。