java - 在 Sax 解析器 (XML) 中处理外部实体和样式表

标签 java xml security saxparser

我想忽略外部实体和外部样式表(例如 <?xml-stylesheet type="text/xsl" href="......."?> )。

我知道我必须设置 XMLReader属性忽略外部实体,但我不知道如何忽略样式表...

import org.apache.xerces.parsers.SAXParser;
import org.xml.sax.XMLReader;
//...
final XMLReader parser = new SAXParser();

// Ignore entities
parser.setProperty("http://xml.org/sax/features/external-general-entities", false);

//  IS CORRECT???
parser.setProperty("http://xml.org/sax/features/external-general-entities", false);

是否需要设置更多属性以避免外部实体和样式表? 我如何了解是否存在外部实体或样式表?

最佳答案

为我工作:

public class SaxParser extends DefaultHandler
    implements ContentHandler, DTDHandler, EntityResolver{

public transient static final String STYLE_SHEET_TAG = "xml-stylesheet";
public transient static final String EXTERNAL_ENTITY = "ExternalEntity";

public static void main(String[] args) {
    new SaxParser().execute();
}

public void execute() {
    String pathFileXml = "test/XML.xml";

    final XMLReader parser = new SAXParser();
    parser.setContentHandler(this);
    parser.setDTDHandler(this);
    parser.setEntityResolver(this);

    try {
        parser.parse(pathFileXml);
    } catch (IOException e) {
        e.printStackTrace();
    } catch (SAXException e) {

        if (SaxParser.STYLE_SHEET_TAG.equals(e.getMessage())
                || SaxParser.EXTERNAL_ENTITY.equals(e.getMessage())) {

            System.out.println("CATCH ERRORE");
        }
        e.printStackTrace();
    }
    System.out.println("OK");
}

@Override
public void processingInstruction(String target, String data)
        throws SAXException {
    System.out.println("Processing Instruction");
    System.out.println("PI=> target: " + target + ", data: " + data);

    if (STYLE_SHEET_TAG.equalsIgnoreCase(target.trim())) {
        throw new SAXException(STYLE_SHEET_TAG);
    }
    return;
}
    @Override
    public InputSource resolveEntity(String publicId, String systemId)
        throws IOException, SAXException {

    System.out.println("publicId: " + publicId + ", systemId: " + systemId);
    throw new SAXException(SaxParser.EXTERNAL_ENTITY);


}
}

关于java - 在 Sax 解析器 (XML) 中处理外部实体和样式表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24268039/

相关文章:

java - XML 读出嵌套内容

python - 是否确定使用带有我的用户名和 GitHub 中生成的 token 的请求来通过 GitHub 进行身份验证?

node.js - 从 node.js 应用程序中将字符串安全地存储在内存中

PHP strpos() 返回奇怪的结果

java - 如何编辑 BufferedImage 中的像素?

java - 从内部方法返回一个对象

html - 如何获得没有链接的文本?

java - 如何在使用 EJB3 的 Java EE 环境中嵌入第三方代码

java - 在企业java应用程序中创建线程的正确方法是什么

xml - 如何将文字和变量放入标签中?