Новые строки в именах файлов


24

Я понимаю и принимаю предпосылку, что защитные сценарии оболочки 1 являются разумными и, в долгосрочной перспективе, более устойчивыми.

Многие из ответов на вопросы обработки текста здесь следуют этому принципу, встраивая непредвиденные ответы для неортодоксальных имен файлов; которые могут содержать пробелы, тире и новые строки.

Насколько распространены новые строки в именах файлов? В частности:

  • Какие-либо приложения создают имена файлов, которые включают переводы строки по умолчанию?
  • Есть ли ситуации, когда было бы желательно создать такие имена файлов?
  • Или они в основном являются ошибкой пользователя?

[1] Имеется в виду планирование и управление максимально широким диапазоном сценариев и непредвиденных обстоятельств ...

Вопрос вдохновлен (довольно жалобным) комментарием к этому вопросу .


4
Короткий ответ - причудливые имена файлов с символами новой строки и / или непечатаемыми символами никогда не являются хорошей практикой, разумные приложения не создают их, и вы действительно видите их, только если кто-то пытается сломать ваши сценарии оболочки или программы, которые не обрабатывают такие имена правильно. Я позволю другим людям дать более подробные ответы со ссылками и тому подобное.
jw013

Ответы:


26

Я никогда не видел имя файла с новой строкой, кроме тех, которые специально созданы для тестирования приложений, которые манипулируют именами файлов. Имена файлов, содержащие переводы строк, могут появляться из-за:

  • Некоторая ошибка или ошибка пользователя (например, неправильная копия-вставка) привели к непреднамеренному имени файла.
  • Повреждение некоторых файловых систем повлияло на имя файла.
  • Кто-то умышленно создал «странное» имя файла, чтобы использовать дыру в безопасности, когда приложение доверяло тем именам файлов, которым оно было передано, чем следовало бы.

POSIX определяет имя файла как «имя, состоящее из 1 до {NAME_MAX} байтов, используемых для именования файла. Символы, составляющие имя, могут быть выбраны из набора всех значений символов, кроме символа косой черты и нулевого байта. Имена файлов точка и точка-точка имеют особое значение.»Там нет никакой гарантии , что каждая файловая система будет принимать„странные“имена файлов (единственные гарантированные символы ASCII буквы, цифры, время, дефис и подчеркивание , то есть A-Z, a-z, 0-9и ._-, с дефисом запрещено в первой позиции), но большинство нативных файловых систем на современных юнитах делают.


Таким образом, spacesв именах файлов не гарантируется переносимость? Было бы полезно, если бы вы пояснили, что эти последние три символа являются period, underscore, and hyphen. С подчеркнутой ссылкой трудно сказать.
Токсалот

4
@toxalot Нет, пробелы, как гарантируют, не являются переносимыми, ни ,(используемыми RCS), :(используемыми X.org), ~(используемыми многими программами в файлах резервных копий),… Но они поддерживаются почти всеми современными системами.
Жиль "ТАК - перестань быть злым"

22

При написании статьи я часто собираю библиографию файлов PDF из разных источников. Не все из них содержат правильные метаданные, что означает, что я иногда копирую и вставляю название статьи из средства просмотра PDF в имя файла. Это часто приводит к появлению новых строк в имени файла, но никогда не было проблем с инструментами, которые я использовал.

ИМХО, нет ничего «защитного» в кодировании стандарта ... стандарта, который утверждает, что в именах файлов разрешены переводы строки. Если ваш скрипт не обрабатывает все имена файлов, разрешенные в стандарте, то ваш скрипт сломан.


2
Спасибо за пример из реальной жизни; это красноречиво подчеркивает вашу точку зрения о стандарте ...
jasonwryan

6
+1 за «Если ваш скрипт не обрабатывает все имена файлов, разрешенные в стандарте, значит, ваш скрипт сломан » (выделение добавлено)
jw013


⁺¹, я наткнулся на этот пост по той же причине! Просто пытаюсь понять, как написать команду для преобразования строк в пробелы.
Привет, Ангел,

2

Я никогда не видел, чтобы пользователи NORMAL использовали переводы строк в именах файлов. Похоже, что их основная цель состоит в том, чтобы (1) облегчить злоумышленникам подрыв вашей системы и (2) усложнить написание безопасных программ :-(. Однако современные Unix-подобные (такие как Linux) позволяют им так что вы должны подготовиться к ним, если вы хотите программу, которая противостоит атаке.

«Имена файлов и пути в оболочке: как это сделать правильно» показывает, как правильно это обрабатывать.


Я обычный пользователь, и у меня есть новые строки в именах моих файлов. Сценарий, изложенный в ответе @sml, случался со мной не раз. Что меня интересует, так это то, как можно использовать новую строку в имени файла, чтобы «разрушить систему»? Есть ли у вас источники, объясняющие это?
Джозеф Р.

@JosephR. Я не могу придумать, как скомпрометировать систему, но вы могли бы использовать ее в качестве DOS для приложений, которые не обрабатывают новые строки (и вместо этого
выдают
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.