你如何使字符串"XML安全"?

Jay*_*D3e 60 php xml cakephp

我通过PHP回声发送XML文档来响应AJAX调用.为了形成这个XML文档,我遍历数据库的记录.问题是数据库包含其中包含"<"符号的记录.很自然地,浏览器会在该特定位置抛出错误.怎么解决这个问题?

Art*_*cto 65

通过htmlspecialchars使用库来构建XML文档(例如DOMDocumentXMLWriter),或者更合适地使用库来转义这些字符.

另一种选择是使用CDATA部分,但是你必须注意事件的发生]]>.

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

  • +1用于*使用库来构建XML文档* (11认同)
  • @Gordon顺便说一句,有一些原因可以解释为什么`htmlspecialchars`可能不足以支持XML(也就是说,它不会替换XML中的禁用字符,并且当$ double_encode为TRUE时它不会对禁止的实体进行编码) - 其中,顺便说一下,我已经通过在trunk的htmlspecialchars/entities版本中引入配置文件来解决,但你所说的根本就不是真的.您所描述的是双重编码,当您需要表示`&lt;`时,您需要在HTML中需要它的`&amp; lt;`. (5认同)
  • @Gordon Hum?因为什么时候`&lt;`不正确的XML?`htmlspecialchars`实际上只用保证可用于*any*XML文档的实体进行实体替换,甚至留下一个(用`&#039;'取代''`当它可以使用`'';;当然,`&#039;`也是正确的). (4认同)
  • htmlspecialchars不是最好的方法,因为顾名思义它意味着HTML输出,而不是XML.例如,它将<转换为&lt;,对于XML,正确的编码是&amp; lt; DOMDocument,simpleXML或类似的XML感知扩展将是更好的选择. (3认同)
  • 不确定是否 &lt; 是最好的例子,但它是 htmlspecialchars 的一个非常现实的问题。它从根本上用于 HTML 转义,而不是 XML。PHP 为这项工作提供了比 htmlspecialchars 更好的工具,应该使用这些工具。 (2认同)

use*_*662 62

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

htmlspecialchars($string, ENT_XML1);
Run Code Online (Sandbox Code Playgroud)

您应该指定编码,例如:

htmlspecialchars($string, ENT_XML1, 'UTF-8');
Run Code Online (Sandbox Code Playgroud)

更新

请注意,上面只会转换:

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

如果要转义文本以在双引号括起的属性中使用:

htmlspecialchars($string, ENT_XML1 | ENT_COMPAT, 'UTF-8');
Run Code Online (Sandbox Code Playgroud)

将转换"&quot;&,<>.


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

htmlspecialchars($string, ENT_XML1 | ENT_QUOTES, 'UTF-8');
Run Code Online (Sandbox Code Playgroud)

将转换'&apos;&,<,>".

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


请参阅htmlspecialchars的手册条目.

  • htmlspecialchars($ string,ENT_XML1,'UTF-8')对我有用,实际上我这样做只是为了安全 (3认同)

Elv*_*ith 9

1)您可以将文本包装为CDATA,如下所示:

<mytag>
    <![CDATA[Your text goes here. Btw: 5<6 and 6>5]]>
</mytag>
Run Code Online (Sandbox Code Playgroud)

请参阅http://www.w3schools.com/xml/xml_cdata.asp

2)已经有人说:逃避那些角色.例如:

5&lt;6 and 6&gt;5
Run Code Online (Sandbox Code Playgroud)


Mos*_*iur 6

试试这个:

$str = htmlentities($str,ENT_QUOTES,'UTF-8');
Run Code Online (Sandbox Code Playgroud)

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

<mytag>$str</mytag>
Run Code Online (Sandbox Code Playgroud)


Ed *_*bor 5

If at all possible, its always a good idea to create your XML using the XML classes rather than string manipulation - one of the benefits being that the classes will automatically escape characters as needed.


Reu*_* L. 5

添加这个以防它对某人有帮助。

由于我正在使用日语字符,因此编码也已适当设置。然而,我有时发现这htmlentitieshtmlspecialchars不够。

某些用户输入包含上述函数未去除的特殊字符。在这些情况下我必须这样做:

preg_replace('/[\x00-\x1f]/','',htmlspecialchars($string))
Run Code Online (Sandbox Code Playgroud)

这还将删除某些xml-unsafe控制字符,例如Null characterEOT。您可以使用此来确定要省略哪些字符。