2010-05-05 3 views
4

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

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

ИЛИ

ли я сохранить HTML-тег в базу данных, а затем, когда я получаю данные обратно из базы данных кодирования HTML тегов их лиц, но тогда как метки будут отображаться пользователю, я d необходимо использовать функцию eval для фактического форматирования данных по мере их ввода.

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

ответ

3

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

+0

, когда вы говорите «фильтровать вход», можете ли вы просто уточнить, что вы имеете в виду? – phpNutt

+0

Я хочу сделать мое приложение максимально безопасным и подумал, что путем преобразования тегов в свои html-объекты с использованием функции htmlentities будет шагом к обеспечению его безопасности. – phpNutt

+0

@matt: на вашем пути вы хотите удалить запрещенные теги, исправить недействительную разметку и т. Д., Затем по пути вы можете применить фильтр для выполнения преобразований, дополнительной фильтрации xss и т. Д. Перед его отображением. но вы хотите, чтобы в db была базовая разметка, так как Адам N, brian_d и Earlz предлагают в своих ответах. – prodigitalson

4

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

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

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

+0

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

1

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

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

2

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

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

0

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^