Обезопасить админку

Spear

почемучка
Обезопасить админку

Здравствуйте, у меня такой (скорее более теоритический) вопрос:
нужно открыть доступ в админку (к некоторым её частям) пользовтаелям, с правами модератора. (будут пистаь новости, например)
Мне нужно обезопасить ввод данных по максимуму.
Насколько я понимаю - единственное что может случиться это XSS атака.

Будет ли достаточно следующих действий:
сначала делаем strip_tags вводимого текста (так как юзанье хтмла напрямую нужно запретить),
а посте использование такого кода для преобразования BB тегов (в частности хотел бы узнать у профи - насколько нижеприведенный код безопасен. Может быть есть более удачные опен-сорц коды?):

PHP:
/* 
    Функция форматирования BB-тегов 
    */ 
     
    function BB($in){ 
         
    //вырезамем строку непробельных символов, чья длинна более 200 символов 
    $in = preg_replace("#(\w{200,})#", '<span class="context">Вырезано роботом</span>',$in); 
     
    // текстовое форматирование 
    $in  = preg_replace("#\\[B\\](.+?)\\[/B\\]#ims", "<strong>$1</strong>", $in); 
    $in  = preg_replace("#\\[S\\](.+?)\\[/S\\]#ims", "<small>$1</small>", $in); 
    $in  = preg_replace("#\\[HR\\]#ims", "<hr class=\"hr\" />", $in); 
    $in = preg_replace("#-{3,}#", "<hr class=\"hr\" />", $in); 
    $in  = preg_replace("#\\[I\\](.+?)\\[/I\\]#ims", "<em>$1</em>", $in); 
    $in  = preg_replace("#\\[U\\](.+?)\\[/U\\]#ims", "<span class=\"underline\">$1</span>", $in); 
    $in  = preg_replace("#\\[K\\](.+?)\\[/K\\]#ims", "<span class=\"context\">$1</span>", $in); 
    $in  = preg_replace("#\\[C\\](.+?)\\[/C\\]#ims", "</p><blockquote class=\"cite\"><em>$1</em></blockquote><p>", $in); 

    // замена URL с якорем ( [URL=path]anhor[/URL*] ) 
    $in  = preg_replace( 
    "#\\[URL=(.+?)\\](.+?)\\[/URL\\]#ixsm", 
    "<a href=\"$1\">$2</a>", $in); 
     
    // замена простых URL ( [URL]path[/URL*] ) 
    $in  = preg_replace( 
    "#\\[URL\\](.+?)\\[/URL\\]#ixsm", 
    "<a href=\"$1\">$1</a>", $in); 
     
    // тире 
    $in = str_replace("--", "&mdash;", $in); 
     
    // замена EMAIL с якорем ( [EMAIL=email_adress]anhor[/EMAIL*] ) 
    $in  = preg_replace( 
    "#\\[EMAIL=(.+?)\\](.+?)\\[/EMAIL\\]#ixsm", 
    "<a href=\"mailto:$1\">$2</a>", $in); 
     
    // замена простых EMAIL ( [EMAIL]email_adress[/EMAIL*] ) 
    $in  = preg_replace( 
    "#\\[EMAIL\\](.+?)\\[/EMAIL\\]#ixsm", 
    "<a href=\"mailto:$1\">$1</a>", $in); 
     
    //-------------------------------------------------------------------- 
    // Замена тегов изображений с align-аттрибутами 
    // Если найдено выражение вида [IMG SRC=path/to/image.gif RIGHT] 
    // то оно заменяется на тег img, с соответствующим float и уникальным id с префиксом uniqImg_ 
    // если атрибут float не указан, то по умолчанию используется LEFT 
    //-------------------------------------------------------------------- 
    if(preg_match_all("#\\[IMG SRC=http://([^\s<>]+?)(?: (LEFT|RIGHT))?\\]#im", $in, $matches)){ 
        for($i=0; $i<count($matches[1]); $i++){ 
        if(empty($matches[2][$i]))    $matches[2][$i] = "left"; 
        $float = strtolower($matches[2][$i]); 
        $path = htmlspecialchars($matches[1][$i], ENT_QUOTES); 
            $in = str_replace($matches[0][$i], '<a href="http://'.$path.'"><img style="float:'.$float.'" class="uniqImg" src="http://'.$path.'" alt="Изображение находится по адресу '.$path.'" id="'.uniqid("uniqImg_").'" /></a>', $in); 
        } 
    } 
    //-------------------------------------------------------------------- 
    // Замена простых тегов изображений ( [IMG]path_to_image[/IMG ] ) 
    //-------------------------------------------------------------------- 
    if(preg_match_all("#\\[IMG\\](.+?)\\[/IMG\\]#ixm", $in, $matches)){ 
        for($i=0; $i<count($matches[1]); $i++){ 
            $path = htmlspecialchars($matches[1][$i], ENT_QUOTES); 
            $in = str_replace($matches[0][$i], '</p><div style="clear:both"><a href="'.$path.'"><img class="uniqImg" src="'.$path.'" alt="Изображение находится по адресу '.$path.'" id="'.uniqid("uniqImg_").'" /></a></div><p>', $in); 
        } 
    } 
     
    return $in; 
    }// end BB
Защитит ли этот код от вставки сниффера того же античата? (вызываемого как картинку..)
 

jdoe

Новичок
PHP:
[email]asd" style=background:url(javascript:alert("gotcha")) [/email]
-~{}~ 21.09.05 23:31:

javascript без пробела
 

konstantin_18

Guest
Интересно, а зачем разделять обработку одного и того же, только по-разному?
Я насчет рисунков. Сделай [IMG RIGHT]http://path/to/image.ext[/IMG]
То же самое про емейл и URL. Можно вообще поледние 2 объединить, если форматирование одинаковое.

Я не крутой спец по защите, но ты сам говорил про XSS атаку. Что мешает это сделать, если поставить например адрес:
http://cool.hacker.ru/script.sh в image....

Понимаешь, такая проверка защитит, аЯ не крутой спец по защите, но ты сам говорил про XSS атаку. Что мешает это сделать, если поставить например адрес:
http://cool.hacker.ru/script.sh в image....

А как ты файл аплоадишь на сервер? или у тебя все с других сайтов открывается?
 

Лисю

Guest
О! Мой кодик всплыл :)

Интересно, а зачем разделять обработку одного и того же, только по-разному?
затем, что
1. простые теги IMG писались раньше
2. они отличаются форматированием.
В первом случае по стандарту XHTML float указывается либо право, либо лево, во втором - clear both.

Потом, этот код форматирования BB-тегов и к безопасности никакого отношения не имеет - ты сам должен правильно обрабатывать записи из БД. Единственное, что могу сказать, у меня этот код вызывается ПОСЛЕ обработки текста функцией htmlspecialchars.

кстати, что такое XSS атака?

-~{}~ 23.09.05 13:30:

Кстати, для картинок есть у меня полезная функция JS, которая при onload уменьшает их размер визуально.

PHP:
//Функция возвращает читабельную строку - размер числа i в байтах, Кбайтах или Мбайтах
//Используется в функциях: ereg_uniqImg
function get_size_string(i){
	if(i<1024)	return i + " байт";
	else if(i>=1024 && i<=1024*1024)	return Math.round(i/1024) + " Кбайт";
	else if(i>=1024*1024)	return (i/1024/1024).toFixed(2) + " Мбайт";
}
//Функция вызывается после полной загрузки страницы
//Функция проходит по массиву изображений документа, выделяет изображения с id=uniqImg_([a-z0-9])+,
//изображения, что были вставлены в документ пользователем,
//а после этого уменьшает их ширину, если она больше size пикселов
//Высоту не вычисляем, т.к. все современные броузеры пропорционально уменьшают высоту с щириной
//ВЗАИМОДЕЙСТВУЮЩАЯ ФУНКЦИЯ: get_size_string
function ereg_uniqImg(size){
var re = new RegExp("uniqImg_([a-z0-9])+","i");
	for(i=0; i<document.images.length; i++){
		var curId = document.images[i].id;
		//Это изображение подходит - оно вставлено пользователем
		if(curId.match(re)){
		var l = document.getElementById(curId);
		l.alt = l.alt + " (" + get_size_string(l.fileSize) + ")";
			if(l.width>size)
				l.width = l.width-(l.width-size);
		}
	}
}
 
Сверху