我偶然发现了这段代码:
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
}
我很惊讶这段代码怎么可能编译成功。我的推理是:
根据MSDN的说明,String.Empty
是只读的,因此更改它应该是不可能的,并且编译应该以“无法将静态只读字段分配给”或类似错误结束。
我认为基类库程序集受到某种保护和签名措施,以防止恰好发生这种攻击。下次有人可能会更改System.Security.Cryptography或另一个关键类。
我认为基类库程序集在.NET安装后由NGEN编译,因此更改String类的字段应该需要高级黑客技术,而且更难实现。
然而,这段代码编译并运行了。请有人可以解释一下我的推理哪里出了问题吗?