Зомби-ОС и ASP.NET

Вследствие нетождественности вероятности (математической) и вероятностной предопределённости (жизненного явления) очень хорошая концепция может быть загублена плохими исполнителями её: на двухколесном велосипеде ездить лучше, чем на трехколёсном, но не все умеют; но некоторые ещё будут доказывать, что на двухколесном и ездить-то нельзя, поскольку он падает и сам по себе, а не то что с сидящим на нём человеком, тем более на ходу, — если они ранее не видели, как ездят на двухколесном; а третьи, не умея и не желая учиться ездить самим, из ревности не отдадут велосипед тем, кто умеет.
— малоизвестная личность eurekafag

В 1973 году была создана операционная система CP/M. В ней не было директорий, все файлы были свалены в кучу на диске, и имена этих файлов соответствовали формату 8.3 (не больше 8 символов на имя и не больше трёх на расширение). Чтобы обеспечить ввод/вывод для пользовательских программ, в эту кучу были добавлены псевдофайлы COM1, COM2, COM3, COM4, LPT1, LPT2, CON, AUX, PRN и NUL, соответствующие ком-портам, принтерам, консоли и другой ерунде.

В 1980 году фирма Seattle Computer Products сделала дешёвый аляповатый клон CP/M и назвала его 86-DOS. Так же, как и у прародительницы — CP/M, 86-DOS сваливала все файлы в кучу, подчинялась формату 8.3 и предоставляла псевдофайлы COM1, COM2, COM3, COM4, LPT1, LPT2, CON, AUX, PRN и NUL. Более того, любой файл с одним из перечисленных имён и произвольным расширением считался 86-DOS идентичным ему же без расширения.

В 1981 году малоизвестная фирма Microsoft Corporation спиздила скупила за бесценок 86-DOS, переименовала в MS-DOS и начала продавать.

В 1983 году корпорация Microsoft выпустила MS-DOS 2.0. Эта ОС поддерживала иерархическую структуру директорий. Чтобы сохранить обратную совместимость с приложениями, созданными для MS-DOS 1.0, в которой вообще не было директорий, инженеры Microsoft поместили псевдофайлы COM1, COM2, COM3, COM4, LPT1, LPT2, CON, AUX, PRN, и NUL, со всеми возможными расширениями, во все директории.

В 1988 году Microsoft начала разработку современной (Ыыы - Прим. перев.) многопользовательской системы, с вытесняющей многозадачностью и поддержкой защищённого режима x86, безпалевно спижженной с DEC VMS, по имени Windows NT. Windows NT поддерживала новую файловую систему NTFS, спижженную с OS/2 HPFS, которая использовала Unicode UCS-2 для имён файлов. Чтобы сохранить обратную совместимость с приложениями для DOS, запускаемыми под новой ОС, некоторые из которых были написаны ещё до того, как в DOS были директории (Ололо - Прим. перев.), Windows NT помещала псевдофайлы COM1…COM9, LPT1…LPT9, CON, AUX, PRN и NUL, со всеми возможными расширениями, во все директории. Windows NT вышла на рынок в 1993 году.

В 1998 году Microsoft выпустила Option Pack к двухлетней давности Windows NT 4.0, содержащий принципиально новую технологию Active Server Pages, или ASP. ASP позволяла создание динамических вебсайтов с помощью скриптования через COM. (В существовавшем уже пять лет CGI, видимо, был обнаружен фатальный недостаток. - Прим. перев.) Из-за того, что ASP основана на файлах, URL'ы по определению не могли содержать подстроки /com1-9.asp, /lpt1-9.asp, /con.asp, /aux.asp, /prn.asp или /nul.asp.

В 2002 году Microsoft аннонсировала неизбежный релиз фреймворка .NET. Одним из его компонентов должен был стать ASP.NET, огромный, а главное, принципиально новый шаг по сравнению с ASP. Несмотря на то, что ASP.NET предоставляет более лучшие средства для написания веб-страничек, чем те, что предоставлял ASP, механизм был по-прежнему полностью основан на фейлах… простите, файлах. И, хотя этот механизм мог быть переписан более чем 9000 способами, из соображений обратной совместимости ASP.NET всегда проверял наличие файла, прежде чем выполнять обработчик. Поэтому веб-страницы не могут содержать подстроки /com[1-9](\..*)?, /lpt[1-9](\..*)?, /con(\..*)?, /aux(\..*)?, /prn(\..*)? или /nul(\..*)?.

В 2009 году Microsoft выпускает ASP.NET MVC, принципиально новый веб-фреймворк, поддерживающий большинство практик построения гибких и масштабируемых веб-приложений. В ASP.NET MVC отказываются от связи файлов со страницами, вместо этого вводится механизм обработки URL'ов с помощью регулярных выражений, сходный с механизмами в существовавших уже много лет нормальных фреймворках вроде Django, Ruby-on-Rails, Catalyst и проч. Эти URL'ы не привязываются к файлам; вместо этого они связаны с объектами, которые проектируются для обработки запроса. Блягодаря этому, URL'ы могут быть построены исключительно с использованием здравого смысла, без каких-либо ограничений со стороны файловой системы на сервере.

Но ASP.NET MVC основан на ASP.NET. Который проверяет существование файла перед запуском любых CGI-скриптов. Что означает, что он будет проверять, не имеют ли директории файлов с именем COM1…COM9, LPT1…LPT9, CON, AUX, PRN или NUL, с любым расширением.

И вот почему в 2009 году, при разработке сайта на ASP.NET MVC 1.0 с использованием Microsoft .NET 3.5 на моднявой Windows 7, вы не можете создавать страницы с URL вида /com\d(\..*)?, /lpt\d(\..*)?, /con(\..*)?, /aux(\..*)?, /prn(\..*)?, или /nul(\..*)?.

Оригинал

Комментариев нет:

Отправить комментарий