Серия постов "Стандарты кодирования 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