Я наткнулся на этот код:
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
доступен только для чтения, поэтому его изменение должно быть невозможным, и компиляция должна заканчиваться на "Статическое поле readonly не может быть присвоено" или аналогичная ошибка.
Я думал, что сборники библиотеки базового класса каким-то образом защищены и подписаны, а что-то, чтобы предотвратить именно такую атаку. В следующий раз кто-то может изменить System.Security.Cryptography или другой критический класс.
Я думал, что сборники библиотеки базового класса скомпилированы NGEN после установки .NET, поэтому изменение полей класса String должно требовать расширенного взлома и быть намного сложнее.
И все же этот код компилируется и работает. Может кто-нибудь объяснить, что не так с моими рассуждениями?