XMLの外部リソース解決が行われるとは限らない
昨日の話題に対して逆説となるが、XMLドキュメントタイプを出力するのであっても、DTDリソースを解決しようとしない場合もある。それは、以下のように、XmlTextWriterでXMLドキュメントをストリーム等に直接出力するケースである。
XmlWriterSettings settings = new XmlWriterSettings(); settings.Encoding = Encoding.Default; settings.Indent = true; settings.OmitXmlDeclaration = false; using (XmlTextWriter writer = new XmlTextWriter(stream, encoding)) { writer.Formatting = Formatting.Indented; writer.Indentation = 2; writer.WriteStartDocument(); //DOCTYPE宣言の出力 writer.WriteDocType("hoge", null, "hoge.dtd", null); //ルートエレメントの出力 writer.WriteStartElement("root"); writer.WriteEndElement(); writer.WriteEndDocument(); }
これは昨日のコードと同様に、以下のようなXMLを出力するが
<?xml version="1.0" encoding="shift_jis"?> <!DOCTYPE hoge SYSTEM "hoge.dtd"> <root></root>
しかし、今度はDTDの存在検査は実行されない。
XmlTextWriter.WriteDocType メソッドに関しては、MSDN及びHelpには以下のように注釈が付いている。
XmlTextWriter は、WriteDocType メソッドに渡されるデータの検証を行いません。このメソッドに任意のデータを渡さないでください。
DOCTYPE宣言がらみの脆弱性って、なにかあったっけか。