【问题标题】:Make user input safe for XML使用户输入对 XML 安全
【发布时间】:2012-06-14 19:45:40
【问题描述】:

使用 PHP 从用户提交的文本生成有效 XML 的最佳实践是什么,例如包含与号、尖括号、非 ascii 重音字符、换行符等的电子商务销售数据。

人们依赖什么函数、库、正则表达式?

【问题讨论】:

  • 我目前正在使用 CDATA 和 htmlentities,在 León 中的重音 o 导致火车失事后,我正在使用 strtr() 删除重音字符。问题是公司后台人员讨厌 htmlentities() 输出,他们的 Windows 编码器似乎无法为他们解码。
  • 听起来更像是在混合字符集编码,而不是 CDATA 本身有问题。顺便说一句,一起使用 htmlentities 和 CDATA 没有多大意义。因此,与其疯狂而广泛地猜测要杀死某些东西,不如先找出问题所在。那么解决方案通常是微不足道的。那么究竟是什么不起作用?
  • 好吧,我们有一些笨蛋,他们使用 Expression Engine 的抽象存储来创建电子商务商店。表编码设置为匹配 EE。商店所有者的后台是 Windows,并且有一个由另一方接受 XML 并导入到 Windows 框上的 Great Plains 的可执行文件。我的任务是编写 API,它接受来自可执行文件的调用以同步分销商、商店产品以及分销商和零售订单。我不想将每条用户输入都包含在 CDATA 标记中,但即使我这样做了,我也发现带重音的 o 问题搞砸了。

标签: php xml character-encoding


【解决方案1】:

将信息包装在CDATA标签中,并使用htmlentities()对数据进行编码

'<tag><![CDATA[' . htmlentities($theData) . ']]></tag>'

或使用DOM

$dom = new DOMDocument("1.0", "utf-8");

/* ... */

$dom->createCDATASection(htmlentities($theData));

【讨论】:

  • 很抱歉,但答案看起来有点像您不知道 CDATA 的用途以及与它有什么关系。
【解决方案2】:

如果您想要二进制安全,那么您需要使用额外的传输编码。例如,您可以使用 base64uuencode 在 XML 块中以二进制安全方式存储数据。

【讨论】:

    【解决方案3】:
    【解决方案4】:

    你也可以试试:

    html_entity_decode()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-19
      • 2013-11-15
      • 1970-01-01
      相关资源
      最近更新 更多