私たちはコードに対してセキュリティ監査を行い、コードは外部エンティティ(XXE)攻撃に対して脆弱であると述べました。XXE攻撃を防止する方法
説明- XML外部エンティティ攻撃は、処理時にドキュメントを動的に構築するXML機能の恩恵を受けます。 XML エンティティは、特定のリソースから動的にデータを含めることを許可します。外部エンティティでは、XML文書に外部URIのデータ を含めることができます。そうでない場合を除いて、外部エンティティはXMLパーザに、指定されたリソース に、URI(例えば、ローカルマシン上またはリモートシステム上のファイル)にアクセスするように強制する。この現象は、アプリケーションをXMLに公開します。外部 ローカルシステムのサービス拒否を実行したり、ローカルマシンのファイルへの不正なアクセスを取得したり、リモートマシンをスキャンしたり、サービス拒否を実行したりするエンティティ(XXE)攻撃リモートシステム。 以下のXML文書は、XXE攻撃の例を示しています。
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "file:///dev/random" >]><foo>&xxe;</foo>
(UNIXシステム上)サーバーをクラッシュさせる可能性がある。この例では、XMLパーサが の/ dev /ランダムファイルの内容を持つエンティティを代用しようとした場合。
おすすめ - XMLアンマーシャラーは、XMLエンティティー の一部として外部エンティティーを許可しないように、安全に構成する必要があります。 XXE注入を避けるには、XMLソースを直接java.io.File、java.io.Reader、または java.io.InputStreamとして処理する非整列化メソッドを使用しないでください。安全構成パーサーを使用してドキュメントを解析し、次の例に示すように、XMLソースとしてセキュア
パーサを取るアンマーシャルメソッドを使用:XXE攻撃を見つけた場合
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setExpandEntityReferences(false);
DocumentBuilder db = dbf.newDocumentBuilder();
Document document = db.parse(<XML Source>);
Model model = (Model) u.unmarshal(document);
書き込まれたコードは、以下であります -
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
System.out.println("outputing to : " + outputLocation);
File outputFile = new File(outputLocation);
StreamResult result = new StreamResult(outputFile);
DOMSource source = new DOMSource(doc);
transformer.transform(source, result);
私のコードで上記の推奨事項を実装するにはどうすればよいですか。
誰かが私が行方不明を助けることができますか?誰でも助けていただければ幸いです!
ありがとう、ありがとう、私は既存のロジックにDocumentBuilderFactoryを実装する必要があります.... btw私はあなたの指定された提案を使用していますが、エラー "メソッドsetFeature(String、boolean)はTransformer型のために定義されていません"。 – SANNO
Eh、申し訳ありませんが、TransformerFactoryで設定する必要があります。 – Kayaman
カヤマンありがとう!そのうまく動作しますが、TransformerFactoryの概念をDocumentBuilderFactoryのコンセプトに置き換えることができます。本当にそれは感知できるでしょう。 – SANNO