你如何使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&
-
<
至<
-
>
到>
如果您想转义文本以用于用双引号括起来的属性:
htmlspecialchars($string, ENT_XML1 | ENT_COMPAT, 'UTF-8');
除了&
, <
和>
之外,还会将其转换为"
。
如果你的属性用单引号括起来:
htmlspecialchars($string, ENT_XML1 | ENT_QUOTES, 'UTF-8');
将“转换'
为'
除了&
, <
, >
和"
。
(当然你甚至可以在属性之外使用它)。
请参阅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<6 and 6>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 character
或EOT
。 您可以使用此表来确定您希望忽略哪些字符。