SonarLint | XML parsers should not be vulnerable to XXE attacks (java:S2755)

這個問題是由於XML Parser沒有禁止引用外部資源,而讓駭客可以做XXE(XML eXternal Entity Injection)攻擊。這可能會導致伺服器訪問外部網站、造成RCE (Remote Code Execute)、SSRF(Server-Side Request Forgery,讓伺服器訪問外部無法存取的內部網站)、也可以竊取伺服器的敏感資訊。

InputSource src = new InputSource(new StringReader(fileContent));
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
dbFactory.setNamespaceAware(true);
try {
	return dbFactory.newDocumentBuilder().parse(src);
} catch (SAXException | IOException | ParserConfigurationException e) {
	// skip
}	    

這段程式碼除了被SonarLint找到問題以外,也被SpotBugs發現一樣問題。在SpotBugs建議的解法是啟用FEATURE_SECURE_PROCESSING,但SonarLint認為這個方法並不完全,而去Disable了外部資源存取:

InputSource src = new InputSource(new StringReader(fileContent));
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
dbFactory.setNamespaceAware(true);
try {
	dbFactory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, "");
	dbFactory.setAttribute(XMLConstants.ACCESS_EXTERNAL_SCHEMA, "");
	dbFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
	return dbFactory.newDocumentBuilder().parse(src);
} catch (SAXException | IOException | ParserConfigurationException e) {
	// skip
}	    
因此如果要解決SonarLint與SpotBugs上的問題,可以一起搭配服用;因為FEATURE_SECURE_PROCESSING還可以避免你消耗過多的記憶體資源。