Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #69, СЕНТЯБРЬ 2004 г.

Железный скрипт

Докучаев Дмитрий aka Forb

Xakep, номер #069, стр. 069-130-4


Кроме этого, всегда используй опцию компилятора –w, которая выдает в STDERR так называемые предупреждения. Это не ошибки, однако код со множественными варнингами, как правило, небезопасен.

Юзать или не юзать?

Наконец, мы подошли к основному вопросу: чей код лучше использовать? Я не сторонник фриварных скриптов, но и не могу заставить отказаться от них. Решай сам: если сценарий заслуживает доверия и ты знаешь его код как свои 20 пальцев, – смело используй его в работе. Если же скрипт выглядит убого, а в исходнике нет ни одной проверки на спецсимволы – лучше напиши свой проект. Пусть он будет не слишком функциональным, зато тебя не сломает ни один хакер.

Ошибка с номером 500

Меня часто спрашивают, по какой причине браузер выдает ошибку 500 при подаче запроса к сценарию. Так как моя задача – научить тебя кодить без ошибок, я просто обязан упомянуть про этот коварный баг. Ошибка 500 может появиться в следующих случаях:

1. Не оформлен хидер. Основное отличие консольного приложения от CGI-скрипта в том, что во втором случае браузеру обязательно пересылается тип данных. Поэтому убедись, что в твоем коде перед первым оператором print встречается строка print "Content-type: text/html\n\n";

2. Неверный путь к интерпретатору. Удостоверься, что первая строчка в скрипте оформлена в виде правильного пути к Perl. На сервере интерпретатор может лежать в /usr/local/bin, а в сценарии указываться в виде /usr/bin. Данная проблема актуальна, в основном, для Windows-кодеров, где Perl может находиться в любой папке.

3. Присутствие синтаксических ошибок в коде. Прежде чем проверять скрипт через браузер, запусти его в консоли с ключиком –c. И только после положительного ответа интерпретатора, продолжай тестирование из web’а.

4. Присутствие символа «\r». Символ перевода каретки означает, что скрипт был залит в бинарном режиме. Переключи режим передачи в ASCII, либо набери консольную команду type ascii, и только потом закачивай сценарий на удаленный сервер.

Защищайся регвыром!

Самый популярный способ изоляции входных переменных от посторонних символов – регулярные выражения. Если честно, научиться регвырам довольно сложно. Даже я, несмотря на большой опыт в программировании, до сих пор не освоил эту прекрасную возможность языка. Но азы регулярных выражений я знаю, поэтому привожу несколько простых шаблонов, которые позволят усилить безопасность твоего скрипта.

~s/[\&\;\\\/\.\> \<\’\|\n\r\t]//g; - конструкция для удаления из переменной посторонних символов. Как ты понял, чары просто перечисляются в [] (естественно, если символы являются специальными, их надо экранировать).

if ($in=~/[\;\|]/) { die print "You are lamer\n" } – можно также припугнуть взломщика, сказав ему, что ты следишь за своим кодом :).

$in=~s/\D//g; - удаление из переменной всех нечисловых символов. Бывает полезным при анализе номера страницы, сообщения etc.

$in=~s/\W//g; - то же самое, только переменная должна принимать буквенное значение (пробелы не в счет).

$in=~s/\0//g; - уже известное тебе удаление нуль-байта.

Назад на стр. 069-130-3  Содержание  Вперед на стр. 069-130-5