Безопасность и надёжность кода

1. Осторожное использование вызовов внешних команд

Прямое использование внешних вызовов команд (через "system" или "``") допускается только в особых случаях, при этом, если командная строка формируется внутри кода, необходимо быть абсолютно уверенным, что в командную строку не могут попасть входные переменные и параметры HTTP-запроса (см. п. 2).

Кроме того, НЕ СЛЕДУЕТ использовать qx и system в коде контроллеров. Эти вызовы могут быть сосредоточены только в коде ядра системы и соответствующие функции обязательно должны быть покрыты тестами (проверяющими невозможность использования эксплойтов).

2. Всегда проверяйте коды возврата системных вызовов

Всегда проверяйте коды возврата системных вызовов. Если ошибка фатальна — вызывайте исключение с помощью die, Carp::confess или Carp::croak, передавая соответствующее сообщение об ошибке. Хорошее сообщение об ошибке должно включать: в каком месте программы возникла проблема, какой системный вызов был произведен, с какими аргументами, и (ОЧЕНЬ ВАЖНО) должно содержать стандартное системное описание ошибки.
Пример:

open( my $fh, ">", $filename ) or die "Can't open $filename for writing: $!";
print   $fh '....';

3. Обработка исключений

При реализации обработки исключений, лучше использовать:

        eval {
            ...
            1;
        } or do {
            ...
        };

смысл eval-do в том что блок обработки ошибок (в "do") должен следовать непосредственно после eval, чтобы между ними нельзя было вставить какой-то другой код (который может испортить $@), так же решение о том, было ли исключение или нет, должно приниматься на основе кода возврата eval{} а не на основе переменной $@.

Если в данном конкретном eval-do не удобен, допустимы другие конструкции, основанные на том же принципе (однако для консистентности лучше попытаться всё же использовать eval-do):

        if (eval { ...; 1 }) {
            ...
        }
        else {
            ...
        }

        ok ! eval { ...; 1 }, "some test";

если в блоке обработке ошибок мы не анализируем $@, отступление от этого правила (в части $@) допустимо:

    my $success = eval {
        ...
        1;
    };

    ...

    if ($success) {
        ...
    }
    else {
        ...
    }

если речь идёт не о паттерне программирования "обработка исключений" (а о каком-то системном программировании, о eval EXPR), то допускается отходить от этого правила, если это сделает код лучше.

Вернуться к списку