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 режим, входящий и исходящий.
