Лучшая практика Сохранять ли теги html в БД или сохранять значение сущности html? - PullRequest
4 голосов
/ 06 мая 2010

Мне было интересно, как мне поступить следующим образом. Я использую крошечный редактор MCE wysiwyg, который форматирует данные пользователей с правильными HTML-тегами. Теперь мне нужно сохранить эти данные, введенные в редакторе, в таблицу базы данных.

Должен ли я кодировать html-теги в соответствующие им сущности при вставке в БД, затем, когда я получаю данные из таблицы, не нужно кодировать их для целей XSS, но мне все равно придется использовать eval для html теги для форматирования текста.

OR

Сохраняю ли я теги html в базу данных, затем, когда я получаю данные из базы данных, кодирую теги html для их сущностей, но тогда, когда теги появятся у пользователя, мне придется использовать eval функция для фактического форматирования данных, как они были введены.

Я думаю о первом варианте, мне просто интересно, что вы, ребята, думаете.

Ответы [ 5 ]

4 голосов
/ 06 мая 2010

Я бы посоветовал хранить данные в базе данных как можно ближе к их «естественной» форме. Как правило, уровень вашей базы данных не должен интересовать, содержит ли поле HTML, двоичный текст в кодировке Base64 или просто текст. Это касается вашего слоя представления, когда он решает, как визуализировать контент.

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

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

3 голосов
/ 06 мая 2010

тоже нет. Вы сохраняете HTML «как есть», поэтому, когда вы извлекаете его, он готов для рендеринга. Вы не должны конвертировать туда и обратно. То, что вы вставляете, должно быть тем, что вы отображаете. То, что вы хотите сделать, это отфильтровать входные данные, прежде чем поместить его в базу данных. Как tinyMCE, так и ck / fckEditor имеют средства для ограничения тегов, которые можно использовать в редакторе, и он лишит вас этих тегов. Затем вам необходимо выполнить любую другую необходимую проверку или форматирование.

2 голосов
/ 06 мая 2010

Когда я впервые запустил свой блог, я решил преобразовать BBCode в HTML (и выполнить проверку работоспособности), а затем поместить его в базу данных. Ну, месяц проходит и оказывается, что у меня была проблема с макетом. Теперь, когда мой старый HTML-код «исправлен» в базе данных, я вскоре узнал, что вы всегда должны сохранять исходный текст, который пользователь использует в базе данных, а затем преобразовывать его позже в запросе.

Это позволяет исправлять ошибки с помощью HTML и XSS, и это имеет обратную силу.

1 голос
/ 06 мая 2010

Я бы просто проверял наличие SQL-инъекций при вставке в базу данных и оставлял HTML-код как есть, в его «сыром» виде.

Я знаю, что drupal делает это и применяет фильтры (например, все теги html (без фильтра), только определенные теги, фильтр xss, формат кода php, токены и т. Д.) На лету. Преимущество этого подхода заключается в том, что вы не можете деструктивно изменять свои входные данные, если хотите изменить фильтр, используемый позже.

0 голосов
/ 06 мая 2010

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

...