【发布时间】:2013-01-09 13:45:05
【问题描述】:
这应该很简单,但它一直在逃避我。我们有一个用 PHP 编写的 Web 服务,它解析作为 POST 传入的 XML 有效负载,因此 XML 有效负载包含在 $_POST 变量中。
该服务找到看起来像具有 XML 的 POST var,然后使用 simplexml_load_string 加载它。似乎只要数据中有引号,例如
我的问题是在调用 simplexml_load_string() 之前清理 POST 中的数据的最佳方法是什么?我知道 PHP 正在对 $_POST vars 中的引号进行转义:
magic_quotes_gpc 开启
magic_quotes_runtime 关 关
但是这种方法似乎并不能解决它:
trim(stripslashes($xmlFromPost));
问题中的 XML 片段
<Item>
<POLineNbr>1</POLineNbr>
<BuyerItemId>CDL-BM01</BuyerItemId>
<BuyerItemDesc>Biscuit Miller's, "Blues with a..."</BuyerItemDesc>
<Qty>1</Qty>
<QtyUOM>EA</QtyUOM>
<UCValue>0.00</UCValue>
<UCCurrencyCode>USD</UCCurrencyCode>
<SupplierItemId></SupplierItemId>
<BarCodeId>884502780246</BarCodeId>
<BarCodeType>GTIN-12</BarCodeType>
在 $_POST 中查找 XML if(isset($_POST)){
foreach($_POST as $k=>$v){
if(preg_match('/^\<\?xml/',trim($v))){
$postXMLPayload = trim(stripslashes($v));
break;
}
}
}
libxml_use_internal_errors(true);
$xml = simplexml_load_string($postXMLPayload);
错误
标签 BuyerItemDesc 第 79 行中的数据过早结束
标记项第 76 行中的数据过早结束
标记项目第 75 行中的数据过早结束
标记 PODetail 第 74 行中的数据过早结束
标签 NAMM_PO 第 2 行中的数据过早结束
更新 这是由 XML 元素中未经处理的数据引起的。为了纠正这个问题,我添加了 htmlspecialchars():
$payload = htmlspecialchars(stripslashes(trim($postXMLPayload)));
【问题讨论】:
-
它可能是也可能不是导致您的问题的原因,但请注意
magic_quotes_gpc不应打开,并且应重写代码以执行正确的转义,而不是依赖此软糖。该功能在 PHP 5.3 中被正式弃用,并在 5.4 中被删除。见php.net/manual/en/security.magicquotes.php -
谢谢。通过 htmlspecialchars() 运行 post 值解决了这个特殊问题。元素数据中有非法字符,所以 SimpleXML 令人窒息