我偶然发现了这段代码:
static void Main()
{
typeof(string).GetField("Empty").SetValue(null, "evil");//from DailyWTF
Console.WriteLine(String.Empty);//check
//how does it behave?
if ("evil" == String.Empty) Console.WriteLine("equal");
//output:
//evil
//equal
}
Run Code Online (Sandbox Code Playgroud)
我想知道如何编译这段代码甚至是可能的.我的理由是:
根据MSDN String.Empty
是只读的,因此更改它应该是不可能的,并且编译应以"无法分配静态只读字段"或类似错误结束.
我认为Base Class Library程序集以某种方式受到保护和签名,以及什么可以防止这种攻击.下次有人可能会更改System.Security.Cryptography或其他关键类.
我认为基类库程序集是在安装.NET之后由NGEN编译的,因此更改String类的字段应该需要高级黑客并且要困难得多.
然而,这段代码编译和工作.有人可以解释我的推理有什么问题吗?