Perl将虚假字符插入电子邮件中的大块文本中

时间:2011-05-26 01:42:59

标签: perl string html-email

我正在网上完成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/&/&amp;/gi;                      # & to &amp;
    $input =~ s/</&lt;/gi;                       # < to &lt;
    $input =~ s/>/&gt;/gi;                       # > to &gt;
    $input =~ s/"/&#34;/gi;                      # " to &#34;
    $input =~ s/'/&#39;/gi;                      # ' to &#39;
    $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);
}

3 个答案:

答案 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;]个字符。