Perl

Perl DBI, доступный на CPAN, поддерживает параметризованные SQL запросы. Оба метода — do и prepare — поддерживают параметры (они называются "метками") для большинства баз данных. Например:

$sth = $dbh->prepare("SELECT * FROM users WHERE email = ?");
foreach my $email (@emails) {
    $sth->execute($email);
    $row = $sth->fetchrow_hashref;
    [...]
}

Однако параметризацию нельзя использовать для идентификаторов (имен таблиц, имен колонок), поэтому необходимо использовать метод DBI quote_identifier():

# Убедимся, что имя таблицы, которое мы хотим использовать, является безопасным:
my $quoted_table_name = $dbh->quote_identifier($table_name);

# Предполагается, что @cols содержит список имен колонок, из которых вы хотите выбрать данные:
my $cols = join ',', map { $dbh->quote_identifier($_) } @cols;

my $sth = $dbh->prepare("SELECT $cols FROM $quoted_table_name ...");

Вы можете также вручную писать запросы с использованием DBIx::Class, SQL::Abstract и т.д., которые сгенерируют нужный SQL код.

Режим Taint

Режим Taint содержит набор специальных проверок безопасности, который Perl выполняет над входными данными вашей программы. Входные данные помечаются "грязными" (не проверенными) и не могут быть использованы в командах, с помощью которых вы можете выстрелить себе в ногу. За более детальной информацией обратитесь к странице помощи per lsec.

Включение taint режима:

# Из командной строки
perl -T program.pl

# В начале скрипта
#!/usr/bin/perl -T

"Когда в приложении не срабатывает какая-либо проверка, возникает ошибка. Для отладки используйте параметр -t: вместо ошибок будут выдаватьсчя предупреждения. -t не является заменой -T.

Список дел

Объяснить, как DBI поддерживаем taint режим, входящий и исходящий.

Fork me on GitHub