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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Обработка форм, безопасность php

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
dmaw
Отправлено: 18 Сентября, 2016 - 11:07:13
Post Id



Частый гость


Покинул форум
Сообщений всего: 227
Дата рег-ции: Сент. 2009  
Откуда: Беларусь, Витебск


Помог: 0 раз(а)




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

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

Наверное глупо давать разрешение юзеру менять цвета, шрифты, создавать таблицы и другие плюшли из визуального редактора. Но всё же интересно, насколько это возможно позволить.
(Добавление)
По моему мнению самым оптимальным вариантом будет сделать белый список разрешенных тегов с удалением всех атрибутов. Вопрос только как всё это подружить с тегами <a> <img>
 
 Top
Ch_chov
Отправлено: 18 Сентября, 2016 - 15:35:10
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2121
Дата рег-ции: Июль 2008  
Откуда: из города


Помог: 90 раз(а)




Есть два подхода:
  1. Фильтровать контент при вводе (перед сохранением в БД)
  2. Фильтровать контент при выводе (в БД контет хранится как есть)
Для фильтрации тегов по белому списку можно использовать strip_tags (см. второй параметр). С аттрибутами сложнее. Нужно пропускать контент через DOM парсер, либо использовать регулярные выражения. CKEditor нужно будет настроить так чтобы, он показывал только те кнопки и настройки, которые не будут вырезаться.

Можно также взять какой нибудь готовый фильтр, например purifier.

(Отредактировано автором: 18 Сентября, 2016 - 15:38:55)

 
 Top
dmaw
Отправлено: 18 Сентября, 2016 - 23:57:32
Post Id



Частый гость


Покинул форум
Сообщений всего: 227
Дата рег-ции: Сент. 2009  
Откуда: Беларусь, Витебск


Помог: 0 раз(а)




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>
Возможно в этом подходе есть подводные камни.

(Отредактировано автором: 19 Сентября, 2016 - 00:00:38)

 
 Top
Ch_chov
Отправлено: 19 Сентября, 2016 - 06:17:16
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2121
Дата рег-ции: Июль 2008  
Откуда: из города


Помог: 90 раз(а)




Цитата:
Нужно решить вопрос с обработкой атрибутов для <a> и <img>

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

Ещё один фильтр для примера.
https://api.drupal.org/api/drupal/core!lib!Drupal!Component!Utility!Xss.php/function/Xss%3A%3Afilter/8.2.x

(Отредактировано автором: 19 Сентября, 2016 - 06:19:11)

 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB