|
|
|
| Здравствуйте.
Есть сайт на котором пользователи через визуализатор добавляют статьи. Естественно пользователям для оформления разрешено использовать только определенный набор тегов.
Думаете такая функция надежно защитит от 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
(15.04.2013 в 19:40)
| | Что-то игнорируют меня тут везде :)
Нашел одну уязвимость:
<? preg_match('#src="[A-z0-9_\.\/-]*"#',$attr,$src);
|
Можно сделать ссылку на картинку на стороннем ресурсе, а там уже вирусню какую-нибудь разместить.
Есть еще какие замечания? или может быть готовое решение? | |
|
|
|
|
|
|
|
для: tvv123456
(16.04.2013 в 20:15)
| | А зачем вы вообще разрешаете использовать реальные теги?
Вы же все что не разрешено рубите....
А если человеку нужно написать что-то, где используются символы < и > ?
Например проверьте вашу функцию на такой строке: Как видите тут она отображается правильно. А у вас?
Куда проще (и уже стало стандартом де-факто) использовать так называемые bb-коды.
Т.е. вы разрещаете использовать определенный набор тегов, но не в угловых скобках, а в квадратных. И в таком же виде сохраняете в базу.
Затем перед выводом прогоняете текст через htmlspecialchars() -это защищает вас от XSS, а затем заменяете все BB-коды на стандартные теги простым str_replace() или preg_replace(). | |
|
|
|
|
|
|
|
для: Sfinks
(23.04.2013 в 12:36)
| | Добавление статей производится через визуальных редактор Tiny mce, возможность использования BB-coda я в нем не нашел. А заставлять пользователя далекого от веба еще и текст выделять вручную(дописывая bb-cod), это мне не подходит.
И если добавлять статьи легально через соответствующую страницу личного кабинета сайта, то ваш пример с сравнениями чисел работает корректно. А те пользователи, которые обходят интерфейс сайта, да это и не пользователи вовсе | |
|
|
|