要求:当我将以下请求传递给我的应用程序时,
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 版本。
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 字段正在被解析。有人可以帮我吗?如果您需要更多其他信息,请告诉我。
感谢您的时间。
问候
普拉文