禁用基于外部 DTD/XSD 的 XML 验证

发布于 2024-11-05 04:38:20 字数 478 浏览 1 评论 0原文

有没有办法在不修改源代码(构建 DocumentBuilder 的库)的情况下禁用基于外部 DTD/XSD 的 XML 验证?比如为 DocumentBuilderFactory 功能设置 JVM 范围的默认值,以及为 SAX 设置相同的默认值?

在 IDE 中编辑文件时,验证非常有用,但我不需要仅仅因为 somelib.net 出现故障而导致我的 web 应用程序无法启动。

我知道我可以指定本地 DTD/XSD 位置,但这是一个不方便的解决方法。

有哪些选择?我能想到两个:

  • 实现我自己的 DocumentBuilderFactory。
  • 拦截Xerces的DocumentBuilderImpl的构建并修改features Hashtable(添加http://apache.org/xml/features/nonvalidating/load-external-dtd)。

Is there a way to disable XML validation based on external DTD/XSD without modifications to the source code (of the libraries that construct DocumentBuilder)? Something like setting JVM-wide defaults for DocumentBuilderFactory features, and the same for SAX?

Validation is great when editing files in IDE, but I don't need my webapp failing to start just because somelib.net went down.

I know I can specify local DTD/XSD locations, but that's an inconvenient workaround.

What are the options? I can think of two:

  • Implement my own DocumentBuilderFactory.
  • Intercept construction of Xerces's DocumentBuilderImpl and modify the features Hashtable (add http://apache.org/xml/features/nonvalidating/load-external-dtd).

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

我纯我任性 2024-11-12 04:38:20

禁用验证可能不会阻止处理器获取 DTD,因为它仍然可能这样做,以便使用 DTD 中存在的属性默认值等(它将放置在树中),即使它没有进行实际的验证 违反 DTD 的语法。

处理 XML 文档时防止网络活动的一种技术是使用“空白解析器”,如下所示:

import java.io.ByteArrayInputStream;
import java.io.IOException;

import org.xml.sax.EntityResolver;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;

public class BlankingResolver implements EntityResolver
{

    public InputSource resolveEntity( String arg0, String arg1 ) throws SAXException,
            IOException
    {

        return new InputSource( new ByteArrayInputStream( "".getBytes() ) );
    }

}

然后在处理之前进行设置,如下所示:

DocumentBuilderFactory factory = DocumentBuilderFactory.
factory.setNamespaceAware( true );
builder = factory.newDocumentBuilder();
builder.setEntityResolver( new BlankingResolver() );
myDoc = builder.parse( myDocUri );
// etc.

然后您还可以确保正在处理的文档没有被任何信息更改来自 DTD.y

Disabling validation may not prevent a processor from fetching a DTD, as it still may do so in order to use attribute defaults etc. present in the DTD (which it will place in the tree), even if it does no actual validation against the DTD's grammar.

One technique to prevent network activity when processing an XML document is to use a "blanking resolver" like this:

import java.io.ByteArrayInputStream;
import java.io.IOException;

import org.xml.sax.EntityResolver;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;

public class BlankingResolver implements EntityResolver
{

    public InputSource resolveEntity( String arg0, String arg1 ) throws SAXException,
            IOException
    {

        return new InputSource( new ByteArrayInputStream( "".getBytes() ) );
    }

}

and then set this prior to processing like this:

DocumentBuilderFactory factory = DocumentBuilderFactory.
factory.setNamespaceAware( true );
builder = factory.newDocumentBuilder();
builder.setEntityResolver( new BlankingResolver() );
myDoc = builder.parse( myDocUri );
// etc.

You will then also be sure that the document being processed has not been altered by any information from the DTD.y

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文