Функция обработки входящих переменных (значений)

lamo

Постоялец
Регистрация
1 Июл 2008
Сообщения
51
Реакции
4
Поделитесь своим опытом :)
Допустим есть форма которая состоит из n-количества полей где подразумевается ввод как текстовой информации, так и числовой. Как вы обрабатываете значения передаваемые по POST?
Я написал себе функцию prepare_string($st), но вот что внести туда, кроме как htmlspecialchars, strip_tags, nl2br (что бы <br> проставлялся) что бы максимально обезопасить себя от различных атак? Или же этих 2-х функций достаточно.

ЗЫ: извините если не в ту тему, просто в для PHP-форума у меня не хватает сообщений.

Заранее спасибо!
 
PHP:
function clean($var) {
  return htmlspecialchars(get_magic_quotes_gpc() ? stripslashes($var) : $var, ENT_QUOTES);
}

PHP:
// Clean out the content of one user note for printing to HTML
function clean_note($text)
{
    // Highlight PHP source
    $text = highlight_php(trim($text), TRUE);

    // Turn urls into links
    $text = preg_replace(
        '!((mailto:|(http|ftp|nntp|news):\/\/).*?)(\s|<|\)|"|\\\\|\'|$)!',
        '<a href="\1" rel="nofollow" target="_blank">\1</a>\4',
        $text
    );
    
    return $text;
}
Источник - Для просмотра ссылки Войди или Зарегистрируйся
 
Получается рогонять переменную сначала по
clean($var)
потом
clean_note($text) ?

Можно еще пояснить что делает первая и вторая функция, по первой - не особо понял, вторая - ты сюда запостил но не все, есть еще там функция highlight_php, которая в свою очередь что то там еще инклудит.... что то твой вариант обработки переменных замудрен получился - наверняка велосипед где то рядом и проще!
 
В своих разработках для первичной обработки входящих переменных я использую функцию
Код:
function req_var($var_name, $default)
{
	if ( isset($_REQUEST[$var_name]) )
	{
		$var = $_REQUEST[$var_name];
		$type = gettype($default);
		settype($var, $type);
		if($type == 'string' && get_magic_quotes_gpc())
		{
			$var = stripslashes($var);
		}
	}
	else
	{
		$var = $default;
	}

	return $var;
}
От всего она, безусловно, не спасает, но жизнь значительно упрощает.
 
В своих разработках для первичной обработки входящих переменных я использую функцию
Код:
function req_var($var_name, $default)
{
	if ( isset($_REQUEST[$var_name]) )
	{
		$var = $_REQUEST[$var_name];
		$type = gettype($default);
		settype($var, $type);
		if($type == 'string' && get_magic_quotes_gpc())
		{
			$var = stripslashes($var);
		}
	}
	else
	{
		$var = $default;
	}

	return $var;
}
От всего она, безусловно, не спасает, но жизнь значительно упрощает.

она вобще ни от чего не спасет - это хак, для того что если включен мйджик квотес - то убирать двйоные слеши чтобы в базу не сохранялось ввиде \\' к безопасности эта функция не имеет никакого отношения
 
В своих разработках для первичной обработки входящих переменных я использую функцию
Код:
function req_var($var_name, $default)
{
	if ( isset($_REQUEST[$var_name]) )
	{
		$var = $_REQUEST[$var_name];
		$type = gettype($default);
		settype($var, $type);
		if($type == 'string' && get_magic_quotes_gpc())
		{
			$var = stripslashes($var);
		}
	}
	else
	{
		$var = $default;
	}

	return $var;
}
От всего она, безусловно, не спасает, но жизнь значительно упрощает.
Она вообще ни от чего не спасает просто убирает слеши (stripslashes) ;)
 
Вы не правы. Как минимум, она спасает от того, что входящие данные будут не того типа, который требовался + позволяет сразу установить значение по умолчанию, если переменная не задана.

Чтобы не буть голословным, пример атаки, от которой она защитит:

Дырявый код:
Код:
$cat_id = $_GET['cat'];
$sql = "SELECT * FROM cms_category WHERE cat_id = $cat_id";
mysql_query($sql);
Запрос по типу
Код:
index.php?cat=1 UNION SELECT 0,0,0,user_name,user_password FROM cat_users
с легкостью отдаст нам всех пользователей.

А вот если написать
Код:
$cat_id = req_var('cat', 0);
$sql = "SELECT * FROM cms_category WHERE cat_id = $cat_id";
mysql_query($sql)
то такая атака не пройдет. Так что еще раз повторю, что вы не правы.
 
Она вообще ни от чего не спасает просто убирает слеши (stripslashes) ;)

PHP:
$var = $_REQUEST[$var_name];
$type = gettype($default);
[b]settype($var, $type);[/b]
if($type == 'string' && get_magic_quotes_gpc())
{
	$var = stripslashes($var);
}
всеж в отдельных случаях она сработает. все что не Integer она конвертирует в Integer. поэтому в данном случае да спасет. если только ИНТ должен быть на выходе - если будет строка передаваться изначально и тип строки данных будет стоять - то она уже не поможет.

т.е. если у тебя на сайте где есть не cat_id = 1 а там допустим product=cars - то вместо cars можно подставлять смело любой запрос и делать выборку из базы.
 
все таки никто не хочет поделиться функцией, где учтено все?
 
тебе нужно самому писать - под свою задачу. что именно ты хочешь сохранять в БД какие данные что нужно экранировать. для примера можешь взять файл с formatting.php находится он в архиве с вордпрессом скачай с официального сайта, в папке wp-includes - в нем найдешь кучу фунций по очистке текста - перед каждой функцией - стоит комментарий - что именно она делает и отчего очищает. ну и сгруппируй все это в одну как тебе нужно.
 
  • Нравится
Реакции: lamo
Назад
Сверху