Безопасность кода при работе с БД
1. Недопущение возможностей для SQL-inject:
Подстановка данных в SQL-запросы ТОЛЬКО через placeholders ("?").
2. Минимизация изменений тела запроса
В особых случаях (если необходимо подставить имя поля или название таблицы) допускается подстановка переменных напрямую в тело запроса, при этом должны быть соблюдены два условия:
- если подставялется имя таблицы или поля, то оно обязательно заключается в кавычки (для 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";