На своїй машині Windows у мене була папка з назвою чотирьох крапок, яка діяла як би якась дірка із кролика - як це сталося?


198

Назва папки була вказана у Провіднику файлів із просто чотирма крапками .....

Коли я спробував її відкрити, я потрапив у якусь нескінченну петлю для кролячих ям, де я знову і знову відкривав ту саму папку - я міг це робити нескінченно. Показ шляху як C:\ExamplePath\....\....\....\....\....і т.д.

На ньому було видно мою компіляцію TypeScript в одному конкретному проекті. Перш ніж я знайшов цю папку та пов'язані з нею проблеми, мені знадобилося більше року, оскільки вона вкорінена глибоко вкладеними папками. Я ніколи не очікував подібного питання, тому не шукав його.

Я не міг видалити папку звичайним способом через спеціальну назву. Зрештою, я міг би її видалити, використовуючи командний рядок та видаливши батьківську папку за допомогою rd /s /q path.

Згодом я спробував створити папку ще раз, але не зміг зробити це як із File Explorer, так і з командним рядком.

За свої 20 років використання Windows я ніколи не бачив цієї помилки, тому можу уявити, що це дійсно буде прикрою і заплутаною проблемою для користувачів-любителів.

Хтось знає, як це могло статися і як відтворити це питання?

Оновлення

Для зацікавлених людей: цей шлях знаходився глибоко в папці TFS. Тому, ймовірно, TFS використовує метод bypass @grawity пояснено ( "Різні файлові менеджери, архіватори тощо" )

Я натрапив на рідкісну помилку TFS?


5
У наведених нижче відповідях детально описано, що відбувається, як це навмисно відтворити та як це виправити, але вони не згадують, чому це сталося. Оскільки ..його можна використовувати в шляху для позначення "перехід на одну папку", я б загрожував здогадом, що десь уздовж рядка якась програма чи сценарій об'єднали два рядки для створення шляху, один закінчився .., а наступний розпочався з .., і оскільки він використовував один із методів, згаданих нижче, йому вдалося створити шлях, навіть якщо у нього відсутній роздільник папок між ними.
— 3D1T0R

6
дивні речі також відбудуться, якщо ви створите папку з пробілами лише в її назві
— phuclv

7
Це сервер в Інтернеті? Просто , щоб попередити вас , я регулярно бачу Hack спроби по Інтернету , з якими стикаються веб - сервера , що запитують: GET /....\\....\\....\\....\\....\\....\\....\\....\\....\\winnt\\win.ini. Очевидно, що десь є вразливість, яку намагаються використати.
— Енді Браун

4
@AndyBrown набагато ймовірніше, що це ..не так ..... Це просто спосіб пройти до \winntнезалежно від глибини початкової точки (веб-корінь), доки початкова точка не буде меншою ніж 9 рівнів. Він спирається на той факт, що перехід ..від кореневого каталогу залишає вас у кореневій директорії.
— варення

5
@hobbs Це копія та вставка з журналу доступу Apache на Linux. Однозначно там 4 точки. Є й інші спроби взломання, які використовуються, ..тому я знайшов цю дивну.
— Енді Браун

Відповіді:


303

Win32 не дозволяє створювати файли або папки з іменами, які закінчуються .- усі точки позбавлені кінця. Спроба створення test.створює testзамість цього. (Це для сумісності з 8,3 іменами у старому програмному забезпеченні епохи DOS / Win9x.)

Як результат, кожного разу, коли ви намагаєтеся отримати доступ до папки з назвою ...., її ім'я зменшується до порожньої рядка, і ви повертаєтесь до папки, в якій ви були раніше.

Ядро NT, однак, дозволяє такі імена. Існують різні механізми, які обходять обмеження імені файлів, накладені API Win32 - наприклад, WSL (підсистема Windows для Linux) не працює поверх Win32 і не впливає на неї. Існує також \\?\метод байпасу, навмисний "бекдор" для програм, які знають, що роблять. Хоча ви не можете створити C:\Example\....\, ви можете створити \\?\C:\Example\....\просто чудово.

Так само ви можете видалити такі каталоги за rmdir \\?\C:\path\...допомогою Cmd (я ще не тестував PowerShell).

Різні файлові менеджери, архіватори тощо можуть використовувати цей \\?\метод, щоб мати можливість використовувати довші імена шляхів, ніж зазвичай - і, роблячи це, на них також не впливає код сумісності в Win32; вони обходять зачистку точок, а також переклад магічних імен файлів, як CONабо NUL.

Тож може бути одна з ваших програм:

  1. завжди використовує \\?\для доступу до файлів,
  2. випадково спробував створити папку з назвою ....- але це насправді неможливо точно знати після факту.

13
Ще один спосіб створення такої папки - це використання альтернативних потоків даних. На cmd : echo "" > ....::$INDEX_ALLOCATION. Це створить папку з назвою ....(все ще вказує на поточну папку).
— WorldSEnder


124
Microsoft називає це "префіксом розширеного шляху", а шляхи з цим префіксом називаються "шляхи збільшеної довжини". (смішно: під час пошуку \\?\"у довідковому джерелі .NET це спричиняє помилку виконання на їх сервері).
— dlatikay

2
@grawity Отже. . . як мені зараз піти про видалення цієї папки?
— Shadow503

21
У мене був цікавий випадок «ремонт комп'ютера» клієнта, коли в будь-який момент клієнт зробив обліковий запис на будь-якій машині Windows, він буде працювати чудово, але як тільки він увійшов / перезавантажився, він не дозволив йому ввійти в його рахунок, а створити тимчасовий рахунок для сесія. Місцева майстерня з ремонту ПК була забита (зарядили його досі). Виявляється, його справжнє ім'я - Con &, він завжди використовував своє ім'я для свого облікового запису Windows ..... в той день я дізнався, що було більше, ніж просто com1чарівне ім'я файлу
— RozzA

23

Окрім відповіді @ grawity, програма Win32 також може це зробити, зателефонувавши безпосередньо до "рідного" API. Якщо я не помиляюся, у цьому випадку це буде NtCreateDirectoryObject. Ці виклики в даний час досить добре зафіксовані, особливо їх аналог ядра (який ви не можете зателефонувати з програми Win32), у цьому випадку ZwCreateDirectoryObject.

Щодо "нескінченної глибини", простий спосіб досягти цього - використовувати посилання. Створіть каталог, потім всередині нього, створіть до нього з'єднання (можна використовувати, mklink /jнаприклад), і ви отримаєте дуже глибоку структуру. Востаннє, коли я робив це в Windows 2000, рекурсія закінчилася, хоча (не можна було «копати нескінченно»). Можливо, на новіших ОС ліміт більший або видалений, також ви можете створити, скажімо, 10 каталогів, кожен з яких є дитиною попереднього, а в 10-му - створити посилання назад до першого.


4
Це дуже можливо злий геніальний матеріал саме там ...
— Agi Hammerthief

1
Я скопіював подібні до цього повні каталоги, щоб штучно заповнити диск для тестування, щоб можна було визначити, коли він був близьким до встановленого ліміту.
— mickeyf

Можна також відтворити за допомогою cygwin'smkdir ....
— lucidbrot

18

Існує простіший спосіб створення каталогу. З командного рядка введіть:

MD ....\

і натисніть клавішу Enter, вона створить каталог із чотирма крапками. Цей каталог також доступний для провідника.

У MS-DOS є недолік, який переходить до версії 1.0. МС знає про це вже деякий час, але не зміг або не зміг цього виправити. Вони виправили проблему з PowerShell.

До речі, якщо ви спробуєте:

RD ....

Видалити не вдасться. Щоб видалити його, потрібно використовувати цей специфічний синтаксис.

RD ....\

Я використовую це на певних серверах, якими я адмініструю. Я часто створюю папку користувача в корені диска, і не хочу, щоб інший адміністратор збирався і видаляв її.

Тож я зайду всередину своєї папки і створу підпапку під назвою CON, AUX або LPT тощо.

Якщо інший адміністратор хоче видалити мою папку, вони повинні знати, як видалити цю папку.

EDIT: Я думав про цю дискусію сьогодні вранці, і вирішив зробити цей крок далі. Я припускаю, що модники вирішать, чи це актуально.

Я не можу записати компакт-диск у папку.

Подумайте, якщо я MD c: \ test, тоді CD C: \ test і MD .... \ я закінчую C: \ test ....

і все добре.

Але CD .... виходить з ладу і повертає мене до C: \ test. (CD .... \ робить те саме.)

Однак я можу ДИР .... і отримати список реєстру. Я також можу

MD C: \ test .... \ temp, і він створює цей підрежир у ....

Я також можу CD C: \ test .... \ temp та перейти до цього підкаталогу.

Але перебуваючи в C: \ test .... \ temp, якщо я CD .. Я знову в C: \ test.

Я не можу вписатись у цей каталог, але я можу маніпулювати папкою, створюючи підпапки, і досить цікаво щось подібне

ECHO "Тестування" >> C: \ test .... \ test.txt

також працює і створює файл у цій папці. Тож я можу створити папку з чотирма крапками, я можу додати до неї файли та папки, можу отримати списки редакторів, але я не можу CD до неї. Чи може бути для цього якийсь злий геній? Вибачте за модників, якщо я занадто далеко відмовився від курсу.


6
Це швидше звучить як недолік API Win32, враховуючи, що командний рядок вже не є "MS-DOS" вже близько двадцяти років.
— grawity

2
Цікаво, що якщо я спробую видалити каталог у Windows Explorer, він виходить з ладу, коли я створив його з вашою версією. Коли я створив це з cygwin, він просто провалюється і так говорить.
— lucidbrot

У мене є машини DOS 3.3 і DOS 6.0 і команди працюють на них. Коли вони перейшли на 32 біт, проблема все ще була. вона працює у вікні CMD від win95 аж до сьогодні, включаючи всі версії сервера. Тепер, коли ми переходимо на Powershell, це більше не працює. Я зрозумів, як написав, що це створює каталог, але це не дає ефекту, який бачив ОП. Якщо я спробую записати компакт-диск у каталог із чотирма крапками, це просто відштовхує мене.
— Ларрік

На моїй машині Windows 7 MD ....` only creates .... \ .... `дерево - є лише один крок рекурсії.
— Томаш Зато

Цікаво, що менеджер FAR не розглядає це як особливе, і створює / перейменовує / видаляє / перелічує вміст каталогів під назвою "багато крапок" без проблем.
— RomanSt

-1

У мене була така ж проблема. У моєму випадку це була помилка друку в команді для публікації .NET Core:

dotnet publish "Api.csproj" --output "....\output\"

Він створив каталог з назвою "....", який я не зміг видалити або перейменувати. Цей каталог діяв як посилання на батьківський каталог. Якщо я заходжу всередину цієї папки, я все ще був у батьківській папці, але шлях додав ".... \".

Я спробував усі команди, згадані в цій темі, але жодна з них не спрацювала. На мій погляд, це діяло так, тому що у мене були інші файли та каталоги в батьківському каталозі, тому мені довелося використовувати параметри, які можуть рекурсивно видаляти весь вміст.

Я дізнався, що ця команда:

rmdir /s /q ....\

може видалити каталог "....". Він видаляє лише посилання на батьківський каталог, який цей каталог "...." насправді є, ні більше, ні менше. Незважаючи на аргументи команд:

  • / s - видаляє весь вміст із видаленого каталогу,
  • / q - видаляє без підтвердження,

батьківський каталог залишався недоторканим.


Чи можете ви уточнити, чому друга команда працювала для вас?
— Бургі

Відмова від голосування, оскільки ви не давали пояснень, чому працює команда або що вона робить, наприклад, видаляє каталог, підкаталоги та файли.
— Зимовий Фолк

Це фактично видаляє каталог з назвою "....". Він видаляє лише посилання на батьківський каталог, який цей каталог "...." насправді є, ні більше, ні менше. Я спробував усі команди, згадані в цій темі, але жодна з них не працює. На моє розуміння, ця команда спрацювала, оскільки у мене були інші файли та каталоги в батьківському каталозі, тому мені довелося використовувати параметри, які можуть рекурсивно видаляти весь вміст. Незважаючи на аргументи команд, батьківський каталог залишався недоторканим.
— Матеуш

Я потрапив у цю саме таку ситуацію разом із Visual Studio, і ця команда врятувала моє бекон після годинних розладів, намагаючись з’ясувати, що відбувається.
— NPNelson
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.