Пароли, настройки скриптов и любая другая информация, хранится в отдельных файлах, размещенных в каталоге, где находятся web-страницы и скрипты, бывает и так, что секретную информацию содержат и в теле программы. В итоге это позволяет просматривать содержимое файлов в экране стандартного браузера. Достаточно узнать имя и подготовить необходимый URI.
Существенная проблема для злоумышленника – получить информацию о пути к файлам. Если возможность просмотра www–директорий сервера ограничена или запрещена, единственным способ – работать методом последовательного перебора. При осмысленных именах файлов перебор не займет слишком много времени. Ошибки в реализации сетевых служб, да и самого сервера облегчает получить доступ к содержимому директории.
Решением данной проблемы видится в размещении секретных файлов таким образом, чтобы web-пользователи не имели прав доступа к ним или настроить web-сервер на запрет доступа к файлам, и он сам не видел этих файлов.
Секретные данные можно помещать в Perl–скрипт. При грамотной конфигурации web–сервера пользователи не смогут увидеть содержимое рабочего скрипта, а только результаты его деятельности. Скрипт сможет работать с самим собой как со стандартным текстовым документом. Для удобства используют лексему DATA, доступная через манипулятор.
Подобный прием гарантирует высокую степень защищенности данных, однако не всегда срабатывает. Web–сервера иногда из-за каких-то причин могут отображать не результаты работы, а содержимое самого скрипта.
Для злоумышленников основным объектом их охоты являются пароли, они зашифровываются через встроенный в языке Perl функцией crypt.
Простой пример программы аутентификации с функцией crypt смотрите ниже. В нем не используются привязки, из-за чего идентичные пароли могут иметь одинаковые хеши, что значительно снижает устойчивость к любому взлому с лобовыми переборами.
print "Password:"; #запрос пароля пользователя
$passwd=<>;
chop $passwd; #удаление символа \n
$encrypt=crypt($paswsd,"sl"); #вычисления хеша пароля
open (fh,"passwd") die; #открытие файла паролей
while($pass=){ #поиск подходящего пароля
chop $pass; #удаление символа \n
if ($pass eq $encrypt){ #подходящий пароль?
print "Password ok\n";
$flag=1; #пароль найден, установить флаг
break; #и выйти из цикла
}
}
if (!$flag) # если пароль не найден - выход
{print "BAD password!\n"; die;}