$_GET защита от взлома?

Тема в разделе "Как сделать...", создана пользователем sunyang, 2 апр 2012.

  1. sunyang

    sunyang

    Регистр.:
    25 апр 2009
    Сообщения:
    444
    Симпатии:
    30
    Хочу сделать безопасную выгрузку из базы данных определенной категории через $_GET['category']
    есть таблица со значением категории.
    вытаскиваю данные:


    PHP:
    if(!empty($_GET['category']) and $_GET['category'] == 5) {
     
    $result mysql_query("SELECT * FROM `poster` WHERE `category` = 5");
     
    }

    можно как-то передать скрипту помимо category еще переменную
    типа:
    PHP:
    сайт.ru\?category=5&hacking=вредоносный_код
    или в самой переменной category накодить
    ??

    наверное нужно проверить:


    PHP:
    $cat trim($_GET['category'] );
    $cat stripslashes$_GET['category'] );
    $cat htmlspecialchars$_GET['category'] );
     
    $reg"[0-9]";
    if (!
    preg_match($reg$cat )) {echo "Нас пытались хакнуть!";}
     
    else { 
    //выгружаем из базы } 
    ??
     
  2. latteo

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.401
    Симпатии:
    1.182
    Нет вредоностный код не дойдет до базы данных для твоего кода

    Если хочешь чтобы дошел пиши :
    PHP:
    $result mysql_query("SELECT * FROM `poster` WHERE `category` =".$_GET['category']);  
    :)
     
  3. stealthdebuger

    stealthdebuger Механик

    Administrator
    Регистр.:
    25 авг 2008
    Сообщения:
    624
    Симпатии:
    1.379
    фильтрация, фильтрация и еще раз фильтрация...
    PHP:
    if(intval($_GET['category']) > 0)
    {
    $result mysql_query("SELECT * FROM `poster` WHERE `category` = ".num($_GET['category']));
    }
     
    function 
    num($q2)
    {
        
    preg_match_all("#([0-9]+)#i"$q2$q2);
        
    $q2 implode(''$q2[1]);
        return isset(
    $q2)?$q2:0;
    }
    и пусть ломают сколько терпения хватит...
     
    latteo нравится это.
  4. o_nix

    o_nix

    Регистр.:
    7 ноя 2007
    Сообщения:
    1.073
    Симпатии:
    1.037
    stealthdebuger а зачем функцию изобретать ??
    можно ведь сделать проще
    PHP:
    $result mysql_query("SELECT * FROM `poster` WHERE `category` = ".(int)$_GET['category']);
    ничего кроме числа никогда в mysql не отправится, разве нет ??
     
  5. trooll

    trooll PHP кодер

    Регистр.:
    22 дек 2008
    Сообщения:
    503
    Симпатии:
    116
    При сортировках во многих движках магазинов (по большинству случаев самопальных движках) передаются данные в виде строки.

    А так ты прав правильный тон работы с базой в данной постановки задачи, передавать из внешки только целые числа, исключение здесь может быть только выборка по нескольким категориям но тогда однозначно надо делать предварительную обработку (а в месте с ней можно и сделать обработку в ходящих данных), хотя бы для того что бы запрос к базе построить.
     
  6. shaen

    shaen Постоялец

    Регистр.:
    23 июн 2011
    Сообщения:
    51
    Симпатии:
    9
    Посмотри эту библиотеку

    http://www.bioinformatics.org/phplabware/internal_utilities/htmLawed/

    или попроще

    PHP:
    class Security {
       
        
    /**
        * List of never allowed strings
        *
        * @var array
        */
        
    protected static $never_allowed = array(
            
    'document.cookie'  => '[removed]',
            
    'document.write'    => '[removed]',
            
    '.parentNode'      => '[removed]',
            
    '.innerHTML'        => '[removed]',
            
    'window.location'  => '[removed]',
            
    '-moz-binding'      => '[removed]',
            
    '<!--'              => '&lt;!--',
            
    '-->'              => '--&gt;',
            
    '<![CDATA['        => '&lt;![CDATA[',
            
    '<comment>'        => '&lt;comment&gt;'
        
    );
       
        
    /**
        * List of never allowed regex replacement
        *
        * @var array
        */
        
    protected static $never_allowed_regex = array(
            
    "javascript\s*:"    => '[removed]',
            
    "expression\s*(\(|&\#40;)" => '[removed]'// CSS and IE
            
    "vbscript\s*:"      => '[removed]'// IE, surprise!
            
    "Redirect\s+302"    => '[removed]'
        
    );
     
     
        
    /**
        * Cleans the global $_GET, $_POST and $_COOKIE arrays
        *
        * @return void
        */
        
    public static function clean_input()
        {
            
    $_GET  = static::clean($_GET);
            
    $_POST    = static::clean($_POST);
            
    $_COOKIE = static::clean($_COOKIE);
        }
       
       
        
    /**
        * Recursively clean an input variable.
        *
        * @param  mixed $value
        * @return mixed
        */
        
    public static function clean($value)
        {
            if (
    is_array($value) or is_object($value))
            {
                foreach (
    $value as $key => $val)
                {
                    
    $value[$key] = static::clean($val);   
                }
            }
            elseif (
    is_string($value))
            {
                if (
    strpos($value"\r") !== false)
                {
                    
    $value str_replace(array("\r\n""\r"), "\n"$value);
                }
            }
           
            return 
    $value;
        }
       
       
        
    /**
        * XSS Clean
        *
        * Sanitizes data so that Cross Site Scripting Hacks can be
        * prevented.  This function does a fair amount of work but
        * it is extremely thorough, designed to prevent even the
        * most obscure XSS attempts.  Nothing is ever 100% foolproof,
        * of course, but I haven't been able to get anything passed
        * the filter.
        *
        * @param    mixed string|array
        * @return    mixed
        */
        
    public static function xss_clean($value)
        {
            
    // Is the value an array?
            
    if (is_array($value))
            {
                while (list(
    $key) = each($value))
                {
                    
    $value[$key] = static::xss_clean($value[$key]);
                }
           
                return 
    $value;
            }       
           
            
    $value preg_replace('#(alert|cmd|passthru|eval|exec|expression|system|fopen|fsockopen|file|file_get_contents|readfile|unlink)(\s*)\((.*?)\)#si'"\\1\\2&#40;\\3&#41;"$value);
     
            foreach (static::
    $never_allowed as $key => $val)
            {
                
    $value str_replace($key$val$value);
            }
     
            foreach (static::
    $never_allowed_regex as $key => $val)
            {
                
    $value preg_replace("#".$key."#ui"$val$value);
            }
     
            return 
    $value;
        }
    }
     
    latteo нравится это.
  7. SimonSmith

    SimonSmith Постоялец

    Регистр.:
    25 сен 2008
    Сообщения:
    147
    Симпатии:
    32
    shaen извращенец :)
    я тоже не мало такого искал как бы защитить себя...вывод: перешел на mysqli prepare и меньше головной боли
     
  8. DrakonHaSh

    DrakonHaSh

    Регистр.:
    29 июн 2010
    Сообщения:
    358
    Симпатии:
    122
    а чем "x=' " . mysql_real_escape_string($param) . " ' " для строк [т.е. обрамление параметра кавычками и прогон параметра через mysql_real_escape_string]
    и int для чисел
    (касательно sql)
    плох ?
     
  9. stealthdebuger

    stealthdebuger Механик

    Administrator
    Регистр.:
    25 авг 2008
    Сообщения:
    624
    Симпатии:
    1.379
    Конечно не отправится, только не стоит забывать о нюансах...
    PHP:
    <?
    var_dump((int)'2147483648');
    ?>
     
  10. o_nix

    o_nix

    Регистр.:
    7 ноя 2007
    Сообщения:
    1.073
    Симпатии:
    1.037
    имеется ввиду что размерность int превышена ???

    честно не видел не одной задачи web php которая бы требовала более двух миллиардов идентификаторов :D