Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Обработка форм, безопасность php
Форумы портала PHP.SU » PHP » Программирование на PHP » Обработка форм, безопасность php

Страниц (1): [1]
 

1. dmaw - 18 Сентября, 2016 - 11:07:13 - перейти к сообщению
Добрый день!
Очередной раз сталкиваюсь с проблемой пользовательского ввода и хранения текстов в MySQL.
Задача: На сайте человек регистрируется, у него есть возможность написать текст в форме с визуальным редактором (ckeditor), этот текст будет выводиться на сайте как html. Нужно как-то грамотно обрабатывать и хранить эти тексты, чтобы не образовать дыру в сайте.

Экранирование кавычек и спецсимволов это хорошо, пока дело не доходить до атрибутов типа onmouseover="alert(document.cookie)" и других магических конструкций вроде <script src="http://....../trojan.js"></script>
Интересно кто как решает подобные задачи?

Наверное глупо давать разрешение юзеру менять цвета, шрифты, создавать таблицы и другие плюшли из визуального редактора. Но всё же интересно, насколько это возможно позволить.
(Добавление)
По моему мнению самым оптимальным вариантом будет сделать белый список разрешенных тегов с удалением всех атрибутов. Вопрос только как всё это подружить с тегами <a> <img>
2. Ch_chov - 18 Сентября, 2016 - 15:35:10 - перейти к сообщению
Есть два подхода:
  1. Фильтровать контент при вводе (перед сохранением в БД)
  2. Фильтровать контент при выводе (в БД контет хранится как есть)
Для фильтрации тегов по белому списку можно использовать strip_tags (см. второй параметр). С аттрибутами сложнее. Нужно пропускать контент через DOM парсер, либо использовать регулярные выражения. CKEditor нужно будет настроить так чтобы, он показывал только те кнопки и настройки, которые не будут вырезаться.

Можно также взять какой нибудь готовый фильтр, например purifier.
3. dmaw - 18 Сентября, 2016 - 23:57:32 - перейти к сообщению
Ch_chov, спасибо! Фильтр purifier сегодня уже попадался на глаза, слишком сложно там всё оказалось, я за простоту Улыбка

Склоняюсь к минимальным возможностям. Больше нравится вариант с регулярными выражениями.

Сейчас сохранение в базу сделал так:


Вывод на сайте планирую как-то так:
PHP:
скопировать код в буфер обмена
  1. $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>');
  2. $str = preg_replace("#(</?\w+)(?:\s(?:[^<>/]|/[^<>])*)?(/?>)#ui", '$1$2', $str); // удалить все атрибуты


Конечно каждый раз при выводе пропускать текст через функции я не буду, скорее всего будет второе текстовое поле в таблице.
Нужно решить вопрос с обработкой атрибутов для <a> и <img>
Возможно в этом подходе есть подводные камни.
4. Ch_chov - 19 Сентября, 2016 - 06:17:16 - перейти к сообщению
Цитата:
Нужно решить вопрос с обработкой атрибутов для <a> и <img>

Не забудьте про JavaScript protocol.

Ещё один фильтр для примера.
https://api[dot]drupal[dot]org/api/drupa[dot][dot][dot]A%3Afilter/8[dot]2[dot]x

 

Powered by ExBB FM 1.0 RC1