Защита от SQL-enjection

Discussion in 'PHP' started by je0n, 3 Jan 2007.

  1. nerezus

    nerezus Banned

    Joined:
    12 Aug 2004
    Messages:
    3,191
    Likes Received:
    729
    Reputations:
    266
    Ну вы и норкоманы.... определенно начитались Фленова =)
    Я подобное Г только у него в книге видел =)

    Нормальный код(практически) в этой теме только у p-range. Остальные просто не понимают, что делают.
     
  2. nerezus

    nerezus Banned

    Joined:
    12 Aug 2004
    Messages:
    3,191
    Likes Received:
    729
    Reputations:
    266
    Вооооот: http://forum.antichat.ru/thread30641.html
     
  3. Chaak

    Chaak Elder - Старейшина

    Joined:
    1 Jun 2008
    Messages:
    1,059
    Likes Received:
    1,067
    Reputations:
    80
    Твой ерег оборвется на null - байте =\
    Лучше уж прегматч использовать
     
  4. .Slip

    .Slip Elder - Старейшина

    Joined:
    16 Jan 2006
    Messages:
    1,571
    Likes Received:
    977
    Reputations:
    783
    PHP:
    $blabla is_numeric($_REQUEST['blabla']) ? $_REQUEST['blabla'] : mysql_escape_string($_REQUEST['blabla']);
    Неужели ещё что то нужно?
     
  5. EXSlim

    EXSlim Elder - Старейшина

    Joined:
    9 Oct 2006
    Messages:
    73
    Likes Received:
    20
    Reputations:
    18
    Определенно да. is_numeric проверяет принадлежность числовому диапазону, включая флоаты. Тоисть попади переменная вторым аргументом в mysql_array, получим раскрытие пути

    Кстати, mysql_escape_string, как и все ф-ции mysql_* юзают апи mysql сервера, тоисть требуют аккаунт и подключение к субд. Вместо этого нашел офигенную штуку в zf
    PHP:
    protected function _quote($value)
        {
            if (
    is_int($value)) {
                return 
    $value;
            } elseif (
    is_float($value)) {
                return 
    sprintf('%F'$value);
            }
            return 
    "'" addcslashes($value"\000\n\r\\'\"\032") . "'";
        } 
    З. Ы. Гуглите о prepared statement. Все уже придумано до вас
     
    #25 EXSlim, 26 Oct 2008
    Last edited: 26 Oct 2008
  6. .Slip

    .Slip Elder - Старейшина

    Joined:
    16 Jan 2006
    Messages:
    1,571
    Likes Received:
    977
    Reputations:
    783
    Какой возвращать массив - это уже решает программист. Не думаю что пользователю будет предложено сделать выбор в запросах gpc.

    Вот это вообще не понял. Это равносильно: "Что бы поехать на велосипеде, нужны ноги. Но мы сделаем по другому."
     
  7. EXSlim

    EXSlim Elder - Старейшина

    Joined:
    9 Oct 2006
    Messages:
    73
    Likes Received:
    20
    Reputations:
    18
    тьфу. имел ввиду mysql_result


    Дело в производительности. Представь себе кой нибудь средний нагруженый проект ~50 запросов в секунду. Кроме самого запроса на выборку/апдейт/удалейние и т.д. скрипт ещё 50 раз дергнет mysql чтоб он заэскейпил твою переменню. И это только за 1 запрос
     
  8. nerezus

    nerezus Banned

    Joined:
    12 Aug 2004
    Messages:
    3,191
    Likes Received:
    729
    Reputations:
    266
    Что?)
     
  9. NOmeR1

    NOmeR1 Everybody lies

    Joined:
    2 Jun 2006
    Messages:
    1,068
    Likes Received:
    783
    Reputations:
    213
    мдээ...
    Читайте статью от нерезуса. И не нужны какие-нибудь сверх способы устранения всех уязвимостей сразу.
     
  10. .Slip

    .Slip Elder - Старейшина

    Joined:
    16 Jan 2006
    Messages:
    1,571
    Likes Received:
    977
    Reputations:
    783
    >> Представь себе кой нибудь средний нагруженый проект ~50 запросов в секунду. Кроме самого запроса на выборку/апдейт/удалейние и т.д. скрипт ещё 50 раз дергнет mysql чтоб он заэскейпил твою переменню. И это только за 1 запрос

    Переменная обработалась один раз в начале скрипта. Хоть запросов будет миллион, какая разница?

    >> тьфу. имел ввиду mysql_result

    Да тоже самое по сути. Тут идёт речь о защите от скуль инъекций, и о том в каком виде надо давать данные на запрос. Про аргументы функций тут речь не идёт.
     
    #30 .Slip, 26 Oct 2008
    Last edited: 26 Oct 2008
  11. EXSlim

    EXSlim Elder - Старейшина

    Joined:
    9 Oct 2006
    Messages:
    73
    Likes Received:
    20
    Reputations:
    18
    Чего непонятно написано?

    Правда заметил что речь идет о не mysql_real_* ф-ции, которая действительно не требует подключения к бд, к тому же устарела еще с 4й версии + и будет генерировать нотис при ее исползовании в следующем релизе пхп

    мдэ попрубуй поддерживать нагруженый проект с такой фигней в коде. Эти способы придумал не я, а контора которая придумала пхп. Ещё есть вопросы?

    50 запросов к веб-серверу

    Здесь согласен, но я просто прокомментировал о небезопасности кода, который ты написал
     
    #31 EXSlim, 26 Oct 2008
    Last edited: 26 Oct 2008
  12. Doom123

    Doom123 Elder - Старейшина

    Joined:
    11 Nov 2006
    Messages:
    749
    Likes Received:
    244
    Reputations:
    22
    хотите защиту он от скуль ????

    http://il.php.net/manual/ru/function.mysql-real-escape-string.php

    рименение mysql_real_escape_string() к каждой переменной, вставляемой в запрос, предотвращает SQL Injection. Нижеследующий код является наилучшим вариантом составления запросов и не зависит от установки Magic Quotes.

    Запрос, составленный таким образом, будет выполнен без ошибок, и взлом с помощью SQL Injection окажется невозможен.


    PHP:
    <?php
    // Функция экранирования переменных
    function quote_smart($value)
    {
        
    // если magic_quotes_gpc включена - используем stripslashes
        
    if (get_magic_quotes_gpc()) {
            
    $value stripslashes($value);
        }
        
    // Если переменная - число, то экранировать её не нужно
        // если нет - то окружем её кавычками, и экранируем
        
    if (!is_numeric($value)) {
            
    $value "'" mysql_real_escape_string($value) . "'";
        }
        return 
    $value;
    }

    // Соединяемся
    $link mysql_connect('mysql_host''mysql_user''mysql_password')
        OR die(
    mysql_error());

    // Составляем безопасный запрос
    $query sprintf("SELECT * FROM users WHERE user=%s AND password=%s",
                
    quote_smart($_POST['username']),
                
    quote_smart($_POST['password']));

    mysql_query($query);
    ?>
    А также класс от меня

    PHP:
    <?php

    /**
     * @author @FATAL@
     * @copyright 2008
     */

    class DB
    {
        public function 
    __construct($host$user$db_pass$db)
        {
            
    $this->host $host;
            
    $this->user $user;
            
    $this->db_pass $db_pass;
            
    $this->db $db;
        }

        public function 
    conn()
        {
            if(!(
    $this->connect = @mysql_connect($this->host$this->user$this->db_pass)))
            {
                
    $this->false 'Connection Error';
                return 
    false;
            }
            
            return (!@
    mysql_select_db($this->db,$this->connect))? false true;
        }

        public function 
    mysql_qw()
        {
            
    $this->args func_get_args();
            
    $qwery $this->mysql_make_qw();
            return 
    $result mysql_query($qwery,$this->connect);
            
    mysql_free_result($result);
        }
        
        private function 
    mysql_make_qw()
        {
            
    $tml $this->args;
            
    $tml[0] = str_replace('%''%%'$tml[0]);
            
    $tml[0] = str_replace('?''%s'$tml[0]);
            foreach (
    $tml as $i => $v)
            {
                if (!
    $i)
                 continue;
                if (
    is_int($v))
                 continue;
                    
                if (
    get_magic_quotes_gpc())
                    
    $v stripslashes($v);
        
                
    $tml[$i] = "'" mysql_real_escape_string($v,$this->connect) . "'";
            }
            for (
    $i $c count($tml) - 1$i $c 20$i++)
            {
                
    $tml[$i 1] = "UNKNOWN_PLACEHOLDER_$i";
                return 
    call_user_func_array("sprintf"$tml);
            }
        }
        
        public function 
    mysql_fetch($result)
        {
            return 
    mysql_fetch_assoc($result);
        }
        
        public function 
    error()
        {
            return (@
    mysql_error($this->connect))? mysql_error($this->connect): $this->false;
        }

        public function 
    __destruct()
        {
            @
    mysql_close($this->connect);
        }
    }
    ?>
     
    #32 Doom123, 26 Oct 2008
    Last edited: 26 Oct 2008
  13. NOmeR1

    NOmeR1 Everybody lies

    Joined:
    2 Jun 2006
    Messages:
    1,068
    Likes Received:
    783
    Reputations:
    213
    EXSlim, я про так называемый "скрипт" от b3
    Всё, что нужно знать ТС написано нерезусом:
     
  14. EXSlim

    EXSlim Elder - Старейшина

    Joined:
    9 Oct 2006
    Messages:
    73
    Likes Received:
    20
    Reputations:
    18

    Здесь ребята, явно погорячились, или написали так, чтоб не сильно вдаваться в подробности. Раз они так написали, почуму zend ниразу не использовала ее в своем фреймворке?)))

    почитал пример на php.net? почитай еще и примечания к этой ф-ции
     
    #34 EXSlim, 26 Oct 2008
    Last edited: 26 Oct 2008
  15. EXSlim

    EXSlim Elder - Старейшина

    Joined:
    9 Oct 2006
    Messages:
    73
    Likes Received:
    20
    Reputations:
    18
    я же кажется ясно написал о mysql_real_escape_string, что это за дрянь и почему ее желательно не юзать. Повторяю. Метод, что я написал несколькими комментами выше придумал не я, а zend. Ему пофиг числовое это поле(не эскейпится) или строковое(эскейпится). Он не дергает субд каждый раз и не требует подключения к ней
     
    #35 EXSlim, 26 Oct 2008
    Last edited: 26 Oct 2008
  16. Doom123

    Doom123 Elder - Старейшина

    Joined:
    11 Nov 2006
    Messages:
    749
    Likes Received:
    244
    Reputations:
    22
    Замечание: mysql_real_escape_string() не экранирует символы % и _. Эти знаки являются масками групп символов в операторах MySQL LIKE, GRANT или REVOKE.

    Поэтому нада уметь иногда включать мозг ... да и ваще скоко не писал никогда не использовал эти операторы =) да и темболее с подстовлением данных от пользователя ...
     
  17. EXSlim

    EXSlim Elder - Старейшина

    Joined:
    9 Oct 2006
    Messages:
    73
    Likes Received:
    20
    Reputations:
    18
    да причем здесь эти символы.
     
  18. lisa99

    lisa99 Banned

    Joined:
    15 Jul 2008
    Messages:
    359
    Likes Received:
    200
    Reputations:
    70
    а можно привести пример уязвимости, где обходится
    функция mysql_real_escape_string() именно с применением этих символов? или иначе..
     
  19. NOmeR1

    NOmeR1 Everybody lies

    Joined:
    2 Jun 2006
    Messages:
    1,068
    Likes Received:
    783
    Reputations:
    213
    А нельзя ли действовать по принципу KISS [http://ru.wikipedia.org/wiki/Принцип_KISS]?
    Каждый метод защиты для каждого случая разный. Если напрягает дополнительная нагрузка на базу - юзайте mysql_escape_string()
    EXSlim, твой метод бредовый, так как он проверяет не сами данные, а их тип, а затем делает ненужную фильтрацию.
     
  20. EXSlim

    EXSlim Elder - Старейшина

    Joined:
    9 Oct 2006
    Messages:
    73
    Likes Received:
    20
    Reputations:
    18
    бредовый? накатай тикет zend`y. бл#ть, я уже 4й раз пишу что этот метод придумал не я, а zend. и использует его вместо этой гребаной mysql_real_escape_string. а ещё вместе с ней его использует охрененная куча людей которые разработывают с zend framework

    а я и не писал что она обходится. я написал что это забивание гвоздей яйцами
     
Loading...
Similar Threads - Защита enjection
  1. GAiN
    Replies:
    3
    Views:
    7,742