Защита от sql- инъекций
176 повідомлень
#15 років тому
Здравствуйте.Пишу уже как год разные скрипты, но никогда не обращал внимание на их уязвимость.
Каким образом можно ввести инъекцию и как от нее можно защититься ?
Может у кого-то больше опыта нежели у меня
1157 повідомлень
#15 років тому
Очень просто.Пример уязвимого запроса "select * from table where id = {$_GET}"
Очевидно, что в качестве $_GET можно передать зловредную строку и Ваш запрос будет выглядеть несколько иначе, чем вы рассчитывали

Защититься очень просто - совать во все запросы только проверенные данные.
Если данные - числа, то приводим их к числовому виду, например $id = intval($_GET); и запрос переписать так "select * from `table` where `id` = '$id'"
Теперь вы можете быть уверены, что в запрос вставится строго целое число.
Строковые данные валидируют, к примеру, функцией mysql_real_escape_string и после этого суют в запрос.
Если же данные таковы, что могут принимать только одно из нескольких заранее известных значений, к примеру 'yes' или 'no',
тогда просто написать кучку if и проверить
if (($_GET) == 'yes'

if (($_GET) == 'no'

и совать в запрос $answer вместо $_GET
1157 повідомлень
#15 років тому
Цитата ("maxim_belkin"):обрабатываем переменные с помощью mysql_escape_string().
Вместо функции mysql_escape_string() лучше использовать более кондовую функцию mysql_real_escape_string()
203 повідомлення
601 повідомлення
#15 років тому
Ну в общем да, проверять, проверять и еще раз проверять все данные, что вам передают. Есть еще, кстати, крайне забавная уязвимость в php - связанная с генератором случайных чисел. Тоже наверняка, если не знаете, даже не задумывались о защите с этой стороны.Вот например статья... посилання
1172 повідомлення
#15 років тому
Еще base64_encode помогает, когда много текста и по нему не надо делать поиск.Оффтопик
Вместо
if (($_GET) == 'yes'
$answer = 'yes';
if (($_GET) == 'no'
$answer = 'no';
Лучше писать так
$answer=isset($_GET) ? $_GET : '';
if ($answer=='yes'||$answer=='no'
{
...пихать в базу
}
Тогда не будет Notice, код должен быть чистым
if (($_GET) == 'yes'

if (($_GET) == 'no'

Лучше писать так
$answer=isset($_GET) ? $_GET : '';
if ($answer=='yes'||$answer=='no'

...пихать в базу
}
Тогда не будет Notice, код должен быть чистым
1157 повідомлень
#15 років тому
Цитата ("Lisio"):Оффтопик:
Вместо
if (($_GET) == 'yes'$answer = 'yes';
if (($_GET) == 'no'$answer = 'no';
Лучше писать так
$answer=isset($_GET) ? $_GET : '';
if ($answer=='yes'||$answer=='no'{
...пихать в базу
}
Тогда не будет Notice, код должен быть чистым
Индусский код)))
Код должен быть ясным и читаемым, сложная конструкция isset, а потом 2 условия в if.
Проще написать так
$answer = '';
if (($_GET) == 'yes'

if (($_GET) == 'no'

такой код намного очевиднее и легче читается.
1172 повідомлення
#15 років тому
Цитата ("superkoder"):сложная конструкция isset
Сложная для понимания?

Цитата ("superkoder"):
Проще написать так
$answer = '';
if (($_GET) == 'yes'$answer = 'yes';
if (($_GET) == 'no'$answer = 'no';
такой код намного очевиднее и легче читается.
Проще, но если уровень предупреждений стоит не подходящий, то на экран вылезет строчка с текстом, Notice ... блаблабла ... такую переменную не знаем ... $_GET .... вот вам адрес скрипта, ломайте его напрямую...
Конечно, так проще )))))))))))))))
И даже если вручную установить уровень предупреждений в гробовое молчание, то код будет грязным.
731 повідомлення
#15 років тому
Цитата ("lovelas"):Каким образом можно ввести инъекцию и как от нее можно защититься ?
Я так думаю, что вы знаете о стандартных функция MySQL (или на чем у вас там скрипты). Описывать все варианты не вижу возможным, проще смотреть на код. Просто знайте, что все данные пришедшие от пользователя, должны быть проверены. Учитывайте не только простые input`ы, но и то что передает сам браузер. По фильтрации, не предумывайте функции, которые вырезают слова - это бесполезно. Все можно перекодировать и/или собрать в строку.
Но и на самом деле не только через SQL injection ломают сайты (надеюсь inlude-багов у вас нет). Прочитайте лучше статьи по этому делу. Google в помощь.
731 повідомлення
#15 років тому
Цитата ("superkoder"):Код должен быть ясным и читаемым, сложная конструкция isset
PHP вас разбалывал

1895 повідомлень
#15 років тому
Есть простое, удобное, безопасное и логичное средство:1. передача параметров как параметры!, а не как строки!
2. использованные хранимых процедур
меня почемуто не удивляет что пишут люди год и больше и ничего не знают об безопасности, что хуже, когда пишут, заказчики им платят денег, хотят секономить и непроводят незавысимый аудит безопасности сайта, а потом... ой у нас сайт поломали, ой у нас тут беда, денег угнали, троян закинули и т.д.
Прошу также ознакомится по оптимизации и организации работы с БД: посилання
про это кстати как и про инъекции не пишут в книгах!
Уважаемые заказчики, проводите аудит безопасности сайтов и кода на предмет уязвимостей!
Уважаемые исполнители, качественно выполняйте свою работу, ми не врачи, чтобы только подлечить и потом хоть подохните, мы - инженеры программного обеспечения, наши творения должны работать быстро, надёжно, и стоять соответственно!
1157 повідомлень
#15 років тому
Цитата ("MMM_Corp"):Уважаемые заказчики, проводите аудит безопасности сайтов и кода на предмет уязвимостей!
Уважаемые исполнители, качественно выполняйте свою работу, ми не врачи, чтобы только подлечить и потом хоть подохните, мы - инженеры программного обеспечения, наши творения должны работать быстро, надёжно, и стоять соответственно!
Слабо себе представляю, как убедить заказчика заказать аудит безопасности.
Есть такие люди в природе, но это те, кого уже ломают и они хотят всего лишь найти дыру.
Заметьте, не провести полный аудит безопасности сайта, а залатать ту дырку, через которую их ломают,
хотя очевидно, что у них дырявые все скрипты сайта и ломать можно через любой

1172 повідомлення
#15 років тому
Аудит всего сайта - очень дорогая штука. И малознакомым исполнителям его не доверяют.
601 повідомлення
#15 років тому
Цитата ("VeMax"):Цитата ("superkoder"):Код должен быть ясным и читаемым, сложная конструкция isset
PHP вас разбалывал
Да уж... Вот за это я и не люблю php. Язык должен прививать красоту кода... А не убеждения что все, кроме стандартных if - сложно.
MMM_Corp, отлично сказано. К сожалению, действительно, ДО взлома заказчика сложно убедить в необходимости проводить аудит.
1895 повідомлень
#15 років тому
Аудит безопасности проводится для противовеса разработчика, напр. разработчики наса (когдато читал) получат двойные премиальные, если группа безопасности найдет меньше уязвымостей в коде разработчиков.Тоесть аудит должен бить пинком для разработчиков, напр. как это выглядит на практике:
1. есть некий проект, есть заказчик (З), который хочет нормального результата
2. есть разработчик (Р), заказчик с ним связался, про все договорились, и заказчик хочет качественного результата, за что и платит вменяемые деньги
3. есть аудитор (А), он тоже договорился с заказчиком про все ньансы аудита, притом что кто исполнитель аудитор конечно не должен знать, чтобы не было подтасовки результатов
при разработке проекта, разработчик должен всегда резервировать время для тестирования своего кода, а не так чтобы работало лишь бы показать и слинять, нет! так быть не должно! я понимаю, что проще схалтурить, взять бабки и пойти бухать, а не заниматся подобной лобудой), но удивляют и заказчики, которые в 99% случаев не знают подводных камней работы сайтов, программ, БД и т.д., и поэтому заказчики стремятся сэкономить, и сами проводят тестирование (это максимум!) продукта разработки и то весьма поверхностно.
Проблема заключается в том, что очень много заказчиков требуют высокое качество продукта, но за смешные деньги. Есть масса примеров из практики, напр.
Тендер....
разработать такуюто прогу
отписываю: от 100 у.е., от 5 дней
и тут начинаются вопросы от заказчика, "ой, а что так дорого? мне тут чел за 40 у.е. за 2 дня все сделает", "у... у вас очень дорого, можно побистрее и подешевле",
обычно отвечаю: "можно, но робота будет проведена без аудита узких мест и аудита безопасности"
тут и начинается цирк... выбирают дешевле, лиш бы работало (можно подумать разработчик такой уже идиот что сам не предвидет парочку самых ожидаемых узких мест))), но и если заказчик сам проверяет работу, без надлежащего опыта и сам находит массу багов и проблем, то это уже клиника....), меня вот всегда удивляет, неужели заказчики настолько хорошие специалисты, что могут провести тестирование сайта (стоит только посмотреть на обвальное к-во проектов вида: нужно исправить баг в верстке, нужно залатать дырку, нужно перенести сайт на более легкую ЦМС-ку, нужно избавится от трояна) и т.д., львиная доля таких проектов, и это вина именно заказчиков, "Жадный платит дважды" - знаете такое?)
Цитата ("superkoder"):
Слабо себе представляю, как убедить заказчика заказать аудит безопасности.
А это уже забота заказчика, не вы (исполнитель) должны убеждать, вам от этого не тепло ни холодно если качественно делаете свою работу, а это забота только заказчика. Но сами подумайте, если напр. взять напр. свежесделанный сайтик и провести аудит по всем меркам, росписать все заказчику, а он в свою очередь это все передаст исполнителя, то конечно исполнитель уже никуда не отвернётся. Заметьте, не зря даже на веблансере нельзя поменять отзыв спустя некоторое время. Также и заказчик должен резервировать для себя (ну а может и для аудитора, если хочет качества) чтобы провести тестирование того что он заказал.
Цитата ("superkoder"):
Есть такие люди в природе, но это те, кого уже ломают и они хотят всего лишь найти дыру.
Та да... жадность страшная штука, эжедневно с этим сталкиваюсь, как в бизнесе так и во фрилансе, знаете, постоянно сталкиваюсь с одной банальной истинной:
"Почему бедный? Потому что глупый! А почему глупый? Потому что бедный!"
именно нашы постсавковые люди именно такые, хотят жить хорошо, но нехотят ничего для этого сделать, хотят на старости лет отдыхать на яхте и веселится жизни, но не хотят чтото откласть на свою старость.
парадокс правда? к сожалению это не только проблема фриланса, а глубоко-социальная проблема, "мы любим холяву" - вот наш девиз! именно из-за этого девиза, наших людей разводят на бабки, вспомним только всякие необоснованные экономически пирамиды, типа дай 100 р. щас, а завтра тебе 5000 р. верну) да-да знакомая песенка, вот щас бы такое предложыл, все бы поплевались, но вот почему-то плюют также и на себя, и на свое будущее, хотя все тут верно, - "Бедным и глупим народом легче управлять", вот примерно так могу сказать про наших людей, ИМХО.
5330 повідомлень
#15 років тому
Цитата ("MMM_Corp"):меня почемуто не удивляет что пишут люди год и больше и ничего не знают об безопасности, что хуже, когда пишут, заказчики им платят денег, хотят секономить и непроводят незавысимый аудит безопасности сайта, а потом... ой у нас сайт поломали, ой у нас тут беда, денег угнали, троян закинули и т.д.
по тому, что платят ровно столько, что бы без подготовки и разбора писать сразу "начистовую"
для компонента за 20$ я даже схему не нарисую работы.
Цитата ("MMM_Corp"):
тут и начинается цирк... выбирают дешевле, лиш бы работало (можно подумать разработчик такой уже идиот что сам не предвидет парочку самых ожидаемых узких мест))), но и если заказчик сам проверяет работу, без надлежащего опыта и сам находит массу багов и проблем, то это уже клиника....), меня вот всегда удивляет, неужели заказчики настолько хорошие специалисты, что могут провести тестирование сайта (стоит только посмотреть на обвальное к-во проектов вида: нужно исправить баг в верстке, нужно залатать дырку, нужно перенести сайт на более легкую ЦМС-ку, нужно избавится от трояна) и т.д., львиная доля таких проектов, и это вина именно заказчиков, "Жадный платит дважды" - знаете такое?)
это meltn всегда, ибо каждый хочет подешевле.. ну кроме тех, кто реально обжегся уже
Цитата ("MMM_Corp"):
"Бедным и глупим народом легче управлять"да... пойду заставлю кого нить поработать
1594 повідомлення
601 повідомлення
1649 повідомлень
#15 років тому
Вот эта функция избавит от SQL-injectionfunction 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;
}
248 повідомлень
#15 років тому
Цитата ("maxim_belkin"):Очень хороший пример описан тут: ]http://www.softtime.ru/info/articlephp.php?id_arti...
Пример втопку.
Данные при вставке должны ескейпится(mysql_real_escape_string), ну и вставлятся строго между одинарных кавычек, тогда никаких sql injection не будет.