Посвящается Проктологам Перла и всем
озабоченным странными вещами перл-кодерам..

Как проверить, есть ли модуль в системе,
прямо в скрипте?

Ответ: Для этого нужно в самое начало
программы до строк 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

  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    0 комментариев
    Межтекстовые Отзывы
    Посмотреть все комментарии