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宣言がらみの脆弱性って、なにかあったっけか。