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

sunyang

Мастер
Регистрация
25 Апр 2009
Сообщения
440
Реакции
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 { //выгружаем из базы }

??
 
Нет вредоностный код не дойдет до базы данных для твоего кода

Если хочешь чтобы дошел пиши :
PHP:
$result = mysql_query("SELECT * FROM `poster` WHERE `category` =".$_GET['category']);
:)
 
фильтрация, фильтрация и еще раз фильтрация...
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;
}

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

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

ничего кроме числа никогда в mysql не отправится, разве нет ??
При сортировках во многих движках магазинов (по большинству случаев самопальных движках) передаются данные в виде строки.

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

Для просмотра ссылки Войди или Зарегистрируйся

или попроще

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;
    }
}
 
shaen извращенец :)
я тоже не мало такого искал как бы защитить себя...вывод: перешел на mysqli prepare и меньше головной боли
 
а чем "x=' " . mysql_real_escape_string($param) . " ' " для строк [т.е. обрамление параметра кавычками и прогон параметра через mysql_real_escape_string]
и int для чисел
(касательно sql)
плох ?
 
stealthdebuger а зачем функцию изобретать ??
можно ведь сделать проще
PHP:
$result = mysql_query("SELECT * FROM `poster` WHERE `category` = ".(int)$_GET['category']);

ничего кроме числа никогда в mysql не отправится, разве нет ??

Конечно не отправится, только не стоит забывать о нюансах...
PHP:
<?
var_dump((int)'2147483648');
?>
 
имеется ввиду что размерность int превышена ???

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