![]() |
Статья про защиту от 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 |
хм довольно странный, даже не статья, а пост.
В защиту magic quotes скажу что если ставишь двиг, не собственно ручно написаный, смысла отключать не вижу, больше риск. |
Я сначала хотел что-то из строчек восьми написать )
Но написал больше. Причина - тема http://forum.antichat.ru/thread30506.html Ну а чтьо касается magic quotes - то нефиг юзать кривые движки ;) |
intval() например при -12 выводит -12. Это не дырка? А вот насчет mysql_real_escape_string() это ты в точку! Нхрена писать невпупенные функции когда можно одной строчкой обойтись.
|
Цитата:
"Можно по модулю взять в LIMIT, но это не секурити-дырка." |
Извини, пойду лучше учебник по скулю почитаю.
|
Цитата:
|
Это все ясно, только ты не раскрыл тему=) Например при Selectе с Like надо экранировать еще пару символов, хотя логика очень здравая и самому ни раз мысль такая приходила при прочтении описаний разного рода фильтраций =)
|
А если админы эту статью прочитают ведь все sql иньекции закроют?
Статью в приват! |
2[ cash ], тебя как самого умного в подполье работать на сопротивление.
|
Цитата:
забыли про грамотное распределение прав в СУБД. |
вы еще про хранимые функции скажите =)))
|
Чтобы защитится от SQL Injection надо, прежде всего надо распределять по его видам.
К примеру, если мы хотим получить целое число (int) надо чтобы шла проверка что это число и правда целое. Это можно осуществить с помощью функнии IsNumeric в таком виде: Цитата:
Есть полно путей сделать это, но помойму лучше всего это осуществить с помощью того, что есть ошибка работа не прекратилась. Цитата:
|
Цитата:
Во-вторых, int не может быть не целым! |
error_reporing(0);
magic_quotes on и числа передаваемые базе тоже обрамляем ковычками типо Цитата:
и хакеры прутся полем |
Мой метод защиты:
Если вы передаете только текст и числа в скрипты к примеру: index.php?modules=news&id=1 то вполне подойдет данный код: PHP код:
|
Цитата:
|
Примерно такой же код используется в последних версиях phpbb
|
так действительно делать не надо.
Лучшим средством будет типизирование параметров - явно прописать в скрипте имена параметров и их типы и соответствующе их парсить. Если int - делать intval(), если string - делать mysql_escape_string. При выводе всех значений на экран обрамлять в htmlspecialchars, а резать это при передаче в БД - маразм. Тут я на 100% согласен с nerezus'ом |
Цитата:
Т.к. иначе будет двойное экранирование. И вообще magic_quotes, register_globals и т.д. отменили в PHP6, чтобы криворукие недокодеры не юзали их ) Цитата:
|
чтобы нельзя было провести инъекцию......из под ковычек не выйти
|
Цитата:
|
я не про твой способ говорил а про свой, где я указал что простого magic quotes on будет достаточно с обрамленныеми параметрами. Если числа не обрамлять, тогда инъекция возможна.
|
Цитата:
Что, переписывать будешь? |
Цитата:
Цитата:
Цитата:
Так что некоторые куски кода все таки придется переписывать...и это факт. Вобщем когда выйдет, тогда и будем смотреть) |
С каждым нерезусовым словом в топе согласен :d
|
k1b0rg, воот: у тебя каждое неправильное решение/костыль тащит за собой еше гору костылей, и они нарастают как снежный ком.
А теперь посмотри на альтернативу(которая, кстати легче): писать правильно. |
Цитата:
Данный код позволяет мне получать чистые данные, на моем сайте в основном передаются только числа и текст... все остальное лишнее и я это убираю... |
потому что вместо 10 строчек можно обойтись одной.
|
blaga. Нет не по этому. У него совсем неправильно.
GHostly_FOX, данные у тебя не "чистые", как ты выразился, а испорченные. Теряем информацию при твоей "обработке". |
int и intval() ограничены -2147483648 до 2147483648
а числа большие этому, предлагаешь уже строкой брать? тогда ты пролетишь mysql_real_escape_string тебе не поможет, взломают так что ноги согнутся... $id=is_numeric($_GET['id'])?$_GET['id']:0; тебя опять эта запись не устроит? )) is_numeric возьмет любое число) |
k1b0rg, спасибо, посмеялся.
А теперь немного подумай. Головой. Предположим, в движке обрабатываем ее как: 1) ...как строку. Тогда причем int/intval() ? 2) ...как число. Тогда туда и не должны попасть такие значения, а int/intval() обрежет только неправильные. |
nerezus молодца! реальн клево отписал! я даж посмеялся! хоть не впадлу читать было, т.к. не много)))
а ваше я обычно все параметры передоваемые в запрос беру в ' ' а в самих параметрах экранирую ' и всегото!)) |
Цитата:
mysql_escape_string поможет правильно передать любую строку в базу данных, а intval поможет передать число |
а не прощи ли сделать
PHP код:
|
Конечно нет.
запрос можно испортить. А эта функция экранирует еще и другие символы. |
Я уже писал в подобной теме. Зачем создавать громоздкие функции для экранирования запрещенных символов, если все уже давно придумано за нас.
вот пример безопасного кода: Код:
<?php |
Почти верно.
Почему почти? $val = isset($_GET['val']) ? (int)$_GET['val'] : 0; |
от инекции да. все верно.
>>но это не секурити-дырка. бебе от инекции да, но секурити;) тк можно получить раскрытие пути. чем не бага. |
ZaCo, а если у меня еррор_репортенг по нулям? :)
|
| Время: 00:14 |