Как обрабатывать ввод данных из Интернета с помощью Unicode и / или Emoji? - PullRequest
1 голос
/ 11 апреля 2020

Я работаю над кодом, который принимает данные из веб-формы. В некоторых полях (например, имя и фамилия) пользователи могут вводить специальные символы, такие как умляуты. В других областях, таких как комментарии в текстовой области, они могут вводить умляуты или даже смайлики. Ввод должен быть обработан как введенный пользователем. Входные данные сохраняются в 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);

Я упоминаю все эти детали, потому что, хотя, похоже, все работает правильно, я все равно могу делать что-то не так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...