Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 如何使用Unicode和/或表情符号处理来自web的表单输入?_Perl - Fatal编程技术网

Perl 如何使用Unicode和/或表情符号处理来自web的表单输入?

Perl 如何使用Unicode和/或表情符号处理来自web的表单输入?,perl,Perl,我正在编写代码,该代码接受来自基于web的表单的输入。在某些字段(如名字和姓氏)中,用户可以输入特殊字符,如umlauts。在其他字段中,如textarea注释,他们可以输入umlauts甚至表情符号。输入需要按照用户输入的方式进行处理。使用带有占位符的DBI查询将输入保存到MySQL 我需要解开查询中使用的所有输入吗?如果是这样,当来自用户的数据可能包含特殊字符和表情符号时,如何执行卸载 我可以使用类似于这个命令行测试的东西来解漆,但是umlauts和emoji被去掉了 #!/usr/bin/

我正在编写代码,该代码接受来自基于web的表单的输入。在某些字段(如名字和姓氏)中,用户可以输入特殊字符,如umlauts。在其他字段中,如textarea注释,他们可以输入umlauts甚至表情符号。输入需要按照用户输入的方式进行处理。使用带有占位符的DBI查询将输入保存到MySQL

我需要解开查询中使用的所有输入吗?如果是这样,当来自用户的数据可能包含特殊字符和表情符号时,如何执行卸载

我可以使用类似于这个命令行测试的东西来解漆,但是umlauts和emoji被去掉了

#!/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
的查询中的占位符数据,则不需要取消整饰

Bind值与SQL语句分开传递到数据库,因此无需在SQL引用规则中“包装”该值

最后,在我的测试中,umlaut和表情符号的处理似乎是正确的。浏览器中的输出看起来正确,数据库中的值也正确。我能够使用ascii术语和MySQL匹配适当的umlaut字符等进行搜索

  • CentOS 8
  • Perl5,版本26
  • MySQL 8.0.17(使用
    CHARSET=utf8mb4 COLLATE=utf8mb4\u 0900\u ai\u ci
  • DBI->connect(使用
    mysql\u enable\u utf8mb4=>1
  • 在Perl脚本中没有使用任何
    binmode
  • HTML在
    部分中有
使用以下方法处理输入:

use CGI;
use Encode qw(decode_utf8);
my $q = CGI->new;
my $v = Encode::decode_utf8($q->param('comment') || 0);

我提到所有这些细节是因为,尽管看起来一切都正常工作,但我仍然可能做错了什么。

污染是一种试图防止某些代码注入错误的机制。那么,您是在问如何使用SQL避免此类错误吗?顺便说一句,请确保对用户提供的值使用
$dbh->quote
或占位符(例如
插入…值(?,?)
),对用户提供的表和字段名使用
$dbh->quote_标识符
,除非您首先确保正则表达式模式匹配,否则不应使用
$1
。提示:
[a-z]|[a-z]|[0-9]|
是一种奇怪的书写方式
[a-za-Z0-9]
如果他们输入了umlaut,您可能会这样拼写他们的名字。不要试图为他们修改名字。污染是一种防止代码注入错误的机制。那么,您是在问如何使用SQL避免此类错误吗?顺便说一句,请确保对用户提供的值使用
$dbh->quote
或占位符(例如
插入…值(?,?)
),对用户提供的表和字段名使用
$dbh->quote_标识符
,除非您首先确保正则表达式模式匹配,否则不应使用
$1
。提示:
[a-z]|[a-z]|[0-9]|
是一种奇怪的书写方式
[a-za-Z0-9]
如果他们输入了umlaut,您可能会这样拼写他们的名字。不要试图给他们定个名字。