安全測試fortify掃描接口項目代碼,暴露出標題XXE的問題, 記錄一下。官網連接:php
使用配置的 XML 解析器沒法預防和限制外部實體進行解析,這會使解析器暴露在 XML External Entities 攻擊之下。html
XML External Entities 攻擊可利用可以在處理時動態構建文檔的 XML 功能。XML 實體可動態包含來自給定資源的數據。外部實體容許 XML 文檔包含來自外部 URI 的數據。除非另行配置,不然外部實體會迫使 XML 解析器訪問由 URI 指定的資源,例如位於本地計算機或遠程系統上的某個文件。這一行爲會將應用程序暴露給XML External Entity (XXE) 攻擊,從而用於拒絕本地系統的服務,獲取對本地計算機上文件未經受權的訪問權限,掃描遠程計算機,並拒絕遠程系統的服務。 下面的 XML 文檔介紹了 XXE 攻擊的示例。java
<?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE foo [ <!ELEMENT foo ANY > <!ENTITY xxe SYSTEM "file:///dev/random" >]><foo>&xxe;</foo>
若是 XML 解析器嘗試使用 /dev/random 文件中的內容來替代實體,則此示例會使服務器(使用 UNIX 系統)崩潰。android
應對 XML 解析器進行安全配置,使它不容許將外部實體包含在傳入的 XML 文檔中。 爲了不 XXEinjections,應爲 XML 代理、解析器或讀取器設置下面的屬性:apache
factory.setFeature("http://xml.org/sax/features/external-general-entities",false); factory.setFeature("http://xml.org/sax/features/external-parameter-entities",false);
若是不須要 inline DOCTYPE 聲明,可以使用如下屬性將其徹底禁用:api
factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl",true);
要保護 TransformerFactory,應設置下列屬性:安全
TransformerFactory transFact = TransformerFactory.newInstance(); transFact.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, ""); Transformer trans = transFact.newTransformer(xsltSource); trans.transform(xmlSource, result);
或者,也能夠使用安全配置的 XMLReader 來設置轉換源:服務器
XMLReader reader = XMLReaderFactory.createXMLReader(); reader.setFeature("http://xml.org/sax/features/external-general-entities",false); reader.setFeature("http://xml.org/sax/features/external-parameter-entities",false); Source xmlSource = new SAXSource(reader, new InputSource(new FileInputStream(xmlFile))); Source xsltSource = new SAXSource(reader, new InputSource(new FileInputStream(xsltFile))); Result result = new StreamResult(System.out); TransformerFactory transFact = TransformerFactory.newInstance(); Transformer trans = transFact.newTransformer(xsltSource); trans.transform(xmlSource, result);