Добрый день!
Очередной раз сталкиваюсь с проблемой пользовательского ввода и хранения текстов в MySQL.
Задача: На сайте человек регистрируется, у него есть возможность написать текст в форме с визуальным редактором (ckeditor), этот текст будет выводиться на сайте как html. Нужно как-то грамотно обрабатывать и хранить эти тексты, чтобы не образовать дыру в сайте.
Экранирование кавычек и спецсимволов это хорошо, пока дело не доходить до атрибутов типа onmouseover="alert(document.cookie)" и других магических конструкций вроде <script src="http://....../trojan.js"></script>
Интересно кто как решает подобные задачи?
Наверное глупо давать разрешение юзеру менять цвета, шрифты, создавать таблицы и другие плюшли из визуального редактора. Но всё же интересно, насколько это возможно позволить.
(Добавление)
По моему мнению самым оптимальным вариантом будет сделать белый список разрешенных тегов с удалением всех атрибутов. Вопрос только как всё это подружить с тегами <a> <img>
1. dmaw - 18 Сентября, 2016 - 11:07:13 - перейти к сообщению
2. Ch_chov - 18 Сентября, 2016 - 15:35:10 - перейти к сообщению
Есть два подхода:
Можно также взять какой нибудь готовый фильтр, например purifier.
- Фильтровать контент при вводе (перед сохранением в БД)
- Фильтровать контент при выводе (в БД контет хранится как есть)
Можно также взять какой нибудь готовый фильтр, например purifier.
3. dmaw - 18 Сентября, 2016 - 23:57:32 - перейти к сообщению
Ch_chov, спасибо! Фильтр purifier сегодня уже попадался на глаза, слишком сложно там всё оказалось, я за простоту
Склоняюсь к минимальным возможностям. Больше нравится вариант с регулярными выражениями.
Сейчас сохранение в базу сделал так:
Склоняюсь к минимальным возможностям. Больше нравится вариант с регулярными выражениями.
Сейчас сохранение в базу сделал так:
Вывод на сайте планирую как-то так:
PHP:
скопировать код в буфер обмена
скопировать код в буфер обмена
- $str = strip_tags($str, '<p><a><img><b><strong><i><em><center><h1><h2><h3><h4><h5><h6><ol><ul><li><br><br /><blockquote><spoiler><source><table><tr><td>');
- $str = preg_replace("#(</?\w+)(?:\s(?:[^<>/]|/[^<>])*)?(/?>)#ui", '$1$2', $str); // удалить все атрибуты
Конечно каждый раз при выводе пропускать текст через функции я не буду, скорее всего будет второе текстовое поле в таблице.
Нужно решить вопрос с обработкой атрибутов для <a> и <img>
Возможно в этом подходе есть подводные камни.