2013-08-28 29 views
0

傳入請求的XML文件需要驗證。一個要求是,由於可能的DoS攻擊,完全防止字符引用。如果我配置SAXParserFactory象下面這樣:Java SAX解析器,如何完全防止字符引用? (DoS攻擊)

SAXParserFactory spf = SAXParserFactory.newInstance(); 
spf.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true); 

那麼parer仍然解決100.000實體擴展。

The parser has encountered more than "100.000" entity expansions in this document; this is the limit imposed by the application. 

防止外部引用是通過EntityResolver完成的,它工作正常。但是,我如何防止字符引用?

回答

1

字符引用不會導致拒絕服務攻擊,所以沒有理由阻止它們。

+0

但在RESTful服務的情況下,它根據FIFO處理請求。如果一個請求需要花費更長時間的實體擴展,所有其他請求都會被延遲。 這不是一種Dos嗎? –

+0

如果一個XML文件包含大約10^7個實體字符,則處理過程需要幾分鐘時間,直到發生java.lang.OutOfMemoryError:Java堆空間。 –

+0

什麼是「實體角色」?我懷疑你使用的是關於實體引用和字符引用的錯誤術語,因此我們正在交叉討論。字符引用格式爲「 」或「 」,並且不會導致網絡流量或顯着的性能開銷。 –

0

org.apache.xerces.util.SecurityManager的實例可以限制實體擴展的數量。這是一個例子。

SAXParser saxParser = spf.newSAXParser(); 
org.apache.xerces.util.SecurityManager mgr = new org.apache.xerces.util.SecurityManager(); 
mgr.setEntityExpansionLimit(-1); 
saxParser.setProperty("http://apache.org/xml/properties/security-manager", mgr); 

因此,如果XML文件至少包含一個實體引用,則解析過程將終止。現在不再需要EntityResolver

包含SecurityManager的jar文件可以下載here