<?xml version="1.0" ?>
<!DOCTYPE list [
<!ELEMENT list (bsinfo+)>
<!ELEMENT bsinfo (id,title,desc,books)>
]>
<list>
<bsinfo>
在我的项目中,我想验证 XML 是否包含 DTD。目前我正在使用 Libxml 解析器来解析 XML。
在 LibXML 中,我如何检查 XML 是否包含 DTD。
在向服务器发送请求 XML 时,如何防止 XXE 攻击。
当您说“我想验证 XML 是否包含 DTD”时,您的意思是 (a)“我想使用文档中存在的 DTD,如果有的话,否则我想使用 myfine.dtd 中的 DTD”?或 (b) “无论 XML 实例中存在什么,我都想针对 onetrue.dtd 进行验证”?
在情况 (a) 中,测试文档类型声明的一种方法是加载文档并应用适当的正则表达式来查找字符串 '
在情况 (b) 中,您不需要检查 XML 是否包含对 DTD 的引用;您只需告诉 libxml 使用与 xmllint --dtdvalid 选项等效的 C API 来验证 onetrue.dtd。通过在 DTD 中不包含不可接受实体的实体声明,您可以防止不可接受的外部或内部实体。
这两个答案都假设当您询问“向服务器发送请求 XML 时如何防止 XXE 攻击”时,您正在寻求保护服务器而不是请求者免受 XXE 攻击。我不知道如何保护请求者,因为我不明白如何使用实体处理来攻击请求者。