![]() |
Модераторы: korob2001, ginnie |
![]() ![]() ![]() |
|
trigger |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 103 Регистрация: 12.7.2006 Репутация: нет Всего: нет |
Приветствую.
вчера обнаружил что простой инъекцией можно не только очистить содержимое таблиц, но и удалять таблицы. данные передаются get.ом. В основном это только цыфры - IDшники таблиц и т.д. Подскажите плз что сделать, чтобы обезопасить приложение от подобных случаев. и на сколько достаточно будет следующее:
Это сообщение отредактировал(а) trigger - 26.9.2007, 13:47 |
|||
|
||||
nitr |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2543 Регистрация: 10.2.2006 Где: Россия :) Репутация: 12 Всего: 84 |
trigger, прочесть надо perldoc DBI, затем доку по драйверу к БД mySQL (или что используете).
Ещё можно посмотреть метод quote(); - экранирует спец. символы... Ещё стоит пересмотреть ваше "приложение", т.к. передавать данные через запросы, т.е. к примеру, db.pl?insert=...&table=... , что-то подобное, это "совсем не есть гуд" ![]() Я, например, использую CGI::Application, пишу свои плагины (если требуется) и т.п. Многие скажут, что лучше воспользоваться Catalyst. К чему я вел, прочитайте про фреймворки, меньше мороки будет, да и (если в случае успеха) получите отличные "проекты"... Но это за рамками данной темы. Добавлено через 1 минуту и 53 секунды Да и по-гуглить стоит, слишком много лит-ры по этой теме. |
|||
|
||||
comtat |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1310 Регистрация: 2.5.2006 Где: Россия, Казань Репутация: нет Всего: 71 |
Самый действенный и простой способ защиты от sql инъекций - это
перед выполнением запроса проверять соответствие входных данных типу. Если есть несоответствие то нечего не записываем и тд. У меня делается это примерно так, через свой класс
Для каждого поля теперь определен свой тип и перед выполнением делается проверка
И все .. При том не разу не подводило ;) -------------------- Рожденный в СССР !!! ExtJS - мой фреймворк |
||||
|
|||||
biophreak |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 72 Регистрация: 13.5.2007 Репутация: нет Всего: нет |
Я, например делаю так:
Определю, что должно и не должно передаваться в конкретном запросе... Далее вырезаю все не нужно по принципу ~s///; =) Гемморно конечно мониторить каждый запрос, но что делать. ![]() |
|||
|
||||
trigger |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 103 Регистрация: 12.7.2006 Репутация: нет Всего: нет |
Благодарю всех за рекомендации ) .
Жаль, что кроме как перелопачивание входящих данных - другого пути нет! ... будем резать будем бить .... |
|||
|
||||
xtrasns |
|
|||
Новичок Профиль Группа: Участник Сообщений: 38 Регистрация: 13.5.2007 Репутация: нет Всего: нет |
можно попдробнее, что за метод quote(); ?? Я его в доках не нашел ... |
|||
|
||||
nitr |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2543 Регистрация: 10.2.2006 Где: Россия :) Репутация: 12 Всего: 84 |
xtrasns, и снова вы
![]() Во-первых, вы поднимаете тему, которая явно "решена", во-вторых, в документации она есть, вы очень невнимательны. perldoc DBI а ещё, купите вы наконец-то книги по Perl, даже там есть хоть и короткое, но правильное определение ![]() Добавлено через 2 минуты и 18 секунд
Добавлено через 2 минуты и 38 секунд Это всё в документации... |
|||
|
||||
ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 4 Всего: 49 |
Уважаемые коллеги!
Я использую placeholders и считаю это самым эффективным средством от SQL injection, в редких случаях, когда их использование невозможно, приходится "изобретать велосипеды" ![]() -------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
nitr |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2543 Регистрация: 10.2.2006 Где: Россия :) Репутация: 12 Всего: 84 |
ginnie, конечно это вариант. Но не всегда может применяться, да и бывает неудобно, но многие их используют, всем известно из документации, что оно сразу подставляется "экранированным"
![]() |
|||
|
||||
ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 4 Всего: 49 |
Уважаемый nitr, позвольте добавить, что placeholders используются после лексического разбора запроса СУБД, поэтому наличие или отсутствие "экранирования" уже никак на возможность использования SQL injection не влияет.
P.S. Функциональность справедлива для СУБД, которые поддерживают placeholders. Это сообщение отредактировал(а) ginnie - 7.1.2008, 02:30 -------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
nitr |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2543 Регистрация: 10.2.2006 Где: Россия :) Репутация: 12 Всего: 84 |
Спасибо за разъяснение
![]() Моё рассуждение актуально для bind. |
|||
|
||||
ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 4 Всего: 49 |
Чтобы не быть голословным привожу пример своего кода, использующего placeholders
Это сообщение отредактировал(а) ginnie - 7.1.2008, 12:40 -------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
Vaneska |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 141 Регистрация: 15.3.2005 Где: Москва Репутация: 1 Всего: 4 |
Есть еще способ, используемый как доп. защита и по большей части красивость для пользователя.
Он больше не к перлу правда относится. Для этого способа нужен apache и mod_rewrite Вот пример. Допустим есть у нас каталог какого-то товара. Мы хотим вывести на страничку товар с id = 123 для этого в вводим в строку запроса браузера такой url mysite.ru/catalog/good/123 в перле обрабатываем этот урл и получаем нужный id В .htaccess задается такая строчка
эта строчка позволяет обросить все лишние символы. валидными урлами становятся например mysite.ru/catalog/group/123 (список товаров в группе) mysite.ru/catalog/good/delete/123 (удаление товара) Таким способом можно безболезненно передавать в бд любые числовые параметры и те символьные, которые проходят регексп. Так что в принципе можно и не проверять эти параметры. А вообще я использую все 3 способа одновременно. 1. Этот способ 2. проверка входных параметров с помощью специальной функции вида
3. placeholders --------------------
http://isokolov.blogspot.com/ |
||||
|
|||||
frenkys |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 185 Регистрация: 18.6.2005 Репутация: нет Всего: 1 |
Вот еще как вариант вставлять переменные после компиляции мускула
--------------------
niva[frenky] |
|||
|
||||
DSCL |
|
|||
Новичок Профиль Группа: Участник Сообщений: 1 Регистрация: 12.2.2008 Репутация: -1 Всего: нет |
Кто хочет теорию по атаке SQL - injection ?
![]() |
|||
|
||||
trigger |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 103 Регистрация: 12.7.2006 Репутация: нет Всего: нет |
..
Это сообщение отредактировал(а) trigger - 12.2.2008, 13:55 |
|||
|
||||
BlackLFL |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 263 Регистрация: 15.9.2005 Где: Москва Репутация: 3 Всего: 12 |
Как уже упоминал ginnie, применение placeholders, действительно является самым эффективным способом, особенно для базы данных Oracle ( увеличение производительности )
|
|||
|
||||
gcc |
|
||||||||
![]() Агент алкомафии ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2691 Регистрация: 25.4.2008 Где: %&й Репутация: 2 Всего: 17 |
подскажите, пожалуйста, есть большая очень нагрузка на index.pl и именно очень сильно на CPU
но на MySQL - "0" нагрузки все работает в CGI для того чтобы MySQL экранировала используя параметрические запросы, нужно включить mysql_server_prepare=1 ?
ВОПРОС: ... без этого сам perl тратит много ресурсов на экранирование?? http://search.cpan.org/~capttofu/DBD-mysql...ib/DBD/mysql.pm
Добавлено @ 23:57 кстате, а что вот это такое имеется ввиду??
... что этот знак ';' не экранируется? и что тут
будет инъекция? в IN ? http://forum.vingrad.ru/forum/topic-309184.html или нет? Это сообщение отредактировал(а) gcc - 29.9.2010, 00:10 |
||||||||
|
|||||||||
steyraug |
|
|||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 22.8.2010 Репутация: нет Всего: нет |
А что народ скажет насчет применения функции int() к переданному GET-параметру?
Это сообщение отредактировал(а) steyraug - 27.10.2010, 22:43 |
|||
|
||||
ming |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 97 Регистрация: 30.1.2009 Где: Новосибирск Репутация: нет Всего: 3 |
а что тут скажешь? для целочисленных данных может и сгодится, а для строковых int бессилен
|
|||
|
||||
steyraug |
|
|||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 22.8.2010 Репутация: нет Всего: нет |
Ну это и ежу понятно, что для строковых параметров [b]int[] нах не нужен.
|
|||
|
||||
gcc |
|
||||
![]() Агент алкомафии ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2691 Регистрация: 25.4.2008 Где: %&й Репутация: 2 Всего: 17 |
можно как тут:
http://forum.vingrad.ru/index.php?showtopi...t&p=2209139
Это сообщение отредактировал(а) gcc - 1.11.2010, 23:35 |
||||
|
|||||
noneg |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 43 Регистрация: 21.1.2011 Репутация: нет Всего: нет |
"Безопасное программирование на языке perl (Крис Касперски)"
книжка небольшая...интересно будем всем наверно почитать.. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Perl: CGI программирование" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Perl: разработка для Web | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |