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

24

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

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

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

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

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

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

jasonwryan
источник
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 в имя файла. Это часто приводит к появлению новых строк в имени файла, но никогда не было проблем с инструментами, которые я использовал.

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

SML
источник
2
Спасибо за пример из реальной жизни; это красноречиво подчеркивает вашу точку зрения о стандарте ...
jasonwryan
6
+1 за «Если ваш скрипт не обрабатывает все имена файлов, разрешенные в стандарте, значит, ваш скрипт сломан » (выделение добавлено)
jw013
3
Вот один аргумент одного человека, почему мы должны изменить символы, которые принимаются в именах файлов, и я лично с ним согласен.
Крис Магнусон
⁺¹, я наткнулся на этот пост по той же причине! Просто пытаюсь понять, как написать команду для преобразования строк в пробелы.
Привет, Ангел,
2

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

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

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