какие символы запрещены в имени файла
Мир цифровой информации
Если вам кажется, что нет ничего проще, чем придумать имя для файла или папки, то скорее всего вы ошибаетесь. Существуют правила из-за которых нельзя назвать файл любым именем как обычный физический предмет. Для начала проясним, что такое имя файла, и как оно используется.
Понятия «путь» и «имя файла»
Очень часто в компьютерной литературе используются термины «путь» и «имя файла» под разными значениями. Обычно под словом «путь» понимают адрес или расположение файла, т. е. диск, папка и подпапки в которых расположен файл. Однако Microsoft и другие считают, что в путь к файлу входит не только его расположение но и само имя файла. А некоторые подразумевают под словом «путь» только имена файла и папок, в которых он расположен, без указания диска. Некоторые пользователи полагают, что «имя файла» не включает расширение. В данной статье расширение всегда является частью имени файла. На примере ниже синим цветом выделен путь к файлу, а красным имя файла.
X:\папка\подпапка\ файл.расширение
Зарезервированные символы и имена
Ограничения на длины имен файлов и путей
Существуют ограничения на длину имени файла и на длину пути. Абсолютное ограничение длины имени файла вместе включая путь к нему равно 260 символам. Этот предел называют термином MAX_PATH. На самом же деле на практике пределы для имен еще меньше из-за ряда других ограничений. Например, каждая строка на конце должна содержать так называемый нулевой символ, который обозначает конец строки. Несмотря на то, что маркер конца строки не отображается, он учитывается как отдельный символ при подсчете длины, а значит остается 259 символов доступных для имени файла и пути к нему. Первые три символа в пути используются для обозначения диска (например, C:\). Это уменьшает предел для имен папок, подпапок и файла до 256 символов.
На имя объекта (папки или файла) наложено ограничение длины 255 символов. Этот предел действителен только, если объект не расположен внутри папки. Так как при расположении объекта внутри папки, сумма длин всех папок в которых он расположен, разделителей и имени объекта ограничена 256 символами, то предел длины самого имени объекта меньше 255 символов.
Можно ли верить своим глазам? (Unicode в именах файлов)
Несколько дней назад один из наших пользователей прислал образец (SHA1: fbe71968d4c5399c2906b56d9feadf19a35beb97, определяется как TrojanDropper:Win32/Vundo.L). Это троян для фишинга с сайтов vk.com и vkontakte.ru, запросы на которые перенаправляются на 92.38.209.252 необычным способом.
Обычный метод перенаправления трафика — добавить запись в файл hosts, который находится в папке %SystemRoot%\system32\drivers\etc. Однако, когда мы открываем этот файл на заражённом компьютере, то там нет никаких записей для vk.com и vkontakte.ru:
Но если включить отображение скрытых файлов, то появляется ещё один файл hosts:
Мы видим два файла с одинаковым названием в одной папке. Но ведь одна директория не может содержать двух файлов с одинаковым названием. Если скопировать имена файлов в Notepad, сохранить как текст Unicode и открыть в Hex-редакторе, то появится следующая картина (верхняя строчка для первого файла hosts, нижняя — для второго):
В Unicode (UTF-16) символ 0x006F выглядит так же, как 0x6F в ASCII, где тот соответствует букве «o». Но что такое 0x043E в Unicode? Это можно посмотреть в таблице Unicode, вот её фрагмент.
В таблице 0x043E соответствует кириллическому символу, который выглядит так же, как английское «o». То есть настоящим файлом hosts на самом деле является скрытый файл, именно он используется операционной системой. Если открыть этот файл, то сразу видно отличие от фальшивого, это две строчки внизу на несколько экранов от начала:
Это уже не первый раз, когда мы обнаружили использование хакерами кодировки Unicode для вредоносных целей. В августе 2010 года один китайский хакер продемонстрировал приём, как использовать управляющие символы Unicode, чтобы убедить пользователей в безопасности файла. С помощью управляющего символа 0x202E (RLO) можно изменить порядок символов при отображении названия файла в Windows Explorer.
Например, вот потенциально опасный файл picgpj.exe
Если перед частью названия «gpj.exe» вставить управляющий символ, то порядок символов меняется и имя файла отображается в Проводнике уже иначе:
Хакеры обычно используют картинку в качестве иконки для этого файла. Неосторожный пользователь может принять её за фотографию и открыть двойным щелчком, тем самым запуская программу. Очевидно, этот приём бесполезен для программ с поддержкой Юникода, но пользователи не всегда сами могут распознать опасность.
Можно ли верить своим глазам? Получается, что не всегда.
Список запрещённых имён для файлов и каталогов в Windows
В современном с ума сошедшем мире всё перевернулось с ног на голову нетбуки стали называть ноутбуками, каталоги именуют нынче папками (разделы наверно мамками:), вместо Ё пишут Е и пашло поехало 🙂
Согласно Обзор файловых систем FAT, HPFS и NTFS в системе Windows нельзя обычным образом создать файлы и каталоги с именами:
Только после полного отключения блокировщика скриптов и рекламы на этом месте появится полезная подсказка/ссылка/код/пример конфигурации/etc!
Также в именах для файлов и каталогов нельзя использовать символы:
На самом деле файлы и каталоги с запрещёнными (зарезервированными) именами создать можно, если очень хочется:
Только после полного отключения блокировщика скриптов и рекламы на этом месте появится полезная подсказка/ссылка/код/пример конфигурации/etc!
Лучше не пытаться свернуть мозги системе, а то гляди может и получиться. Всех с новым годом, желаю всем в новом году счастья, здоровья и всяческих баг, тьфу ты. т.е. благ!;))
Ссылки по теме:
Рекомендуемый контент
А тут же ж мог быть рекомендуемый контент от гугла 🙂 Для отображения рекомендуемого контента необходимо в браузере разрешить выполнение JavaScript скриптов, включая скрипты с доменов googlesyndication.com и doubleclick.net
Вы не любите рекламу!? Напрасно!:) На нашем сайте она вовсе ненавязчивая, а потому для нашего сайта можете полностью отключить AdBlock (uBlock/uBlock Origin/NoScript) и прочие блокировщики рекламы! AdBlock/uBlock может препятствовать нормальной работе системы поиска по сайту, отображению рекомендуемого контента и прочих сервисов Google. Рекомендуем полностью отключить блокировщик рекламы и скриптов, а также разрешить фреймы (aka iframe).
Обход ограничений FAT32/NTFS
Статья написана для журнала «Хакер» в 2004 году. Она вышла в номере 02/04 (62).
Во времена операционной системы MS-DOS и файловой системы FAT16 существовали серьезные ограничения, касающиеся имен файлов. Так, максимальная длина имени файла составляла 8 символов, а расширения – 3 символа. С появлением Windows 95, максимальная длина имени файла увеличилась до 255 символов, и теперь нам чаще всего не приходится гадать, что скрывается в файле с названием MIAF9D
1.ZIP. В новых файловых системах FAT32 и NTFS с тех времен остались другие, менее заметные ограничения, которые можно обходить и использовать в своих целях.
Запрещенные символы
Правила, касающиеся имен файлов, содержатся в так называемых «Соглашениях об именах файлов» (Filename Conventions). В этом документе описано, какие символы допустимо использовать в названиях файлов, какие символы являются разделителями пути, максимальная длина пути, и т.п. Здесь же оговариваются и ограничения. К примеру, символы “\”, “/”, “?”, “|”, “*”, “ ” и “:” имеют специальное значение в Windows при операциях с файлами, в частности, из командной строки, и поэтому не могут быть использованы в имени отдельного файла. Это ограничение, по-видимому, обойти невозможно, так как при обращении к системным функциям для работы с файлами Windows стопроцентно выделяет их среди других символов и по-своему интерпретирует. Здесь нужно обратить внимание на специфическое использование символов точки «.», двоеточия «:», и пробела. Символ пробела может встречаться в имени файла или каталога, точка используется как разделитель имени файла от расширения, а двоеточие – как разделитель между буквой диска и остальной частью пути. Использование двоеточия не допускается нигде, кроме как после буквы диска, с исключением для файловой системы NTFS, где двоеточие используется еще и в качестве разделителя между нормальным именем файла и прикрепленными к нему файловыми потоками. Точка и пробел могут стоять в любом месте в имени файла, но не могут быть завершающими символами. Это странное, на первый взгляд, ограничение существует, как объясняет Microsoft, ради совместимости новых файловых систем со старыми, такими как HPFS, используемой в OS/2 и FAT16. Я думаю, что это ограничение частично связано с двумя существующими во всех используемых в Windows файловых системах виртуальными файловыми объектами (так называемые «точки»). При работе с файловыми менеджерами типа TotalCMD, для перехода в предыдущую папку надо щелкать по каталогу с названием «..». В файловых системах так обозначается родительский каталог относительно текущего пути, а текущая папка обозначается как «.». Строго говоря, эти объекты не являются настоящими файлами или каталогами. Это просто абстрактные объекты, используемые по традиции для навигации между папками. В Windows Explorer они вообще не показываются. Так как пользователь может создавать файлы, имена которых начинаются с точки (но не в Windows Explorer), то Microsoft заблокировала возможность ставить точки в конце названия, чтобы было невозможно создать файл «..». Чем мелкомягких не устраивают пробелы в конце названия, мне не понятно.
Имена DOS-устройств
В каждой Windows системе существует эмуляция MS-DOS, и этот факт тоже накладывает свои ограничения. При работе в командной строке используются псевдонимы для устройств, работа с которыми ничем не отличается от работы с обычными файлами. Под устройства зарезервированы следующие имена файлов: AUX, CON, NUL, PRN, COM1-COM9 и LPT1-LPT9. Простейший пример работы с этими объектами: если в командной строке ввести «dir > prn | sort», то отсортированный список файлов и каталогов текущей папки начнет распечатываться из принтера. Здесь «prn» означает принтер. Понятно, что если бы существовала возможность называть файлы зарезервированными именами устройств, то возникла бы путаница, поэтому эта возможность заблокирована.
Способы обхода ограничений
Тестирование показало, что использование префикса «\\?\» более надежно, чем «\\.\». При использовании второго префикса, к примеру, можно потерпеть неудачу при попытке удаления файла. Этот способ еще хорош тем, что работает и в командной строке. Действительно, возможны манипуляции с файлами прямо из командной строки, не прибегая к каким либо языкам программирования. Набранная в командной строке команда «type \\?\f:\test\prn» отобразит содержимое созданного файла. Пример создания файла
А что мне с этого?
Создай файл или каталог с некорректным именем, используя любой из вышеописанных способов. Теперь попробуй сделать с ним то, что каждый день делаешь с другими файлами и каталогами. Попробуй скопировать файл, переместить его, переименовать, открыть его любой программой, удалить, наконец.
В Windows, почему некоторые символы являются незаконными?
Как известно большинству из нас, Windows запрещает следующие символы в именах файлов:
Linux и других Unix-системах, только запрет \0 (нулевой символ) и / (разделитель путей) по причинам, которые кажутся очевидными сразу.
Почему в Windows так много запрещенных символов?
Я посмотрел, и каждый ответ, который я нахожу, – это вариация “это действительно” или “что действительно”, ничего не обсуждая дизайнерские решения, которые заставили команду Windows (DOS?) Сделать их незаконными.
Чтобы привести их в порядок:
* запрещен, так как это подстановочный знак Win32. Обратите внимание: в отличие от Linux, шаблоны обрабатываются API, а не оболочкой.
. не запрещается (очевидно!), хотя у него есть специальная семантика, когда она появляется в конце имени файла, т.е. удаляется. Это для обратной совместимости с файловыми системами FAT и/или приложениями, предназначенными для них.
Обратная косая черта – разделитель путей, а косая черта также рассматривается как разделитель путей (иногда) для совместимости с UNIX.
| – Я не уверен в этом. Возможно, из-за специального значения в командной строке, хотя есть и другие символы со специальными значениями, которые не запрещены в именах файлов.
Дополнительные запрещенные символы не указаны в вашем списке:
? является подстановочным символом Win32.
, > являются подстановочными символами ядра.
Пробелы обрезаются с конца имен файлов так же, как и периоды.
Причина в том, что эти символы имеют особое значение в командах DOS, например:
Двоеточие используется для указания диска c: кавычки для имен с другими проблематичными символами (обычно пробелы), звездочка является подстановочным символом, период – разделителем расширений файлов, канал отправляет вывод в другую программу.
Ранние версии Windows были просто запущены поверх DOS, поэтому им пришлось принять ограничения DOS. Когда Windows стала самой операционной системой, она по-прежнему использовала одну и ту же файловую систему, чтобы сохранить совместимость с ограничениями.