Perl вставляет ложные символы в большие блоки текста в электронной почте - PullRequest
1 голос
/ 26 мая 2011

Я делаю обслуживание в сети для Perl (у меня нет знаний по Perl).Детали в форме по электронной почте для кого-то, чтобы обращаться.Тестер вернулся с этой ошибкой в ​​электронном письме:

В большие блоки текста вставлены ложные символы.Срабатывает примерно в 1961 символе в каждом текстовом поле или текстовой области.Восклицательный знак и пробел вставляются примерно в 1961 году, затем через восемь символов пробел, а затем повторяются примерно каждые 2048 символов.

Итак, я попытался повторить эту ошибку, и это то, что она возвращала1970):

a!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
}

EDIT Это функция, которая отправляет 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 ]

5 голосов
/ 26 мая 2011

Я не думаю, что это происходит внутри вашей Perl-программы.

Я видел это раньше, когда пытался отправить что-то по почте, отправив его в sendmail.В спецификациях почты есть ограничение на длину строки, но я подозреваю, что sendmail использует 2048-байтовый буфер ввода.

Дело в том, что вы удаляете все разрывы строк из ввода (преобразуя их в <br>Перед тем, как отправлять его в sendmail.Не.Возможно, добавьте это в качестве последней замены:

    $input =~ s/<br>/<br>\r\n/gi;                      # break up the single line

(Тот факт, что вы получаете меньшее расстояние до первого !, чем до следующего, заставляет меня подозревать, что sendmail считает ведущие биты HTML как частьта же самая строка - формат RFC 822 требует \r\n разрывов строк).

Кроме того, если пользователь может ввести разглагольствование на 3 КБ без разрывов строк, вы можете захотеть разбивать строки на пустом месте вместо оригинальных разрывов строк.

РЕДАКТИРОВАТЬ: Просто заметил, что мое регулярное выражение убрал пердеть <br> - мозг.Лучше сейчас?

3 голосов
/ 26 мая 2011

Кажется маловероятным (невозможным), что perl делает это случайным образом.Должна быть либо ошибка в коде, либо в любом процессе, который передает данные в perl.

У нас недостаточно информации для дальнейших предположений.

2 голосов
/ 26 мая 2011

На первый взгляд эти регулярные выражения выглядят для меня так, будто они могут потерять первое? символ в:

$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 будет соответствовать [->] символам.

...