Почему CSV-ячейка становится формулой и что проверять при экспорте
Распознать риск формул и пределы apostrophe guard
CSV может корректно хранить текст, который табличная программа интерпретирует как формулу. Поэтому два независимых вопроса нужно проверять отдельно: правильно ли разделены поля и безопасно ли открывать их в выбранной программе.
Проблема возникает при помещении недоверенного ввода в выгрузку и последующем открытии её в редакторе таблиц. Начальные символы вроде = могут запускать интерпретацию формулы. Это описывает OWASP CSV Injection; страница проверена 05.10.2026, стабильная дата публикации не указана.
Что делает защита Neraviko
В JSON → CSV включён параметр spreadsheet_safe=true. В текущей версии операция проверяет начало текстовой ячейки: ASCII-пробелы, затем =, +, -, @, табуляция, CR или LF. Перед распознанной потенциальной формулой добавляется апостроф. Проверяются и значения, и ячейки заголовка.
Это изменение данных, которое видно в предупреждении CSV_FORMULA_PREFIX_ESCAPED. Ответ получает needs_review. Префикс не скрывается из выгрузки и не считается доказательством безопасности во всех программах.
Безвредный синтетический пример
Вход содержит только демонстрационную арифметику:
[{"note":"=1+1"},{"note":"обычный текст"}]
При стандартной защите и trailing_newline=false проверенный результат:
note
'=1+1
обычный текст
Операция версии 1 возвращает CSV_FORMULA_PREFIX_ESCAPED, а meta.formula_cells_escaped равен 1. При просмотре исходного файла апостроф присутствует. Если файл затем проходит обычный CSV-парсер, префикс может оказаться частью строкового значения — получатель должен знать о таком изменении.
Не снимайте апострофы массовой заменой в файле для людей: она восстанавливает исходные потенциальные формулы. Если нужен неизменённый машинный обмен, подготовьте отдельный контракт и используйте JSON, где значение остаётся строкой до тех пор, пока принимающая система сама не интерпретирует его иначе.
Когда защита не даёт полной гарантии
OWASP предупреждает, что после сохранения и повторного открытия CSV Excel может менять кавычки или escape-символы. Также описаны зависящие от локали полноширинные варианты начальных символов. Универсальной очистки для всех редакторов и последующих потребителей нет. Источник и ограничения OWASP, проверено 05.10.2026.
Проверка Neraviko использует перечисленные ASCII-символы. Она не является проверкой всех возможных формул и всех локалей. Обычные CSV-кавычки нужны для границ полей: они сами по себе не делают формулу безопасным текстом. Отдельно проверяйте экспорт в том приложении, версии и режиме импорта, которые реально использует получатель.
Защита также может изменить добросовестный текст: номер со знаком +, строка -10, имя с @ в начале. Поэтому needs_review нужно рассматривать как приглашение проверить назначение файла и последствия преобразования, а не как ошибку, которую следует убрать.
При spreadsheet_safe=false исходное значение сохраняется, но распознанный риск даёт CSV_FORMULA_INJECTION_RISK. В версии 1 этот warning не подавляется. Отключение подходит только для контролируемого сценария, где выбранный потребитель читает ячейки как данные и это проверено.
Задайте критерий успешной проверки в таблице
Безвредная арифметика нужна как контроль интерпретации, а не как измерение безопасности всей программы. Зафиксируйте ожидаемое текстовое содержимое ячейки и сравните его после импорта, сохранения и повторного открытия. Если редактор показал вычисленное значение вместо текста, выбранный процесс не прошёл проверку. Сохраните описание версии программы и режима открытия вместе с результатом теста.
В тот же искусственный набор включите обычный текст со знаком плюс или минус. Защитное преобразование может быть правильным для просмотра, но неприемлемым для последующего машинного сравнения. Приёмка должна подтвердить и отсутствие нежелательной интерпретации, и сохранение согласованного смысла добросовестных значений.
Если проверяемый файл пересылают через другую систему, повторите контроль на конечном файле: промежуточная конвертация может изменить префиксы и кавычки. Положительный результат для исходной выгрузки не переносится автоматически на её последующие копии. Такие проверки выполняются у потребителя; генератор CSV не знает конечную цепочку обработки.
Проверка перед отправкой
- Определите, будут ли файл открывать люди в таблицах или читать машинный импортёр.
- Оставьте защиту включённой для недоверенного текста, просмотрите предупреждения и изменённые ячейки.
- Проверьте безвредный тест с
=1+1в целевой программе. - Повторите проверку после сохранения и повторного открытия файла.
- Сверьте обычные значения со знаками, ведущие пробелы и заголовки.
- При необходимости разделите файл для просмотра и исходные данные для машинного обмена.
Конвертация выполняется на сервере, а не исключительно в браузере. Контракт операции исключает сохранение и логирование сырых входов и выходов по умолчанию. Для проверки защитного поведения используйте демонстрационный набор, не клиентскую выгрузку.