Анти SQL injection

Discussion in 'PHP' started by guest3297, 11 Dec 2007.

  1. guest3297

    guest3297 Banned

    Joined:
    27 Jun 2006
    Messages:
    1,246
    Likes Received:
    639
    Reputations:
    817
    Можно легко обезапасить любю cms поставив грамотную фильтрацию, так что если вы не уверненны в своем движке или в чужом просто просто проводите все запросы через эту функцию.

    PHP:
    <?

    error_reporting(0);

    function 
    HLSQL($Query)
    {
        
    $Query=preg_replace("/(\s{1})(JOIN)/""\\1\nJOIN"$Query);
        
    $Query=preg_replace("/([^a-zA-Z]{1})([\d0-9]+)/""\\1<span style=\"color:6666CC\">\\2</span>"$Query);

        
    $Query=preg_replace("/('[^']+')/""<span style=\"color:FF9900\">\\1</span>"$Query);
        
    $Query=preg_replace("/(#.*\n)/""<span style=\"color:999999\">\\1</span>"$Query);
        
    $Query=preg_replace("/FROM[\s+](\S+)\s/""FROM <span style=\"color:339900;text-decoration:underline\">\\1</span> "$Query);

        
    $Query=preg_replace("/JOIN[\s+](\S+)\s/""JOIN <span style=\"color:339900;text-decoration:underline\">\\1</span> "$Query);
        
    $Query=preg_replace("/(COUNT|SUM)\(([^\)]+)\)/""<span style=\"color:FF0000;font-weight:bold\">\\1</span>(\\2)"$Query);


        
    $Query=preg_replace("/\s{1}(FROM|JOIN|GROUP|WHERE|ORDER|LIMIT|AND|ON)\s{1}/"" <span style=\"color:0000FF;font-weight:bold;\">\\1</span> "$Query);
        
    $Query=preg_replace("/\s{1}(BY|OR|AS|IN|BETWEEN)\s{1}/"" <span style=\"color:000000;font-weight:bold;\">\\1</span> "$Query);
        
    $Query=preg_replace("/(SELECT)/"" <span style=\"color:0000FF;font-weight:bold;\">\\1</span> "$Query);
        
    $Query=preg_replace("/\(/""<span style=\"font-weight:bold;\">(</span>"$Query);
        
    $Query=preg_replace("/\)/""<span style=\"font-weight:bold;\">)</span>"$Query);


        return 
    "<p style=\"color:000000; font-size:12px;\">".nl2br($Query)."</p>";
    }

    ?>
     
    3 people like this.
  2. VampiRUS

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

    Joined:
    31 Dec 2005
    Messages:
    210
    Likes Received:
    105
    Reputations:
    57
    а про placeholders вы не слышали?
     
  3. XopoIII

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

    Joined:
    29 Oct 2007
    Messages:
    386
    Likes Received:
    30
    Reputations:
    0
    я не слышал=) обьясняй=)
     
  4. VampiRUS

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

    Joined:
    31 Dec 2005
    Messages:
    210
    Likes Received:
    105
    Reputations:
    57
    http://rumchten.rsl.ru/2005/ru/upload/doc/1103016958.doc
     
    1 person likes this.
  5. XopoIII

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

    Joined:
    29 Oct 2007
    Messages:
    386
    Likes Received:
    30
    Reputations:
    0
    попробовал эту библиотеку, сразу же застрял кричит ошибка
    Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in
    в этой стрке
    PHP:
    $whonline=mysql_fetch_array($user_online);
    до нее
    PHP:
    $online =sql_placeholder('SELECT * FROM users_reg WHERE '.time().'-`login_time` <= 60*2');
    $user_online mysql_query($online);
     
    1 person likes this.
  6. XopoIII

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

    Joined:
    29 Oct 2007
    Messages:
    386
    Likes Received:
    30
    Reputations:
    0
    пробовал уже и так и этак, эффект одинаковый, но вот если отрубаю библиотеку и ставлю обычные ковычки то все работает=)) бредд
     
  7. .:EnoT:.

    .:EnoT:. Сексуальное чудовище

    Joined:
    29 May 2007
    Messages:
    803
    Likes Received:
    559
    Reputations:
    50
    Имхо, вполне хватит фильтрации основных опасных символов чтобы противостоять иньекции. ну плюс-минус конечно
    PHP:
    <?php
       $query 
    $_POST['query'];
       
    $query str_replace("'",''$query);
       
    $query str_replace('-',''$query);
       
    $query str_replace('+',''$query);
       
    $query str_replace('/',''$query);
       
    $query str_replace('*',''$query);
       
    $query str_replace(' ','',$query);
       
    $query str_replace('%','',$query);
    ?>
    После фильтрации этих символов sql-инъекция уже и так будет невозможна....Ещё в одном учебнике по php читал что одинарную кавычку лучше не просто фильтровать а заменять на обратную ` .. не знаю насколько эт лучше и сопстна зачем))
    Ну Кэш всё равно молодец, лови + :)
     
    2 people like this.
  8. VampiRUS

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

    Joined:
    31 Dec 2005
    Messages:
    210
    Likes Received:
    105
    Reputations:
    57
    ну собственно это я кинул для описания сути placeholders
    сам я успользую простенькую функцию, взятую из учебника Котерова, мне пока хватает.
     
  9. guest3297

    guest3297 Banned

    Joined:
    27 Jun 2006
    Messages:
    1,246
    Likes Received:
    639
    Reputations:
    817
    Если в самой переменной не заданно что данные только пост ac. фильтрацию легко можно обойти постав данные гет.
     
    1 person likes this.
  10. Macro

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

    Joined:
    11 Nov 2006
    Messages:
    552
    Likes Received:
    298
    Reputations:
    207
    <?php
    $query = $GLOBALS['query'];
    $query = str_replace("'",'', $query);
    $query = str_replace('-','', $query);
    $query = str_replace('+','', $query);
    $query = str_replace('/','', $query);
    $query = str_replace('*','', $query);
    $query = str_replace(' ','',$query);
    $query = str_replace('%','',$query);
    ?>
     
  11. guest3297

    guest3297 Banned

    Joined:
    27 Jun 2006
    Messages:
    1,246
    Likes Received:
    639
    Reputations:
    817
    фильтры работающие таким образом несовершенны смотри защиту sweb
     
    1 person likes this.
  12. VampiRUS

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

    Joined:
    31 Dec 2005
    Messages:
    210
    Likes Received:
    105
    Reputations:
    57
    PHP:
    function sql_query(){
            unset(
    $this->result);
            
    $args func_get_args();
            
    $tmpl =& $args[0];
            
    $tmpl str_replace("%""%%"$tmpl);
            
    $tmpl str_replace("?""%s"$tmpl);
        
            foreach (
    $args as $i=>$v){
                if (!
    $i) continue;        // это шаблон
                
    if (is_int($v)) continue; // целые числа не нужно экранировать
                
    $args[$i] = "'".mysql_real_escape_string($v)."'";
            }

            
    $args[count($args)] = 'UNKNOWN_PLACEHOLDER';
            
    $query=call_user_func_array("sprintf"$args);
            
    $this->result=@mysql_query($query) or die(mysql_error());
            return 
    $this->result;
        }
    вот метод класса обёртка, приемущество в том, что нет возможности забыть провести проверку входных данных.
     
    1 person likes this.
  13. VampiRUS

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

    Joined:
    31 Dec 2005
    Messages:
    210
    Likes Received:
    105
    Reputations:
    57
    [ cash ]мож я туплю (только сейчас просмотрел код :) ) , непонял назначение т.е. каждый запрос прогоняем и смотрим визуально правильно написали или нет?(хотя подсветка мне понравилась + )
    по коду, думаю надо регулярки с модификатором /i
    и в [\d0-9]+ помойму что то одно лишнее.
     
    1 person likes this.
  14. }{0TT@БЬ)Ч

    }{0TT@БЬ)Ч Elder - Старейшина

    Joined:
    20 Jan 2006
    Messages:
    269
    Likes Received:
    140
    Reputations:
    31
    вот собственно по сабжу, сам батька nerezus писал)))))
    http://forum.antichat.ru/thread30641.html
     
  15. Digimortal

    Digimortal Banned

    Joined:
    22 Aug 2006
    Messages:
    471
    Likes Received:
    248
    Reputations:
    189
    >> Можно легко обезапасить любю cms поставив грамотную фильтрацию

    с каких это пор функции для подсветки синтаксиса кода стали "грамотной фильтрацией" ? +))

    >> просто проводите все запросы через эту функцию.

    ога, я бы посмотрел на такую cms.. +)
     
    #15 Digimortal, 11 Dec 2007
    Last edited: 11 Dec 2007
  16. Meanor

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

    Joined:
    9 Sep 2007
    Messages:
    66
    Likes Received:
    9
    Reputations:
    0
    А если в каждый скрипт (или в тот, который вызывается в каждом):
    PHP:
    foreach ($_GET as $check_url) {
       if (!
    preg_match("/[a-zA-Z0-9]/",$check_url)) {
       die (
    "access forbidden");
       }
    }
    unset(
    $check_url);



    Это только для Get, для постов надо настроить по своему регулярное выражение...
     
    #16 Meanor, 11 Dec 2007
    Last edited: 11 Dec 2007
  17. k8^cat.YOU

    k8^cat.YOU Member

    Joined:
    12 Jul 2007
    Messages:
    13
    Likes Received:
    5
    Reputations:
    0
    2 Enot and Meanor, use $_REQUEST.

    $query = $_POST['query']; -> $query = $_REQUEST['query'];
    ....

    foreach ($_REQUEST as $check_url)
    ....

    куки, пост, гет, файл - все в одной куче ;)


    PS. хотя..... я права насчет REQUEST или как?
     
    2 people like this.
  18. .:EnoT:.

    .:EnoT:. Сексуальное чудовище

    Joined:
    29 May 2007
    Messages:
    803
    Likes Received:
    559
    Reputations:
    50
    Ну это личное дело каждого. Лично я предпочитаю какой метод использую, такой и указываю,мне так проще)

    Насчёт $_REQUEST при использовании POST и GET да.
    К кукам это совсем не относится, там HTTP_COOKIE_VARS масть держит))
     
  19. VampiRUS

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

    Joined:
    31 Dec 2005
    Messages:
    210
    Likes Received:
    105
    Reputations:
    57
    .:EnoT:. ты отстал от жизни теперь уже $_COOKIE
     
    1 person likes this.