Нужно ли кодировать HTML перед сохранением? - PullRequest
14 голосов
/ 11 апреля 2010

Должен ли HTML кодироваться перед сохранением, скажем, в базе данных? Или это нормальная практика для кодирования при выходе в браузер?

Должны ли все длины моего текстового поля быть увеличены в четыре раза в базе данных, чтобы обеспечить дополнительное хранилище?

В поисках лучшей практики, а не твердого да или нет: -)

Ответы [ 5 ]

15 голосов
/ 11 апреля 2010

Являются ли данные в вашей базе данных действительно HTML, или это данные приложения, такие как имя или комментарий, которые, как вы только что узнали, окажутся частью HTML-страницы?

Если это данные приложения, я думаю, что лучше всего:

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

Если вы являетесь поклонником MVC, это также помогает отделить представление / контроллер от модели (и от формата постоянного хранения).

Представление

Например, предположим, что кто-то оставляет комментарий "Я люблю M & Ms". Вероятно, проще всего представить его в коде как текстовую строку "I love M&Ms", а не как строку в кодировке HTML "I love M&Ms". Технически, данные в том виде, в котором они существуют в коде, еще не являются HTML, и жизнь будет проще, если данные представлены настолько просто, насколько это возможно. Эти данные могут позже использоваться в другом виде, например настольное приложение. Эти данные могут храниться в базе данных, в простом файле или в файле XML, возможно, позже будут переданы другой программе. Другой программе проще всего предположить, что строка находится в «нативном» представлении для формата: "I love M&Ms" в базе данных и обычном файле и "I love M&Ms" в файле XML. Я бы хотел увидеть HTML-кодированное значение в XML-файле ("I love &Ms").

Перевод

Позже, , когда данные собираются пересечь границу представления (например, отображаются в HTML, хранятся в базе данных, текстовом файле или файле XML), тогда важно убедиться, что они правильно переведен, чтобы он был точно представлен в формате, соответствующем следующей среде. Короче говоря, когда вы хотите отобразить его на странице HTML, убедитесь, что он переведен в правильно закодированный HTML (вручную или с помощью инструмента), чтобы значение точно отображалось на странице. Когда вы собираетесь сохранить его в базе данных или использовать его в запросе, используйте escape-и / или подготовленные операторы и связанную переменную, чтобы обеспечить точное представление того же концептуального значения в базе данных. Когда вы собираетесь сохранить его в XML-файле, вы гарантируете его XML-кодировку.

Неверный перевод при пересечении границ представления является источником атак с использованием инъекций, таких как SQL-инъекции. Будьте внимательны при работе с несколькими представлениями / языками (например, Java, SQL, HTML, Javascript, XML и т. Д.).

-

С другой стороны, если вы действительно пытаетесь сохранить фрагменты HTML-страницы в базе данных, мне непонятно, что вы подразумеваете под «закодированными перед сохранением». Если это строго верный HTML, все необходимые значения уже должны быть закодированы (например, &, < и т. Д.).

13 голосов
/ 11 апреля 2010

Практика заключается в кодировании HTML до отображения .

Если вы не сомневаетесь в кодировании перед отображением, вы предприняли немало мер по предотвращению XSS.

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

2 голосов
/ 11 апреля 2010

Выход базы данных зависит от поставщика, html - на выходе.

1 голос
/ 16 марта 2013

Я не согласен со всеми, кто считает, что его следует декодировать во время отображения, и вероятность того, что атака произойдет, если ее закодировать до того, как она достигнет базы данных, возможна только в том случае, если цель разработчика декодирует ее перед ее отображением. Однако, если вы декодируете его перед его представлением, всегда есть вероятность, что это может произойти от какого-то другого новичка-разработчика, например, нового найма или плохой реализации. Если он сидит там без кодировки, он просто ждет, чтобы выскочить в Интернет и распространяться, как герпес. Потеря исходных данных не должна быть проблемой. encode + decode должен каждый раз выдавать одни и те же данные. Просто мои два цента.

0 голосов
/ 11 апреля 2010

По соображениям безопасности, да, вы должны сначала преобразовать HTML в их сущности, а затем вставить в базу данных. Такие атаки, как XSS , инициируются, когда вы разрешаете пользователям (или, скорее, плохим парням) использовать html-теги, а затем обрабатываете / вставляете их в базу данных. XSS является одной из коренных причин большинства дыр в безопасности. Так что вам определенно нужно кодировать ваш html перед его сохранением.

...