0

私は次のクラスを持っています:

package com.somedir.someotherdir;

import java.util.logging.Level;
import java.util.logging.Logger;

import javax.xml.XMLConstants;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import javax.xml.validation.Validator;

public class SchemaValidator
{
 private static Logger _logger = Logger.getLogger(SchemaValidator.class.getName());

 /**
  * @param file - the relative path to and the name of the XML file to be validated
  * @return true if validation succeeded, false otherwise
  */
 public final static boolean validateXML(String file)
 {
  try
  {
   SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
   Schema schema = factory.newSchema();
   Validator validator = schema.newValidator();
   validator.validate(new StreamSource(file));
   return true;
  }
  catch (Exception e)
  {
   _logger.log(Level.WARNING, "SchemaValidator: failed validating " + file + ". Reason: " + e.getMessage(), e);
   return false;
  }
 }
}

schema.newValidator("dir/to/schema.xsd")やっぱり使うべきなのか、それとも現在のバージョンでいいのか知りたいのですが?DoSの脆弱性があることを読みましたが、誰かがそれについてもっと情報を提供できるかもしれませんか?また、パスは絶対パスである必要がありますか、それとも相対パスである必要がありますか?
検証されるXMLのほとんどはそれぞれ独自のXSDを持っているので、XML自体に記載されているスキーマを読みたいと思います(xs:noNamespaceSchemaLocation="schemaname.xsd")。
検証は、起動時または手動リロード(サーバーソフトウェア)中にのみ実行されます。

4

2 に答える 2

1

私が解釈すると、によって返されるjavax.xml.validation.Schemaオブジェクトは、対応する属性SchemaFactory.newSchema()で示されているように、xml/xsd ファイルで参照されている他のスキーマを取得して検証しようとします。xsi:schemaLocationこれは、次のことを意味します。

  1. スキーマがインターネットでホストされているスキーマを参照している場合、Schemaオブジェクトは実行時にスキーマを取得しようとします。私の知る限り、デフォルトのSchema実装はこれらのスキーマをキャッシュしません。W3Cは、ウェブサイトへの事実上の DDoS をもたらす不適切なコーディング プラクティスについて既に報告しています (1 日に最大 1 億 3000 万の dtd リクエスト!)。
  2. 外部の制御されていない xml ファイルを検証する場合はSchema、「おそらく悪意のある」xml ソースから他のスキーマを取得しようとすることにもさらされます。

より邪悪な攻撃ベクトルについては、サインの以前の回答をご覧ください

この落とし穴を回避するには、すべての外部リソースをローカルに保存し、SchemaFactory.setResourceResolverSchemaメソッドを使用してそれらを取得する方法を指示します。

于 2014-07-21T08:40:21.520 に答える
1

XML DTD DOS 攻撃のことですか? もしそうなら、ネット上にいくつかの良い記事があります:

XML サービス拒否攻撃と防御http://msdn.microsoft.com/en-us/magazine/ee335713.aspx

IBM developerWorksから。"ヒント: 安全な処理のために SAX パーサーを構成する" :

エンティティの解決により、XML に多くの潜在的なセキュリティ ホールが開かれます。[...]
- 外部 DTD がホストされているサイトは、通信をログに記録できます。[...]
- DTD をホストするサイトは、解析を遅くすることができます [...] また、不正な形式の DTD を提供することにより、解析を完全に停止することもできます。
- リモート サイトが DTD を変更する場合、dafault 属性値を使用して新しいコンテンツをドキュメントに挿入できます[...] エンティティ参照を再定義することにより、ドキュメントのコンテンツを変更できます。

プログラムに直接適用できるかどうかはわかりませんが、さらに調査するための手がかりを与えることができます

于 2011-01-01T22:40:40.133 に答える