Le nom du dossier était répertorié dans l'Explorateur de fichiers avec simplement quatre points ....
.
Quand j'ai essayé de l'ouvrir, je suis entré dans une sorte de boucle de trou de lapin sans fin où j'ai ouvert le même dossier, encore et encore - je pouvais le faire sans fin. Montrer le chemin comme C:\ExamplePath\....\....\....\....\....
, etc.
Il était accroché ma compilation TypeScript dans un projet spécifique. Il m'a fallu plus d'un an avant de trouver ce dossier et ses problèmes, car il était profondément enraciné dans des dossiers imbriqués. Je ne m'attendais jamais à un problème de ce genre, je ne l'ai donc jamais cherché.
Je ne pouvais pas supprimer le dossier normalement, à cause du nom spécial. En fin de compte, je pourrais le supprimer en utilisant la ligne de commande et en supprimant le dossier parent avec rd /s /q path
.
Par la suite, j’ai essayé de créer à nouveau le dossier, mais j’ai été incapable de le faire avec l’explorateur de fichiers et la ligne de commande.
Au cours de mes 20 années d’utilisation de Windows, je n’avais jamais vu ce bogue auparavant, alors j’imagine que ce serait vraiment un problème embêtant et déroutant pour les utilisateurs amateurs.
Est-ce que quelqu'un sait comment cela aurait pu se produire et comment reproduire ce problème?
Mise à jour
Pour les personnes intéressées: ce chemin était situé profondément dans un dossier TFS. Donc, probablement TFS utilise la méthode de contournement @grawity expliquée ( "Divers gestionnaires de fichiers, archiveurs, etc." )
Ai-je trébuché sur un rare bug de TFS?
la source
..
peut être utilisé dans un chemin pour indiquer «monter d'un dossier», je suppose que quelque part dans la ligne, un programme ou un script a concaténé deux chaînes pour créer un chemin, l'une terminée..
et l'autre commençant par..
, et Comme il utilisait l’une des techniques mentionnées ci-dessous, il a réussi à créer le chemin, même s’il manquait le séparateur de dossiers entre eux.GET /....\\....\\....\\....\\....\\....\\....\\....\\....\\winnt\\win.ini
. Clairement, il existe / existait une vulnérabilité quelque part que celle-ci tente d’exploiter...
, non....
. Il s'agit simplement d'un moyen de parcourir\winnt
quelle que soit la profondeur du point de départ (la racine Web), tant que le point de départ est inférieur à 9 niveaux. Cela repose sur le fait que..
partir du répertoire racine vous laisse au répertoire racine...
qui était la raison pour laquelle j'ai trouvé celui - ci assez bizarre.Réponses:
Win32 ne vous permet pas de créer des fichiers ou des dossiers dont le nom se termine par
.
- tous les points sont supprimés de la fin. Essayer de créertest.
faittest
apparaître à la place. (Ceci concerne la compatibilité avec les noms 8.3 dans les anciens logiciels de l’ère DOS / Win9x.)Par conséquent, chaque fois que vous essayez d'accéder à un dossier nommé
....
, son nom devient réduit à la chaîne vide et vous revenez au dossier dans lequel vous vous trouviez auparavant.Le noyau NT, cependant, autorise de tels noms. Différents mécanismes permettent de contourner les limitations de nom de fichier imposées par les API Win32 - par exemple, WSL (Windows Subsystem for Linux) ne s'exécute pas sur Win32 et n'est pas affecté par celui-ci. Il y a aussi la
\\?\
méthode de contournement, une "porte dérobée" délibérée laissée aux programmes qui savent ce qu'ils font. Même si vous ne pouvez pas créerC:\Example\....\
, vous pouvez créer\\?\C:\Example\....\
très bien.De même, vous pouvez supprimer de tels répertoires avec
rmdir \\?\C:\path\...
Cmd (je n'ai pas encore testé avec PowerShell).Différents gestionnaires de fichiers, archiveurs, etc. peuvent utiliser cette
\\?\
méthode pour pouvoir utiliser des noms de chemins plus longs que d'habitude. Ils ne sont donc pas affectés par le code de compatibilité de Win32. ils contournent l'effacement des points, ainsi que la traduction de noms de fichiers magiques tels queCON
ouNUL
.Donc, il se pourrait que l'un de vos programmes:
\\?\
pour accéder aux fichiers,....
- mais il n'est pas vraiment possible de savoir avec certitude après coup.la source
echo "" > ....::$INDEX_ALLOCATION
. Cela créera un dossier nommé....
(pointant toujours sur le dossier actuel).\\?\"
dans la source de référence .NET , cela provoque une erreur d'exécution sur leur serveur).com1
nom de fichier magiqueEn plus de la réponse de @ grawity, un programme Win32 peut également le faire en appelant directement l'API "native". Si je ne me trompe pas, dans le cas présent, ce serait NtCreateDirectoryObject. Ces appels sont assez bien documentés de nos jours, en particulier leur homologue du noyau (que vous ne pouvez pas appeler depuis un programme Win32), dans ce cas, ZwCreateDirectoryObject.
En ce qui concerne la "profondeur sans fin", un moyen facile d'y parvenir consiste à utiliser des liens. Créez un répertoire, puis à l’intérieur de celui-ci, créez une jonction (vous pouvez utiliser
mklink /j
par exemple), et vous obtiendrez une structure très profonde. La dernière fois que j'ai fait cela était sur Windows 2000, la récursivité prenait fin (vous ne pouviez pas "creuser à l'infini"). Peut-être que sur les nouveaux systèmes d’exploitation, la limite est plus grande ou supprimée, vous pouvez également créer, par exemple, 10 répertoires, chacun d’eux étant le précédent, et créer un 10ème répertoire pour revenir au premier.la source
mkdir ....
Il existe un moyen plus simple de créer le répertoire. A partir de l'invite de commande, tapez:
MD ....\
et appuyez sur Entrée, il créera un répertoire avec quatre points. Ce répertoire est également visible avec explorer.
Il y a une faille dans MS-DOS qui remonte à la version 1.0. MS est au courant depuis un certain temps, mais ne pourrait pas ou ne voudrait pas le réparer. Ils ont corrigé le problème avec PowerShell.
BTW, si vous essayez:
RD ....
Il ne sera pas supprimé. Vous devez utiliser cette syntaxe spécifique pour la supprimer.
RD ....\
J'utilise ceci sur certains serveurs que j'administre. Je crée souvent un dossier utilisateur à la racine du disque et je ne veux pas qu'un autre administrateur vienne le supprimer.
Je vais donc aller dans mon dossier et créer un sous-dossier nommé CON, AUX ou LPT, etc ...
Si un autre administrateur souhaite supprimer mon dossier, il doit d'abord savoir comment supprimer ce sous-dossier.
EDIT: Je pensais à la discussion de ce matin et j'ai décidé d'aller plus loin. Je suppose que les mods décideront si cela est pertinent.
Je ne parviens pas à insérer un CD dans le dossier.
Considérez si je MD c: \ test puis CD C: \ test et MD .... \ Je me retrouve avec C: \ test ....
et tout va bien.
Mais CD .... échoue et me renvoie à C: \ test. (CD .... \ fait la même chose.)
Cependant, je peux DIR .... et obtenir une liste de dir. je peux aussi
MD C: \ test .... \ temp et il crée ce sous-répertoire dans ....
Je peux aussi CD C: \ test .... \ temp et aller dans ce sous-sous-répertoire.
Mais alors que dans C: \ test .... \ temp, si je CD .. je suis de retour dans C: \ test.
Je ne peux pas entrer dans ce répertoire, mais je peux manipuler le dossier en créant des sous-dossiers, et assez intéressant, par exemple
ECHO "Test" >> C: \ test .... \ test.txt
fonctionne également et crée un fichier dans ce dossier. Ainsi, je peux créer un dossier avec quatre points, je peux y ajouter des fichiers et des dossiers, je peux obtenir des listes de répertoires, mais je ne peux pas y insérer de CD. Pourrait-il y avoir une sorte de génie maléfique utilisé pour cela? Mes excuses aux mods si je me suis égaré trop loin du cap.
la source
MD ....` only creates
.... \ .... `arbre - il n'y a qu'une étape de récursivité.J'ai eu le même problème. Dans mon cas, il s’agissait d’une commande de frappe pour la publication .NET Core:
Il a créé le répertoire avec le nom '....', que je n'ai pas pu supprimer ou renommer. Ce répertoire a agi comme une référence au répertoire parent. Si je vais dans ce dossier, je suis toujours dans le dossier parent, mais le chemin est ajouté par '.... \'.
J'ai essayé toutes les commandes mentionnées dans cette rubrique, mais aucune d'entre elles n'a fonctionné. D'après ce que j'ai compris, cela s'est passé de la même manière, car j'avais d'autres fichiers et répertoires dans le répertoire parent. Je devais donc utiliser des paramètres capables de supprimer de manière récursive tout le contenu.
J'ai découvert que cette commande:
peut supprimer le répertoire '....'. Il supprime seulement la référence au répertoire parent, ce qui est en réalité ce répertoire '....', rien de plus, rien de moins. Malgré les arguments de la commande:
le répertoire parent reste inchangé.
la source