Посвящается Проктологам Перла и всем
озабоченным странными вещами перл-кодерам..
Как проверить, есть ли модуль в системе,
прямо в скрипте?
Ответ: Для этого нужно в самое начало
программы до строк use и require этот код,
соответственно, если вы используете вместо
use, require, то просто замените его, если вам
требуется проверить больше модулей,
сделайте обычный массив из нужных вам
модулей и перебирайте его, делая такую
проверку для каждого элемента массива (код
вставлять в самое начало после строки #!):
BEGIN {
unless (eval "use Xakep") { print "Not found! Xakep $@"; }}
Скрипт выдает сообщение об ошибке, тем
самым выдавая внутренние данные скрипта и
сервера, тем самым повышая риск обнаружения
дыр в скрипте, что делать?
Ответ: Для начала попытайтесь проверять
передаваемые скрипту данные на нехорошие
символы типа: | ; если вы не уверены, как и где
возможен вывод ошибки, воспользуйтесь
модулем CGI::Carp для перенаправления
сообщений об ошибках в файл для
последующего изучения (код вставлять в
самое начало после строки #!):
BEGIN {
use CGI::Carp qw(carpout);
open (LOG, ">>some/dir/script_error.log");
carpout (*LOG);
}
Нужно хранить данные так, чтобы их
нельзя было перезаписать, не имея полного
доступа к скрипту!
Ответ: Очень просто, используйте лексемы
__DATA__ и __END__, обращение производится, как к
обычному файлу, но без возможности записи в
него!:
# лексема __DATA__
while (<DATA>) {
# обычная работа со строкой
}
#следующий код вставляется в конец кода
программы
__DATA__
# любые данные
# лексема __END__
while (<main::DATA>) {
# обычная работа со строкой
}
#следующий код вставляется в конец кода
программы
__END__
# любые данные
Хочу поставить новый модуль на сервер,
но нет прав для инсталляции!, как быть?
Ответ: Закачивать нужный модуль в любую
папку и творить чудеса (код вставлять в
самое начало после строки #!):
push (@ISA, 'NEW PATH');
Скрипт работает с сокетами и на сервере
постоянно выдает ошибку 500, но синтаксис
правильный, что делать?
Ответ: Запретите буферизацию! вот так:
$fh = select (FILE_HANDLE);
$| = 1;
select ($fh);
#или можно так:
use IO::Handle;
FILE_HANDLE->autoflush(1);
#Вместо FILE_HANDLE может быть скаляр,
ссылающийся на файловый манипулятор
use IO::Handle;
$handle->autoflush(1);
Скрипт выдает ошибку 500 безо всяких
причин!
Ответ: Возможно, ваш скрипт направляет в STDERR
предупреждения, и сервер видит их раньше,
чем заголовок HTTP! (код вставлять в самое
начало после строки #!):
$| = 1;
При написании статьи была использована
документация O'REILLY
P.S.
..И открыл легкомысленно уста свои,
и безрассудно расточал слова.
Книга Иова, 35:16