Статья про анти sql-inj

Discussion in 'Уязвимости' started by nerezus, 5 Jan 2007.

  1. nerezus

    nerezus Banned

    Joined:
    12 Aug 2004
    Messages:
    3,191
    Likes Received:
    729
    Reputations:
    266
    Статья про защиту от SQL-inj

    Статья про защиту от SQL-inj

    Что такое SQL-inj?
    Сам знаешь. Иначе бы не читал. Так что сиди и читай дальше ;)

    Как проводятся SQL-inj?
    Вбивай в гугл и ищи статьи всяких разных хакеров. Если искать не умеешь - то дальше не читай, все равно не поймешь.

    Как защититься?
    Что, нагуглил статей? Может и про защиту написано?
    Какие-нибудь леменги вроде Михуила Фленова. фильтровать советуют? Шли нах.
    Ничего, повторяю еще раз для альтернативно-одаренных: НИЧЕГО фильтровать не надо. СУБД - на то она и СУБД, а не херня какая-то, чтобы нормально любые данные принимать.
    Наша задача - просто правильно эти данные преподнести.
    Защищаться надо так(применительно к PHP и mysql):
    1) Если поле в базе числовое, то: (int) (ну или intval()). Можно по модулю взять при использовании в LIMIT, но это не секурити-дырка.
    2) Если текстовое, то просто mysql_real_escape_string()
    3) Всякие magic quotes и подобные затычки отключены. Кто не отключил - ССЗБ(что это означает - смотрите на LOR'е)
    И ВСЕ! Больше ничего не надо. Ибо запрос испортить левыми данными нельзя.
    Повторю еще раз: НИКАКИХ ФИЛЬТРАЦИЙ.
    LIKE/RLIKE/AGAINST/etc - это частный случай, и рассматривается отдельно.
    Примера не будет. Если не понял - значит это тебе не надо.

    ORM
    Что это такое, написано здесь: http://ru.wikipedia.org/wiki/ORM
    Защита от SQL-inj - это побочный результат применения данной технологии.

    Что касательно защиты от XSS, то никаким образом к БД это не относится.
    Так что те, кто хотел это все объединить в 1 функцию(да к тому же и с проверкой) - идите лесом. Это кардинально разные вещи и они друг к другу не относятся.

    И да пребудет с вами сила(не со всеми)!

    nerezus, 5.01.07-2.01.08
     
    #1 nerezus, 5 Jan 2007
    Last edited: 2 Jan 2008
    15 people like this.
  2. max_pain89

    max_pain89 Eat `em UP!

    Joined:
    11 Dec 2004
    Messages:
    451
    Likes Received:
    140
    Reputations:
    146
    хм довольно странный, даже не статья, а пост.

    В защиту magic quotes скажу что если ставишь двиг, не собственно ручно написаный, смысла отключать не вижу, больше риск.
     
  3. nerezus

    nerezus Banned

    Joined:
    12 Aug 2004
    Messages:
    3,191
    Likes Received:
    729
    Reputations:
    266
    Я сначала хотел что-то из строчек восьми написать )
    Но написал больше.
    Причина - тема http://forum.antichat.ru/thread30506.html

    Ну а чтьо касается magic quotes - то нефиг юзать кривые движки ;)
     
  4. blaga

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

    Joined:
    23 Mar 2006
    Messages:
    884
    Likes Received:
    273
    Reputations:
    106
    intval() например при -12 выводит -12. Это не дырка? А вот насчет mysql_real_escape_string() это ты в точку! Нхрена писать невпупенные функции когда можно одной строчкой обойтись.
     
  5. nerezus

    nerezus Banned

    Joined:
    12 Aug 2004
    Messages:
    3,191
    Likes Received:
    729
    Reputations:
    266
    Я даже приписал:
    "Можно по модулю взять в LIMIT, но это не секурити-дырка."
     
  6. blaga

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

    Joined:
    23 Mar 2006
    Messages:
    884
    Likes Received:
    273
    Reputations:
    106
    Извини, пойду лучше учебник по скулю почитаю.
     
  7. _Great_

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

    Joined:
    27 Dec 2005
    Messages:
    2,032
    Likes Received:
    1,119
    Reputations:
    1,139
    не-а =)
     
  8. Zadoxlik

    Zadoxlik рояль с сыром

    Joined:
    28 Feb 2005
    Messages:
    758
    Likes Received:
    216
    Reputations:
    257
    Это все ясно, только ты не раскрыл тему=) Например при Selectе с Like надо экранировать еще пару символов, хотя логика очень здравая и самому ни раз мысль такая приходила при прочтении описаний разного рода фильтраций =)
     
    #8 Zadoxlik, 5 Jan 2007
    Last edited: 5 Jan 2007
  9. guest3297

    guest3297 Banned

    Joined:
    27 Jun 2006
    Messages:
    1,246
    Likes Received:
    639
    Reputations:
    817
    А если админы эту статью прочитают ведь все sql иньекции закроют?
    Статью в приват!
     
  10. blaga

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

    Joined:
    23 Mar 2006
    Messages:
    884
    Likes Received:
    273
    Reputations:
    106
    2[ cash ], тебя как самого умного в подполье работать на сопротивление.
     
  11. Xex

    Xex Banned

    Joined:
    10 Jul 2005
    Messages:
    108
    Likes Received:
    41
    Reputations:
    7
    Согласен,
    забыли про грамотное распределение прав в СУБД.
     
  12. nerezus

    nerezus Banned

    Joined:
    12 Aug 2004
    Messages:
    3,191
    Likes Received:
    729
    Reputations:
    266
    вы еще про хранимые функции скажите =)))
     
  13. Dracula4ever

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

    Joined:
    8 May 2006
    Messages:
    418
    Likes Received:
    183
    Reputations:
    26
    Чтобы защитится от SQL Injection надо, прежде всего надо распределять по его видам.
    К примеру, если мы хотим получить целое число (int) надо чтобы шла проверка что это число и правда целое.
    Это можно осуществить с помощью функнии IsNumeric в таком виде:
    Так же надо чтобы не показывались ошибки, которые приводят к взлому сайта.
    Есть полно путей сделать это, но помойму лучше всего это осуществить с помощью того, что есть ошибка работа не прекратилась.
     
  14. nerezus

    nerezus Banned

    Joined:
    12 Aug 2004
    Messages:
    3,191
    Likes Received:
    729
    Reputations:
    266
    Во-первых, никаких проверок не надо! Сколько раз повторять?
    Во-вторых, int не может быть не целым!
     
  15. k1b0rg

    k1b0rg Тут может быть ваша реклама.

    Joined:
    30 Jul 2005
    Messages:
    1,182
    Likes Received:
    399
    Reputations:
    479
    error_reporing(0);
    magic_quotes on

    и числа передаваемые базе тоже обрамляем ковычками типо

    и хакеры прутся полем
     
  16. GHostly_FOX

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

    Joined:
    4 Jan 2007
    Messages:
    34
    Likes Received:
    15
    Reputations:
    0
    Мой метод защиты:

    Если вы передаете только текст и числа в скрипты к примеру:
    index.php?modules=news&id=1
    то вполне подойдет данный код:

    PHP:
    function var_chek($var,$col){
        
    $var    =    substr($var0$col);
        
    $var    =    preg_replace("/[^\w\x7F-\xFF\s]/"""$var);
        
    $good    =    ereg_replace(" +"" "$var);
        
    $good    =    strip_tags($good);
        return 
    $good;
    }

    $modules=var_chek($modules,10);
    $id=var_chek($id,5);
    Данный код не только удалит все спец символы из передаваемых строк но и обрезает по длинне, ни один XSS или SQL inj... не пройдет через этот фильтр.
     
  17. nerezus

    nerezus Banned

    Joined:
    12 Aug 2004
    Messages:
    3,191
    Likes Received:
    729
    Reputations:
    266
    Воот... прекрысный пример в тему как не надо делать...
     
  18. k1b0rg

    k1b0rg Тут может быть ваша реклама.

    Joined:
    30 Jul 2005
    Messages:
    1,182
    Likes Received:
    399
    Reputations:
    479
    Примерно такой же код используется в последних версиях phpbb
     
  19. _Great_

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

    Joined:
    27 Dec 2005
    Messages:
    2,032
    Likes Received:
    1,119
    Reputations:
    1,139
    так действительно делать не надо.
    Лучшим средством будет типизирование параметров - явно прописать в скрипте имена параметров и их типы и соответствующе их парсить. Если int - делать intval(), если string - делать mysql_escape_string.
    При выводе всех значений на экран обрамлять в htmlspecialchars, а резать это при передаче в БД - маразм.
    Тут я на 100% согласен с nerezus'ом
     
  20. nerezus

    nerezus Banned

    Joined:
    12 Aug 2004
    Messages:
    3,191
    Likes Received:
    729
    Reputations:
    266
    Обязательно off.
    Т.к. иначе будет двойное экранирование.

    И вообще magic_quotes, register_globals и т.д. отменили в PHP6, чтобы криворукие недокодеры не юзали их )

    Зачем?
     
    1 person likes this.