Александр Загородний
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' $answer = 'yes';
if (($_GET) == 'no' $answer = 'no';

и совать в запрос $answer вместо $_GET
Артём К.
1157 повідомлень
#15 років тому
Цитата ("maxim_belkin"):
обрабатываем переменные с помощью mysql_escape_string().


Вместо функции mysql_escape_string() лучше использовать более кондовую функцию mysql_real_escape_string()
Максим Б.
203 повідомлення
#15 років тому
Очень хороший пример описан тут:

Как бороться:
1. Выключаем magic_quotes на сервере;
2. Перед занесением в базу обрабатываем переменные с помощью mysql_escape_string().
Николай Г.
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, код должен быть чистым
Артём К.
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' $answer = 'yes';
if (($_GET) == 'no' $answer = '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 повідомлення
#15 років тому
Кстати, ЧПУ решают проблему? Например если строку Заменить на и делать SELECT * FROM `data` WHERE `type` =$_GET ?
Николай Г.
601 повідомлення
#15 років тому
Нет, конечно не решают. Злоумышленник пишет что-то типа ; и без проверки, получаете Вы баальшое веселье.
Сергей К.
1649 повідомлень
#15 років тому
Вот эта функция избавит от SQL-injection

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;
}
Фрилансер У.
248 повідомлень
#15 років тому
Цитата ("maxim_belkin"):
Очень хороший пример описан тут: ]http://www.softtime.ru/info/articlephp.php?id_arti...

Пример втопку.

Данные при вставке должны ескейпится(mysql_real_escape_string), ну и вставлятся строго между одинарных кавычек, тогда никаких sql injection не будет.