Почему файлы с идентичным содержимым (например, *.js, *.php, *.css) могут иметь различный размер?

Здравствуйте! <br/> <br/> Я занимаюсь проектами на WordPress и сталкиваюсь с трудностями в оплате подписок на зарубежное программное обеспечение из России. В связи с этим у пользователей и разработчиков возникла необходимость находить способы обновления платных плагинов для WP, одним из которых является известный ACF PRO ( <a href="https://www.advancedcustomfields.com/pro/" rel="nofollow">https://www.advancedcustomfields.com/pro/</a> ). <br/> <br/> Недавно я обнаружил публичный репозиторий на GitHub, имеющий большое количество звезд, где регулярно публикуются новые версии данного плагина. <br/> <a href="https://github.com/pronamic/advanced-custom-fields-pro" rel="nofollow">https://github.com/pronamic/advanced-custom-fields-pro</a> <br/> <br/> В качестве эксперимента я решил провести сравнение файлов и выяснить, нет ли в них чего-то "лишнего", например, вредоносного кода или уязвимостей, и действительно ли они представляют собой чистые копии PRO-версий плагина. <br/> <br/> У меня есть версия плагина "6.2.6.1" годовалой давности, которую я приобрел по официальной подписке. Я сравнил ее файлы с теми же из репозитория на GitHub. Большинство файлов (например, *.js, *.php, *.css) различаются по размеру, но содержимое (код) абсолютно идентично при сравнении и открытии в различных редакторах, таких как VS Code. Я также попробовал осуществить сравнение через Git: создал проект с папкой плагина и заменил все файлы на версию из GitHub. Изначально Git указал на более 300 измененных файлов, но при попытке закоммитить изменения возникла ошибка - нет изменений. <br/> <br/> Что может объяснять такую ситуацию, и как мне определить причину различий в размерах файлов?
  • 17 января 2025 г. 13:33
Ответы на вопрос 3
Здравствуйте!

Разница в размере файлов с идентичным содержимым, например, для файлов JavaScript (*.js), PHP (*.php) или CSS (*.css), может быть обусловлена несколькими факторами:

1. **Различия в кодировке**: Разные текстовые редакторы могут сохранять файлы с различной кодировкой (например, UTF-8 с BOM и без BOM, ANSI и т.д.). Наличие или отсутствие BOM (Byte Order Mark) может увеличить размер файла.

2. **Формат хранения новых строк**: Обычно разные операционные системы используют разные символы для окончания строки (например, LF в Unix/Linux, CRLF в Windows). Это может приводить к ситуации, когда файлы выглядят идентичными при сравнении, но размер различается из-за различного количества и типа символов конца строки.

3. **Комментарии и пробелы**: Хотя в вашем случае это может не быть причиной, стоит отметить, что некоторые редакторы могут автоматически добавлять или удалять пробелы и комментарии при сохранении файла, что может повлиять на размер.

4. **Метаданные файлов**: В некоторых случаях различия в размере могут быть вызваны метаданными, которые не видны в редакторах, но хранятся в файлах. Это менее вероятно для обычных текстовых файлов, но возможно.

5. **Неразрывные символы и невидимые символы**: Возможно, в одном наборе файлов имеются невидимые символы или специальные символы, которые не отображаются в стандартных редакторах, но учитываются в размере файла. Команда `cat -v` в Unix-подобных системах может помочь визуализировать такие символы.

6. **Системные различия и вес**: Если файлы загружались на разных системах или между ними произошли какие-либо преобразования (например, при использовании системы контроля версий), это может также сказаться на размере файла.

Чтобы определить причину различий в размерах файлов, вы можете воспользоваться следующими методами:

- Использование командных строк для отображения кодировки файлов и символов.
- Команда `diff` в Unix-подобных системах, чтобы увидеть, действительно ли файлы идентичны на уровне байтов.
- Использование инструментов анализаторов кодировки, таких как `file` или `iconv`, чтобы проверить кодировку файлов.
- Попробуйте компрессию данных, чтобы проверить, отличаются ли файлы по содержимому при сжатии.

Таким образом, разница в размере файлов может быть незначительной и не иметь отношения к безопасности или интегритету кода, но все же имеет смысл провести дополнительные проверки, чтобы максимально убедиться в этом.
Как именно вы проверяли вес файлов и чем и как сравнивали их содержимое? Есть два варианта: возможно вы спутали размер файла и место занимаемое на диске, показываемые в свойствах файла - это разные вещи. На диске файл занимает больше место, т.к. под файл выделяется место кластерами, а размер кластера фиксирован для раздела и может быть разным, и соответственно в разных ОС и в разных ФС он может быть разным. Второй вариант - разные переводы строк в разных ОС. Гит умеет подменять и в разных ОС размер и хэш файлов будет отличаться из-за разных принятых переводов строк в ОС или настроек гита.
Многие платформы поддерживают метаданные для файлов. В винде они называются потоками ( file streams ). Их не видно, если просто открыть файл, но всякие программы знают, как туда залезть и что-то там посмотреть. Например, все браузеры при скачивании файлов из интернета делают в этих потоках пометку, что файл-то скачан. И винда потом при попытке открыть такой экзешник обычно выдает предупреждение: "Ахтунг, файл из интернета, точно хотите открыть?" 

В эти потоки можно много чего запихать. Сами по себе данные там никак не могут заразить компьютер, но какой-нибудь вредоносный загрузчик вполне может данные оттуда достать и запустить. Так что это может быть скрытая полезная нагрузка вирусни, и какой-то один из файлов содержит код распаковки.

На линуксе похожая штука точно есть, но я не помню, как оно называется.

Еще варант: не ошиблись ли вы с подсчетом размеров файлов? Может вы килобайты с кибибайтами перепутали?

А гит скорее всего заметил измененные даты на файлах, но изменений в самих файлах не нашел. И да, гит эти потоки игнорирует.
Похожие вопросы