Я работаю над кодом, который принимает данные из веб-формы. В некоторых полях (например, имя и фамилия) пользователи могут вводить специальные символы, такие как умляуты. В других областях, таких как комментарии в текстовой области, они могут вводить умляуты или даже смайлики. Ввод должен быть обработан как введенный пользователем. Входные данные сохраняются в MySQL с использованием запросов DBI с заполнителями.
Нужно ли отменять все входные данные, используемые в запросах? И если да, то как выполняется untaint, когда данные от пользователей могут содержать специальные символы и эмодзи?
Я не могу использовать что-то вроде этого теста командной строки, но умляуты и эмодзи удаляются.
#!/usr/bin/perl -T
use strict;
use warnings;
use Scalar::Util qw(tainted);
my $v = shift || die 'nothing';
$v =~ /(([a-z]|[A-Z]|[0-9]| )+)/;
$v = $1;
if (tainted($v)) {
die 'input is tainted';
}
print "$v\n";
exit;
Редактировать
Основываясь на дальнейшем тестировании и комментариях, я пришел к следующим выводам:
Если входные данные будут использоваться только в качестве заполнителей в запросе с $dbh->bind_param
, untaint не требуется.
"Значения привязки передаются в базу данных отдельно от оператора SQL, поэтому нет необходимости« заключать »значение в SQL правила цитирования."
Наконец, обработка символов умляута и смайликов в моем тесте кажется правильной. Вывод в браузере выглядит корректно, а значения в базе данных также выглядят корректно. Я могу выполнять поиск по терминам ascii, и MySQL соответствует соответствующим символам умлаута и т. Д. c.
- CentOS 8
- Perl 5, версия 26
- MySQL 8.0.17 (с использованием
CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
) - DBI-> connect (с использованием
mysql_enable_utf8mb4 => 1
) - Нет
binmode
используется в Perl script - HTML имеет
<meta charset="utf-8">
в секции <head>
Ввод обрабатывается с использованием:
use CGI;
use Encode qw(decode_utf8);
my $q = CGI->new;
my $v = Encode::decode_utf8($q->param('comment') || 0);
Я упоминаю все эти детали, потому что, хотя, похоже, все работает правильно, я все равно могу делать что-то не так.