- безопасное хранение HTML в MySQL?
- 14 ответов
- Mysql как записать html код
- Правильный способ хранения текста и HTML-кода в базе MySQL
- Хранение
- Использование данных в SQL запросах.
- Спец-символы HTML
- Кодировка
- Правильный способ хранения текста и HTML-кода в базе MySQL?
- Как записать в Бд html код
- Комментарии
- Как сохранить HTML в базу данных и получить его правильно
- 2 ответа
безопасное хранение HTML в MySQL?
Посоветуйте, как безопасно хранить HTML. Допустим, я хочу создать колонку новостей, причем текст новости должен быть оформлен с помощью HTML-тэгов. Я вижу два варианта:
1) В MySQL хранить имя HTML-файла с текстом новости, а сам HTML-файл загружать через специальную форму, а потом с помощью PHP выводить его в колонку новостей.
2) Хранить текст новости со всеми тэгами HTML в самой базе данных. Только не знаю, как это сделать безопасно?
Заранее благодарен за любую помощь новичку в программировании.
Михаил.
14 ответов
Все очень просто. PHP имеет функцию mysql_escape_string(), которая «обезопашивает» любую строку от системных символов.
Originally posted by Dolonet
Все очень просто. PHP имеет функцию mysql_escape_string(), которая «обезопашивает» любую строку от системных символов.
Да, но тут же возникает сразу XSS дырочка:). Защита должна быть комплексной. Есть несколько вариантов.
1. Использовать что-то типа BBcode и при выводе новостей заменять их на HTML аналоги. Согласен, накладно.
2. ИМХО самый лучший. Заменять теги при вводе на BBcode, только это делать надо именно при вводе, а не заменять это после отправки формы. Далее рубишь все теги htmlspecialchars(), проходишься выше сказанной mysql_escape_string(), после этого заменяешь весь Bbcode на HTML аналог и заносишь в БД. Всё, радуешься жизни.
PS ссори за оффтоп. Товарищи, а самый важный топ «Безопасное PHP программирование» что, уже забросили? :< .
Нету никакой дырочки. Эта функция полностью обезопашивает строку, какой бы она ни была.
А что про безопасность еще хочется? Можем продолжить )
Originally posted by Dolonet
Нету никакой дырочки. Эта функция полностью обезопашивает строку, какой бы она ни была.
А что про безопасность еще хочется? Можем продолжить )
Mysql как записать html код
Правильный способ хранения текста и HTML-кода в базе MySQL
Каким образом необходимо обрабатывать текст и html-код для записи в базу MySQL? Какая схема?
Перерыл интернет, везде совет для записи в базу использовать mysql_real_escape_string(), и больше вроде ничего не нужно. Но как быть со спец-мисволами html? К примеру «⇔» при вставке в форму отображается как символ, а не как html-код сивола. Соответственно при записи в базу, он превращается в «?»
Как я понимаю необходимо обрабатывать текст вот так перед вставкой:
Соответственно при выводе из базы на отображение необходимо обрабатывать текст вот так:
Такой алгоритм правильный или надо делать как-то по-другому?
Вопрос очень простой, но в то же время очень характерный.
В нем отлично собраны наиболее популярные заблуждения начинающих пользователей РНР. Попробуем в них разобраться.
Хранение
Самое первое, что надо научиться — это не путать хранение данных и их использование в SQL запросах. Это совершенно разные вещи. По поводу хранения следует понимать, что храниться в БД могут абсолютно любые данные, и при этом храниться они должны как есть. То есть, для хранения их никак, вообще никак обрабатывать не нужно.
Следовательно, отвечая на поставленные в посте (не совсем корректные, как мы видим), вопросы:
- Как хранить какие-либо данные в БД? Данные должны храниться как есть.
- Как обрабатывать данные для БД? Никак. Ни в коем случае никак обрабатывать нельзя.
- Как хранить HTML? Никаких особенных действий ни для HTML, ни для любых других данных производить не нужно. Все данные хранятся абсолютно одинаково.
Использование данных в SQL запросах.
А вот это уже совсем другой вопрос. Единственный, в ответ на который нам надо будет что-то делать. Но при этом сами данные мы всё равно трогать не будем. Да-да! Даже для помещения в SQL запрос мы никак данные обрабатывать не будем. Дело в том, что «совет для записи в базу использовать mysql_real_escape_string()» — это просто феерическая глупость, к сожалению, растиражированная в миллионах экземпляров.
А единственно правильный способ добавления данных в SQL запрос — это делать это через плейсхолдеры.
То есть, чтобы использовать любые данные в SQL запросе, надо сначала на их месте написать знаки вопроса:
это, кстати, касается вообще всех запросов. SELECT мы пишем точно так же:
после этого надо будет подготовить запрос, а потом выполнить его, передав переменные отдельно. Вот как это происходит на примере PDO:
то есть, идея такая: если нам надо подставить в запрос какую-либо переменную, вместо неё надо поставить знак вопроса. А саму переменную передать после.
Таким образом мы будем гарантированы от любых ошибок и неприятностей, поскольку РНР сам обработает за нас все переменные и сделает это правильно.
Спец-символы HTML
Я думаю, что внимательный читатель уже уловил идею: HTML вообще никакого отношения к БД не имеет. Ни малейшего. Это абсолютно разные вещи. То есть пользователю РНР никогда не должна приходить в голову идея использовать функцию, в которой встречается слово «HTML» для какой-либо работы с БД, а при работе с HTML — функцию, в которой встречается слово «mysql».
Функции для работы с HTML следует применять для работы с HTML.
То есть, если мы собираемся выводить HTML текст в HTML, то мы его должны выводить как есть.
Но если мы собираемся выводить в HTML текст, который не является HTML, мы должны отформатировать его так, чтобы он нам случайно не попортил верстку. Обычно для этого используется функция htmlspecialchars()
Кодировка
Если какой-либо символ сохраняется в виде знака вопроса, то это не проблема HTML кодирования, а проблема кодировки, которая попросту не поддерживает данный символ. Чтобы БД могла сохранять символы типа ⇔ , у нее должна быть кодировка utf8mb4 . А также РНР скрипт, устанавливая соединение с базой, должен выставлять кодировку этого соединения в utf8mb4 . При этом отображая пользователю форму, должен выдавать НТТР заголовк Content-type с кодировкой UTF-8 .
Правильный способ хранения текста и HTML-кода в базе MySQL?
Каким образом необходимо обрабатывать текст и html-код для записи в базу MySQL? Какая схема?
Перерыл интернет, везде совет для записи в базу использовать mysql_real_escape_string(), и больше вроде ничего не нужно. Но как быть со спец-мисволами html? К примеру «⇔» при вставке в форму отображается как символ, а не как html-код сивола. Соответственно при записи в базу, он превращается в «?»
Как я понимаю необходимо обрабатывать текст вот так перед вставкой:
Соответственно при выводе из базы на отображение необходимо обрабатывать текст вот так:
$inputTex = html_entity_decode($inputTex);
Такой алгоритм правильный или надо делать как-то по-другому?
- Вопрос задан более трёх лет назад
- 17396 просмотров
- Вконтакте
Ответ на вопрос из заголовка:
Никак особенно не хранить. Хранить абсолютно так же, как и любые данные, — как есть. То есть, НИКАК их не модифицируя для хранения.
Решение конкретно твоей проблемы:
mysql_set_charset(‘utf8’); после коннекта
+
плюс таблицы должны иметь кодировку utf8
Подробнее: phpfaq.ru/charset
Это информация устарела и не соответствует действительности.
Единственно правильным вариантом добавления данных в запрос являются подготовленные выражения.
Неправильно понимаешь.
Перед вставкой текст обрабатывать не надо вообще никак.
Для корректной работы SQL, как я уже писал выше, должны использоваться подготовленные выражения.
HTML же к SQL не имеет ни малейшего отношения. и никакая HTML функция, разумеется, при сохранении в БД использоваться не должна.
Как записать в Бд html код
Не могу внести html код в базу данных, какое есть решение?
Рекомендуем хостинг TIMEWEB
Подписчики
А какие ошибки выдаёт при попытке внесения? Может не совсем правильный тип данных выбран для поля, в котором должен храниться html код?
Строка для внесения содержит кавычки, может быть по этому?
ммммм. Тогда проверить нужно, удалив кавычки из строки. Вообще, я не думаю, что проблема может быть в кавычках, если это спарсенный текста. А какой тип базы данных? SQLite?
MySql использую, в OpenServere есть phpMyAdmin, туда и сохраняю
Без кавычек все работает отлично. Добавляю тестовый текст, все вносится.
Но проблема же с добавлением из под Qt? Правильно понимаю?
Происходит парсинг страницы и запись кода в Бд. Может есть метод класса exec который делает учет кавычек?
У QString есть метод toHtmlEscaped()
Комментарии
Timeweb
Позвольте мне порекомендовать вам отличный хостинг, на котором расположен EVILEG.
В течение многих лет Timeweb доказывает свою стабильность.
Для проектов на Django рекомендую VDS хостинг
Поделиться в социальных сетях
Donate
Проект EVILEG перешёл на некоммерческую основу и будет развиваться исключительно на энтузиазме создателя сайта, энтузиазме пользователей, пожертвованиях и реферальной системе хостинга
Как сохранить HTML в базу данных и получить его правильно
Обучение безопасности в эти дни:)
Мне нужно разрешить пользователям вводить текст в форме и разрешать им некоторые теги HTML: полужирный, курсив, список и т. Д., А также запрещать им добавлять опасный код JavaScript.
Поэтому я использовал эту реализацию белого списка для очистки HTML.
Но я все еще не понимаю, как сохранить и правильно отобразить его.
Итак, вот что я сделал:
Модель:
[HttpPost, ActionName("Create")] [ValidateAntiForgeryToken] public ActionResult Create(Post model) < // Decode model.Data as it is Encoded after post string decodedString = HttpUtility.HtmlDecode(model.Data); // Clean HTML string sanitizedHtmlText = HtmlUtility.SanitizeHtml(decodedString); string encoded = HttpUtility.HtmlEncode(sanitizedHtmlText);
@using (Html.BeginForm("Create", "Home", FormMethod.Post)) < @Html.AntiForgeryToken() @Html.TextAreaFor(a=>a.Data) >
Поэтому, когда я публикую форму, я вижу:
Стало
< Я думаю, что мне нужно сначала расшифровать его:
Simple whitelisttest:
- t1
- t2
Image:

Затем я очищаю его от белого списка и получаю очищенный HTML:
1) Должен ли я сохранить это в базе данных?
2) Или мне нужно закодировать этот результат и затем сохранить его в базе данных (закодировано ниже)?
<p>Simple <em><strong>whitelist</strong> </em>test:</p> <ul> <li>t1</li> <li>t2</li> </ul> <p>Image:</p> <p>
Здесь я запутался, если бы поставил это на вид так:
<p>Simple <em><strong>whitelist</strong> </em>test:</p> <ul> <li>t1</li> <li>t2</li> </ul> <p>Image:</p> <p>
Так что же делать, чтобы правильно отобразить этот HTML-код (жирный шрифт, список и т. Д.)?
2 ответа
Практическое правило следующее:
- Храните в своей базе данных RAW HTML без каких-либо кодировок или дезинфекций. Серверу SQL не важно, храните ли вы какую-либо строку, содержащую код XSS.
- При отображении этого вывода на странице убедитесь, что он очищен.
[HttpPost, ActionName("Create")] [ValidateAntiForgeryToken] public ActionResult Create(Post model) < // store model.Data directly in your database without any cleaning or sanitizing >
@Html.Raw(HtmlUtility.SanitizeHtml(Model.Data))
Обратите внимание, как я использовал здесь помощник Html.Raw, чтобы гарантировать, что вы не получите двойной HTML-кодированный вывод. HtmlUtility.SanitizeHtml Функция уже должна позаботиться о санации значения и вернуть безопасную строку, которую вы могли бы отобразить в своем представлении, и она не будет в дальнейшем кодироваться. Если с другой стороны вы использовали @HtmlUtility.SanitizeHtml(Model.Data) тогда @ Функция бритвы будет HTML кодировать результат SanitizeHtml функция, которая может быть не то, что вы ищете.