Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: очистка текста от лишних тегов
 
 автор: tvv123456   (15.04.2013 в 19:40)   письмо автору
 
 

Здравствуйте.
Есть сайт на котором пользователи через визуализатор добавляют статьи. Естественно пользователям для оформления разрешено использовать только определенный набор тегов.
Думаете такая функция надежно защитит от XSS:

<?
 
//Чистим текст от лишних тегов
   
function clearText($text)
    {
      
$strip "<strong>,<em>,<u>,<b>,<li>,<ul>,<ol>,<p>,<img>";
      
$text strip_tags($text,$strip);
      
preg_match_all("#<([A-z]+)\s(.*?)[/]{0,1}>#",$text,$result);
      
     foreach(
$result[0] as $key=>$value)
    {
       
$tag $result[1][$key];
       
$attr $result[2][$key];
      
preg_match('#src="[A-z0-9_\.\/-]*"#',$attr,$src);
      
preg_match('#width="[0-9]+"#',$attr,$width);
      
preg_match('#height="[0-9]+"#',$attr,$height);
      
preg_match('#style="[A-z-]+:[\s]{0,1}[A-z0-9-]+[;]{0,1}"#',$attr,$style);
      
$width = (empty($width[0]))?'':$width[0].' ';
      
$height = (empty($height))?'':$height[0].' ';
      
$style = (empty($style[0]))?'':$style[0].' ';
      
$src = (empty($src[0]))?'':$src[0].' ';
      
$img '<'.$tag.' '.$src.$width.$height.$style.(($tag=='img')?'/':'').'>';
      
$text str_replace($value,$img,$text);
      }
      
/*else{$text = preg_replace("#<([A-z]+)\s.*?>#","<\\1>",$text);}*/
      
return $text;
    }
$text clearText($_POST['text']);

если есть уязвимость дайте пример ее эксплуатации

  Ответить  
 
 автор: tvv123456   (16.04.2013 в 20:15)   письмо автору
 
   для: tvv123456   (15.04.2013 в 19:40)
 

Что-то игнорируют меня тут везде :)
Нашел одну уязвимость:
<? preg_match('#src="[A-z0-9_\.\/-]*"#',$attr,$src); 

Можно сделать ссылку на картинку на стороннем ресурсе, а там уже вирусню какую-нибудь разместить.

Есть еще какие замечания? или может быть готовое решение?

  Ответить  
 
 автор: Sfinks   (23.04.2013 в 12:36)   письмо автору
 
   для: tvv123456   (16.04.2013 в 20:15)
 

А зачем вы вообще разрешаете использовать реальные теги?
Вы же все что не разрешено рубите....
А если человеку нужно написать что-то, где используются символы < и > ?
Например проверьте вашу функцию на такой строке:
Если a<b, и b<с, то c>a
Как видите тут она отображается правильно. А у вас?

Куда проще (и уже стало стандартом де-факто) использовать так называемые bb-коды.
Т.е. вы разрещаете использовать определенный набор тегов, но не в угловых скобках, а в квадратных. И в таком же виде сохраняете в базу.
Затем перед выводом прогоняете текст через htmlspecialchars() -это защищает вас от XSS, а затем заменяете все BB-коды на стандартные теги простым str_replace() или preg_replace().

  Ответить  
 
 автор: tvv123456   (24.04.2013 в 13:06)   письмо автору
 
   для: Sfinks   (23.04.2013 в 12:36)
 

Добавление статей производится через визуальных редактор Tiny mce, возможность использования BB-coda я в нем не нашел. А заставлять пользователя далекого от веба еще и текст выделять вручную(дописывая bb-cod), это мне не подходит.
И если добавлять статьи легально через соответствующую страницу личного кабинета сайта, то ваш пример с сравнениями чисел работает корректно. А те пользователи, которые обходят интерфейс сайта, да это и не пользователи вовсе

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования