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