Защита от XSS и SQL инъекции

deepslam

Новичок
Защита от XSS и SQL инъекции

Добрый день!
Пожалуйста подскажите как защищаться от XSS , желательно готовое решение, я использую SafeHtml, но он глючный и автор уже про него забыл.
Также очень интересна "правильная" защита от инъекций, я делаю так:
Проверяю все возможные данные на eregi, где это возможно, также есть функция:
PHP:
function sql_quote( $value )
{
    if( get_magic_quotes_gpc() )
    {
          $value = stripslashes( $value );
    }
    //check if this function exists
    if( function_exists( "mysql_real_escape_string" ) )
    {
          $value = mysql_real_escape_string( $value );
    }
    //for PHP version < 4.3.0 use addslashes
    else
    {
          $value = addslashes( $value );
    }
    return $value;
}
очень не нравится то, что вследствии работы функции экранируются кавычки, пользователи у меня добавляют статьи и выглядит это не оч хорошо. Хотелось бы узнать, как можно этого избежать, magic_quotes_runtime ? Или еще как?

Заранее спасибо за ответы.
 

Фанат

oncle terrible
Команда форума
Сдаётся мне, что ты гонишь, мил человек.
Эта функция ничего лишнего не экранирует.
 

deepslam

Новичок
может и гоню, т.к. не совсем въехал в тему
Вот пример экранирования:
"Классы и toolkit\'s для разработки"

При добавлении было:
PHP:
define('XML_HTMLSAX3', $config["modules_path"]);
require_once($config["modules"]["htmlsax"]);
$safehtml =& new safehtml();
$_REQUEST=clearArrSql($_REQUEST);

function clearArrSql($arr) {
	foreach ($arr as $item) {
		if (is_array($item)) {
			$item=clearArrSql($item);
		} else {
			$item=sql_quote($item);
		}
	}
	return @$arr;
}

function sql_quote( $value )
{
    if( get_magic_quotes_gpc() )
    {
          $value = stripslashes( $value );
    }
    //check if this function exists
    if( function_exists( "mysql_real_escape_string" ) )
    {
          $value = mysql_real_escape_string( $value );
    }
    //for PHP version < 4.3.0 use addslashes
    else
    {
          $value = addslashes( $value );
    }
    return $value;
}

$title=strip_tags(@$_REQUEST["title"]);
 

Фанат

oncle terrible
Команда форума
эта функция - идиотизм.
идиотизм в смысле полного отсутствия в ней логики.

Объясняю:
называется функция словом "clear". то есть, служит для какой-то ОЧИСТКИ.

В то время, как для составления запросов никакая очистка НЕ НУЖНА. А нужно просто корректное приведение элементов запроса к синтаксису SQL.

"Очистка" и подготовка данных для составления запроса - это разные вещи. и делать их надо РАЗДЕЛЬНО. А не валя все в кучу.

-~{}~ 20.11.06 15:57:

Вот пример экранирования:
"Классы и toolkit\'s для разработки"
прекрасный пример. Что тебя не устраивает?
 

Фанат

oncle terrible
Команда форума
Marquis
не мог бы пояснить чуть подробнее свой глубокомысленный комментарий?
 

deepslam

Новичок
Так я и спрашиваю можно ли обойтись без знака "\"?
С числовыми данными понятно, там можно по eregi все сделать, но у меня текст люди добавляют и не хочется, чтобы на сайте заголовки выглядели так, как в примере.

Функция clearArrSql - экранирует все элементы переданного ей массива.

Фанат, а как делаешь ты в своих проектах?

Вот если у тебя пользователь например будет добавлять статью, ты как будешь данные проверять?

Может я что то неверно мыслю вообще...

-~{}~ 20.11.06 16:05:

Marquis
от XSS твоя функция не спасет....
 

Marquis

Новичок
На этапе добавления записи куда либо проводить валидацию данных дабы исключить подобную возможность. Ну или использовать псевдо теги для опять же исключения подобных возможностей.
 

Фанат

oncle terrible
Команда форума
Marquis
а ты не обратил, СЛУЧАЙНО, свой гениальный взор на код исходного сообщения? В котором эта функция ПРИСУТСТВУЕТ?!

-~{}~ 20.11.06 16:18:

а теперь исчез из этого топика.
и постарайся не попадаться мне на глаза в ближайшие пару дней.

-~{}~ 20.11.06 16:22:

deepslam
постарайся хорошо подумать, ответить мне.
В каком конкретно месте тебе мешает знак "\"
 

deepslam

Новичок
ок, вроде постарался
Смотри я привел тебе пример заголовка статьи , но есть еще и сам текст статьи, соответственно он проходит ту же фильтрацию.
Пусть у нас например есть текст:
Компания "Название компании" выпустило продукт под маркой "марка"
и после моей чудесной обработки получится:
Компания \"Название компании\" выпустило продукт под маркой \"марка\"
Происходит это, т.к.
php.net написал(а):
mysql_real_escape_string() вызывает библиотечную функцмю MySQL mysql_real_escape_string, которая добавляет обратную косую черту к следующим символам: \x00, \n, \r, \, ', " and \x1a.
А хочется, чтобы не было косой черты у пользователя, получается, что нужно делать обратной преобразование перед выводом на экран?

partizan
htmlspecialchars не поможет, т.к. мне нужно чтобы оставался именно html код..... а не его синонимы , т.е. "<" не заменялась на &lt; ...
 

partizan

Новичок
Автор оригинала: deepslam
partizan
htmlspecialchars не поможет, т.к. мне нужно чтобы оставался именно html код..... а не его синонимы , т.е. "<" не заменялась на &lt; ...
А для этого BBcode есть
 

deepslam

Новичок
partizan
мне именно html нужно проверять, т.к. пользователи добавляют html
это по раскрутке тема... там нельзя BBCode к сожалению
 

MadGreen

meninweb
Автор оригинала: deepslam
А хочется, чтобы не было косой черты у пользователя, получается, что нужно делать обратной преобразование перед выводом на экран?
а ты уверен что она будет выводится на экран?

-~{}~ 20.11.06 18:42:

точнее что из базы ты вытащишь экранированный текст
 

deepslam

Новичок
да, для этого есть класс safehtml, он работает, но иногда коверкает исходный html, автор на него забил, я спрашивал в одной из тем как поправить - никто не знает. Теперь вот соотв. спрашиваю какие есть еще классы для этого.
 

MadGreen

meninweb
что ДА? и для чего есть класс safehtml?
ты ответь на вопрос, если ты достаешь из базы текст в том виде в котором он хранится - он остается экранированным?
 
Сверху