要件: 次のリクエストをアプリケーションに渡すと、
1) リスクのある入力 xml に対して XML 検証を行う方法
2) libxml2 で XXE を無効にする方法、つまり ENTITY フィールドを解析しないようにする方法
<?xml version="1.0"?>
<!DOCTYPE foo [
<!ENTITY foo SYSTEM "file:///etc/issue">
]><TRANSACTION>
<FUNCTION_TYPE>LINE_ITEM</FUNCTION_TYPE>
<COMMAND>ADD</COMMAND>
<COUNTER>3</COUNTER>
<MAC>qof2EtycqT9YMcmOfKowpyXVbRpgM/7rncS3liK4JOs=</MAC>
<MAC_LABEL>P_206</MAC_LABEL>
<RUNNING_TAX_AMOUNT>0.00</RUNNING_TAX_AMOUNT>
<RUNNING_TRANS_AMOUNT>1.00</RUNNING_TRANS_AMOUNT>
<LINE_ITEMS>
<MERCHANDISE>
<LINE_ITEM_ID>1</LINE_ITEM_ID>
<DESCRIPTION>&foo;</DESCRIPTION>
<QUANTITY>1</QUANTITY>
<UNIT_PRICE>5.00</UNIT_PRICE>
<EXTENDED_PRICE>5.00</EXTENDED_PRICE>
</MERCHANDISE>
</LINE_ITEMS>
</TRANSACTION>
libxml2 バージョン 2.9 以降では、XXE がデフォルトで無効になっていることを理解しています。ただし、現在は 2.7.7 バージョンを使用しています。
このリンクによるとXML_ENTITY_PROCESSING
Enum xmlParserOption には、libxml2 で定義されている次のオプションを含めることはできません。
XML_PARSE_NOENT: エンティティを展開し、置換テキストに置き換えます XML_PARSE_DTDLOAD: 外部 DTD を読み込みます
これまで、xmlParseMemory
関数を使用して XML メモリ内ブロックを解析し、ツリーを構築していました。この関数は、xmlParserOption を設定するためのパラメータを取りません。
次に、xmlReadMemory
関数と同じことを行いxmlParseMemory
ますが、異なるパラメーターを取る関数に変更しました。
docPtr = xmlReadMemory(szXMLMsg, iLen, "noname.xml", NULL, XML_PARSE_RECOVER);
それでも、ENTITY フィールドが解析されていることがわかります。誰でも私を助けることができますか?さらに追加情報が必要な場合はお知らせください。
お時間をいただきありがとうございます。
よろしく
プラヴィーン