これは単純なはずですが、私にはわかりません。POSTとして受信するXMLペイロードを解析するPHPで記述されたWebサービスがあるため、XMLペイロードは$_POST変数に含まれています。
サービスは、XMLを持っているように見えるPOST変数を見つけ、simplexml_load_stringを使用してそれをロードします。<element>これは「テスト」</element>またはこの
<BuyerItemDesc>顧客のシリアル番号</BuyerItemDesc>のようなデータに引用符がある場合は常に
、ロードが失敗するようです。
私の質問は、simplexml_load_string()を呼び出す前にPOSTでデータをサニタイズするための最良の方法は何ですか?PHPが$_POST変数にある引用符のエスケープを行っていることを私は知っています:
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
のデータの時期尚早な終わりタグItem行76
のデータの時期尚早な終わりタグItems行75
のデータの時期尚早な終わりタグPODetail行74
のデータの時期尚早な終わりタグNAMM_PO行2のデータの時期尚早な終わり
UPDATE これは、XML要素内のサニタイズされていないデータが原因で発生しました。これを修正するために、htmlspecialchars()を追加しました。
$payload = htmlspecialchars(stripslashes(trim($postXMLPayload)));