Серия постов "Стандарты кодирования Perl". Часть 4: Безопасность и надёжность кода.

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

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

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

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

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

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

Безопасность кода при работе с БД

Недопущение возможностей для SQL-inject:

Подстановка данных в SQL-запросы ТОЛЬКО через placeholders ("?").

Минимизация изменений тела запроса

В особых случаях (если необходимо подставить имя поля или название таблицы) допускается подстановка переменных напрямую в тело запроса, при этом должны быть соблюдены два условия:
если подставялется имя таблицы или поля, то оно обязательно заключается в кавычки (для MySQL):

'fieldname',

Вы должны быть АБСОЛЮТНО уверены в том, что значения переменных НЕ извлекается напрямую из входных параметров/переменных HTTP-запроса, а генерируется внутри кода и могут принимать только конечное дискретное множество значений.

SELECT '$fieldname' FROM '$table'

Для кросс-dbms приложений можно использовать DBI-метод quote_identifier:

my $quoted_fieldname = $dbh->quote_identifier( 'fieldname' );
my $sql = "SELECT $quoted_name FROM mytable";

 

Original: REG.RU coding standarts