![]() |
Модераторы: korob2001, ginnie |
![]() ![]() ![]() |
|
korob2001 |
|
||||||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 31 Всего: 61 |
Думаю для того, что бы действительно обезопасить CGI программу, нужно хорошо ознакомиться с переключателем -T.
Дам краткое описание этого перюключателя: Переключатель -T заставляет интерпретатор Perl делать проверку на загрязнение. В этом режиме интерпретатор Perl проверяет не пытается ли скрипт использовать данные из вне, что бы повлиять на что-то вне программы. Наприемер, он проверяет, не пытается ли скрипт вызвать системную команду, используя данные полученные из вне ( загрязнённые данные ), если эти данные не были очищены. Загрязнёнными данными считаются данные полученные через Web-форму, с терминала, из файлов и системных функций, переменных окружения. Загрязнённые данные нельзя использовать в командах изменяющих файлы, процессы, каталоги, команды оболочки. Можно испоьзовать загрязнёные данные только если передавать список грязных параметров фикции exec() или system(), это своего рода исключение, потому как елементы этого списка не проверяются на загрязнение поотдельности. Но если хотя бы один елемент в списке загрязнён, то весь список считается загрязнённым. Если чистой переменной присвоить значение грязной переменной, то чистая переменная становится грязной ( это примерно тоже, когда ты здароваешься за руку с товарищем, у которого рука вымазана в солидол ;))) ). Но для того, что бы данные считались чистыми, их можно очистить, прямо в программе. Правда из-за этого, прибавится в твоём коде около 10-15 строк, но поверь, это того стоит ;))) В наше время, в сети, очень много "товарищей", которые с удовольствием пытаются обойти защиту того или иного Web-узла и у многих это получается. Одни это делают с каким-то злым умыслом, другие - просто, ради спортивного интереса ;))))). А получается у них это потому, что большинство Web-разработчиков, просто не думают о безопасности или думают но не достаточно серьёзно. Большинство расчитывает только на регулярные выражения, но в них легко ошибиться. Меня больше всего поражают такие проверки данных:
Но это уже лирика, это их дело. На самом деле можно обойтись и без перключателя -T, как правило хватает проверки данных одними регулярными выражениями. Но когда программа принимает много параметров, то можно легко ошибиться, например можно пропустить проверку одной или нескольких переменных, что бы этого не происходило мы воспользуемся переключателем -T, который будет заставлять нас очищать переменные, если же мы попытаемся использовать грязную переменную опасным способом, то получим примерно такую ошибку: Insecure dependency in unlink while running with -T switch Интерпретатор Perl с включённым переключателем -T не дал удалить файл имя которого было переданно через Web-форму, это говорит о том, что загрязнённая переменная не была очищена. О том как очищать переменную, мы поговорим чуть позже, а сейчас давай создадим отдельный каталог в каталоге /cgi-bin, я назвал его warning, т.е. получился такой путь: /cgi-bin/warning. После этого создим в этом каталоге несколько текстовых файлов, с любыми именами, можно пустые. Теперь напишите или просто скопируйте такой код:
Это типичная, очень опасная, CGI программа. Она выводит в браузер выподающий список, в котором будут перечислены все текстовые файлы текущего каталога, а также будет выведена кнопка типа SUBMIT "Удалить". Сохраните её в файл с именем remover.pl, в тот же каталог, где ранее мы создавали текстовые файлы. Теперь можно протестировать работоспособность программы. Для этого просто нужно выбрать файл, который вы хотите удалить и нажать кнопку "Удалить". После чего можно проверить содержимое нашего каталога через проводник, и заметить то, что файл с указанным именем дейстаительно был удалён. На первый взляд ничего особенного не произошло, мы добились чего хотели. Теперь создим копию нашего каталога на рабочий стол или ещё куда-нибудь, как вам удобнее. Теперь давай разберёмся, чем опасна выше-приведённая программа. Мы выводим список допустимых для удаления файлов, рабочий файл нашей программы в этот список не входит, потому как мы отфильтровали текстовые файлы от других файлов в этой строке:
Я так же намеренно использовал метод GET при передачи данных, что бы явно было видно передаваемые параметры в адресной строке браузера. Надеюсь копию нашего каталога вы уже сделали. Тепрь рассмотрим что не хорошего можно было бы сделать с нашим примером. Запустите наш приемер в браузере и повторите действия которые вы уже делали, для того, что бы удалить один из текстовых файлов, после чего обратите внимание на адресную строку браузера. Она выглядит примерно так: http://localhost/cgi-bin/warning/remover.pl?text_files=file.txt&del=%D3%E4%E0%EB%E8%F2%FC Теперь давай изменим перадаваемый параметр text_files таким образом text_files=remover.pl, т.е. теперь наш url должен выглядить примерно так: http://localhost/cgi-bin/security/remover.pl?text_files=remover.pl&del=%D3%E4%E0%EB%E8%F2%FC Убедитесь в том, что вы сделали резервную копию рабочего файла и нажмите ENTER. После этого проверьте наш каталог, не трудно заметить что рабочего файла там больше нет. Это простейший пример подмены данных, а теперь давайте попробуем обезопасить нашу программу. Просто добавив в первую строку кода переключатель -T, теперь первая стока нашего кода дожна выглядеть примерно так:
Сохраните этот файл в тот же каталог, с тем же именем, которое было раньше и запустите его на выполнение. Теперь попробуем удалить один из файлов из выподающего списка. На что получим примерно такую ошибку: Insecure dependency in unlink while running with -T switch at ...../remover.pl line 39. Проверив наш каталог, можно заметить, что желаемый файл не был удалён. Это переключатель -T не дал выпольниться опасной операции из-за использования в ней загрязнённых данных. Теперь перейдём к самой интересной части, очистке данных. Для того, что бы очистить данные, необходимо сделать обычное присвоение разрешённых данных переменной внутри программы, тогда эти данные уже не будут считаться загрязнёнными. Но здесь есть одно НО. Как я уже говорил выше, если присвоить значение загрязнённой переменной чистой перемнной, например:
то переменные $file и $f будут тоже загрязнены, таким действием мы как бы пачкаем переменные. Нельзя присваивать новой переменной значение грязной переменной. Как же всё же очистить переменную???? Оказуется достаточно, простого, регулярного выражения, но мы напишем одну не большую подпрограмму, которая будет пытаться "отмыть" грязные переменные и другая подпрограмма понадобится для того, что бы определить является ли переданная ей переменная загрязнённой. Изменим наш код на такой:
Теперь попробуйте провести те эксперементы, которые мы проводили выше, я имею ввиду удаление файла с расширением отличным от .txt . Я постарался всё описать в коментариях. Для такого простого примера достаточно было бы простой проверки регулярными выражениями, но когда программа принимает много параметров, вы можете просто забыть проверить на корретность один из параметров, что может привести к непредсказуемым последствиям. Если включён переключатель -T, то Perl как бы подстраховует вас от опасности, потому как если вы забудете проверить один из параметров, то он останется грязным и Perl не даст ему повлиять на внешнюю среду, а просто выведет сообщение об ошибке. Вот собственно и всё по данной теме. Удачи. -------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
||||||||||||
|
|||||||||||||
![]() ![]() ![]() |
Правила форума "Perl" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Perl: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |