Экранировать ввод или вывод?

19 Февраля 2023 (ред)

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

Принимая во внимание все многообразие существующих Веб-сайтов (и это только если их рассматривать отдельно) можно ли считать, что для всех может существовать один принцип экранирования данных? В реальности из стартапов в большие проекты вырываются те, кто сумел обойти конкурентов. Одно из условий - скорость работы приложения.

Это потом уже, вырвавшись из конкурентной гонки, специалисты этих проектов перераспределяют усилия на большую нагрузку и могут давать советы стартапам (и вообще всем) использовать микросервисы и прочее, что сами не использовали.

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

Для чего нам потребуется отдавать данные в разных форматах? Самый часто встречаемый в интернете формат - это HTML. Потом уже идут JSON, XML, CSV и тд. Если мы собираемся давать совет на все случаи Веб-сайтов, без сомнений будем отталкиватся от HTML. Если искать правильный единый ответ для мейнстримной на данный момент технологии создания сайтов, то он скорее всего подразумевает интерпрайз код, которого в интернете по массе своей меньше. Несомненно, последнее нужно уточнять при написании категоричных статей типа "Всегда экранировать вывод, но не ввод". На многих сайтах кроме HTML другие форматы вывода не используются и не будут использоваться никогда, исходя из предназначения ресурса.

Проще говоря, если вывод информации в одном из форматов сильно преобладает (например HTML 90%, остальные 10% по статистике нагрузки) или важно именно в этом формате сделать упор на скорость, можно экранировать на вводе пользовательские данные, что обычно является узким местом, в конкретный преобладающий формат (здесь HTML) и хранить их в таком виде, а в остальных преобразовывать примененное экранирование обратно и конвертировать в нужный.

Что касается использования HTML, то наравне с JSON, результат которого часто размещается в том же DOM-дереве сайта, здесь большинство проблем сразу решает экранирование < и > в HTML сущности. Также по правилам принято экранировать знак &, что игнорируется всеми браузерами и может привести к проблемам при повторном экранировании первых двух указанных символов.

Результат вывода в CSV и подобные, который обычно не отображается пользователю сразу, а является генерацией файла по требованию, можно подвергнуть обратной конвертации, заменив указанные символы (HTML-сущности символов <, > и &) на исходные. При этом нельзя сказать точно, на какой формат приходится больше нагрузки, задачи каждого проекта особенны (надеюсь). Если неизвестно и цели сайта постоянно меняются, то здесь да, нужно экранировать вывод и смирится с тем, что функция экранирования будет запускаться всегда и везде, даже при инвалидации кеша. При этом важно, что узкоспециальное экранирование для каждого формата выполняется при выводе в этот формат.

Также нужно учитывать, где находится узкое место сайта, при вводе информации или выводе. Обычно в меньшинстве ввод, пользователь ввел какой то контент и потом он многократно, более раз и мест, чем создание и редактирование, отображается ему и другим пользователям.

Если посмотреть с точки зрения разработки программного обеспечения, то размещение экранирования (<, > и &) в узкой части также уменьшает вероятность банальной ошибки. Речь, конечно, только про экранирование этих трех символов, хотя по факту угрозу безопасности составляют толька два из них(< и >) . В современных фреймворках и использовании правильных подходов, это всё происходит через функцию-обёртку в которой функция экранирования присутствует единожды для каждого формата и это решает указанную выше проблему с выбором узкого места.

Посыл этого экскурса в тему экранирования заключается в более универсальном принципе, следовании здравому смыслу, в каждом конкретном случае нужно рассматривать задачи и структуру проекта индивидуально

Для ответа вы можете авторизоваться


Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.