我正在网上完成Perl的操作(我对Perl一无所知)。表单中的详细信息将通过电子邮件发送给某人处理。测试人员在电子邮件中回复了这个错误:
大块文本插入了虚假字符。大约在1961年触发 每个文本字段或文本区域中的字符。插入感叹号和空格 大约1961年,然后是八个字符的空格,然后大约每2048个字符重复一次。
所以我试图重复这个错误,这就是它返回的内容(字符1960 - 1970):
一个! defghij
我不知道会导致这种情况发生的原因。我能想到“解决”它的唯一方法就是这样做:
if (length($someInput) gt 1500){
$someInput=substr($someInput, 0, 1500);
}
有没有人知道在Perl中发生这种情况的原因,以及我如何解决它?
修改 这是我运行每个字段的功能。然后它就会被放入电子邮件html。
#sanitises and returns the given input
sub sanitiseInput {
my ($input) = @_;
$input = trim(param($input));
$input = HTML::Entities::decode($input);
$input =~ s/<script[^>]*?>.*?<\/script>//gi; # strip out javascript
$input =~ s/<style[^>]*?>.*?<\/style>//gi; # strip out styles
$input =~ s/<![\s\S]*?--[ \t\n\r]*>//gi; # strip out multi-line comments
$input =~ s/&/&/gi; # & to &
$input =~ s/</</gi; # < to <
$input =~ s/>/>/gi; # > to >
$input =~ s/"/"/gi; # " to "
$input =~ s/'/'/gi; # ' to '
$input =~ s/\r\n/<br>/gi; # return and newline to <br>
$input =~ s/\r/<br>/gi; # return to <br>
$input =~ s/\n/<br>/gi; # newline to <br>
return $input; #return the new value
}
编辑这是电子邮件html的功能
sub mailer {
my ($from_eddress, $to_eddress, $subject, $mail_content, $fail_eddress)=@_;
open(MAIL, "|/usr/sbin/sendmail -f $from_eddress $to_eddress") or print "Cannot fork to mail - $!\n";
print MAIL "From: $from_eddress\n";
print MAIL "To: $to_eddress \n";
print MAIL "Subject: $subject\n";
if ($fail_eddress != '') { print MAIL "fail-to: $fail_eddress\n"; }
print MAIL "Content-type: text/html\n\n";
print MAIL "\n";
print MAIL "<html><head><style>body, p, th, td {font-size: 0.75em; font-family: Arial, Helvetica, sans-serif;} a {font-size: 1em; font-family: Arial, Helvetica, sans-serif;} .large{font-size: 1.2em;} .small{font-size: .8em;} </style></head><body>";
print MAIL "$mail_content";
print MAIL "</body></html>";
close (MAIL);
}
答案 0 :(得分:5)
我认为它不会发生在你的Perl程序中。
我之前在尝试通过将其发送到sendmail来邮件时看到了这一点。邮件规范中有一个行长度限制,但实际上我怀疑sendmail使用的是2048字节的输入缓冲区。
重点是,在将数据传输到sendmail之前,您要从输入中删除所有换行符(将它们转换为<br>
)。别。也许将其添加为最后一个替换:
$input =~ s/<br>/<br>\r\n/gi; # break up the single line
(事实上你到第一个!
的距离比到下一个\r\n
的距离更低,这让我怀疑sendmail将前导HTML位计为同一行的一部分 - RFC 822格式要求{{ 1}}换行符。
此外,如果用户可能输入没有换行符的3kb rant,您可能希望在原始空格分隔符上打破空白行。
编辑:刚刚注意到我的正则表达式取消了<br>
- 脑屁。现在好些了吗?
答案 1 :(得分:3)
似乎不太可能(不可能)perl随机执行此操作。必须在代码中或在将数据提供给perl的任何过程中存在错误。
我们没有足够的信息进一步推测。
答案 2 :(得分:2)
乍一看,这些正则表达式看起来像他们可能会失去第一个?角色:
$input =~ s/<script[^>]*?>.*?<\/script>//gi; # strip out javascript
$input =~ s/<style[^>]*?>.*?<\/style>//gi; # strip out styles
$input =~ s/<![\s\S]*?--[ \t\n\r]*>//gi; # strip out multi-line comments
此外,我列出的最后一个正则表达式可能有问题
$input =~ s/<![\s\S]*?--[ \t\n\r]*>//gi; # strip out multi-line comments
[\ s \ S]中的\ S可以匹配多行注释的结尾,因为\ S会匹配[ - &gt;]个字符。