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

Тема в разделе "PHP", создана пользователем lamo, 17 фев 2009.

Модераторы: latteo
  1. lamo

    lamo Постоялец

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

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

    Заранее спасибо!
     
  2. ewg777

    ewg777

    Регистр.:
    6 авг 2007
    Сообщения:
    763
    Симпатии:
    321
    PHP:
    function clean($var) {
      return 
    htmlspecialchars(get_magic_quotes_gpc() ? stripslashes($var) : $varENT_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;
    }
    Источник - Перейти по ссылке
     
  3. lamo

    lamo Постоялец

    Регистр.:
    1 июл 2008
    Сообщения:
    51
    Симпатии:
    4
    Получается рогонять переменную сначала по
    clean($var)
    потом
    clean_note($text) ?

    Можно еще пояснить что делает первая и вторая функция, по первой - не особо понял, вторая - ты сюда запостил но не все, есть еще там функция highlight_php, которая в свою очередь что то там еще инклудит.... что то твой вариант обработки переменных замудрен получился - наверняка велосипед где то рядом и проще!
     
  4. Alek$

    Alek$ Постоялец

    Регистр.:
    24 сен 2008
    Сообщения:
    63
    Симпатии:
    25
    В своих разработках для первичной обработки входящих переменных я использую функцию
    Код:
    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;
    }
    От всего она, безусловно, не спасает, но жизнь значительно упрощает.
     
  5. upandhigh

    upandhigh

    Регистр.:
    11 фев 2009
    Сообщения:
    235
    Симпатии:
    89
    она вобще ни от чего не спасет - это хак, для того что если включен мйджик квотес - то убирать двйоные слеши чтобы в базу не сохранялось ввиде \\' к безопасности эта функция не имеет никакого отношения
     
  6. ewg777

    ewg777

    Регистр.:
    6 авг 2007
    Сообщения:
    763
    Симпатии:
    321
    Она вообще ни от чего не спасает просто убирает слеши (stripslashes) ;)
     
  7. Alek$

    Alek$ Постоялец

    Регистр.:
    24 сен 2008
    Сообщения:
    63
    Симпатии:
    25
    Вы не правы. Как минимум, она спасает от того, что входящие данные будут не того типа, который требовался + позволяет сразу установить значение по умолчанию, если переменная не задана.

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

    Дырявый код:
    Код:
    $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)
    то такая атака не пройдет. Так что еще раз повторю, что вы не правы.
     
  8. upandhigh

    upandhigh

    Регистр.:
    11 фев 2009
    Сообщения:
    235
    Симпатии:
    89
    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 можно подставлять смело любой запрос и делать выборку из базы.
     
  9. lamo

    lamo Постоялец

    Регистр.:
    1 июл 2008
    Сообщения:
    51
    Симпатии:
    4
    все таки никто не хочет поделиться функцией, где учтено все?
     
  10. upandhigh

    upandhigh

    Регистр.:
    11 фев 2009
    Сообщения:
    235
    Симпатии:
    89
    тебе нужно самому писать - под свою задачу. что именно ты хочешь сохранять в БД какие данные что нужно экранировать. для примера можешь взять файл с formatting.php находится он в архиве с вордпрессом скачай с официального сайта, в папке wp-includes - в нем найдешь кучу фунций по очистке текста - перед каждой функцией - стоит комментарий - что именно она делает и отчего очищает. ну и сгруппируй все это в одну как тебе нужно.
     
    lamo нравится это.