スクリプトに変更を加えることなく、突然上記のエラーの受信を開始しました。
ホストは1and1です(わかっています...)
スクリプトはまだ別のサーバーで正常に動作するため、ホストが無知を訴えているにも関わらず、これにつながるサーバー構成の変更があったに違いないと私は疑っています。
Googleには、上記のエラーに関する情報はまったくありません。誰にもアイデアはありますか?サーバーがApacheを実行している場合、それが役立ちます。
同様の問題がありました。
青から出てきました。いいえPHPコードが変更されました。
変更点:PHPが5.5.25-1から5.5.26にアップグレードされました。
PHP mail()
関数のセキュリティリスクが修正され、additional_headers
の余分な改行は許可されなくなりました。そして、誰かがヘッダーを介していくつかの改行を挿入し、その後に邪悪なメッセージが続くことを望みません。
以前はうまく機能していたもの、例えばヘッダーの後に余分な改行を追加するだけでなく、メッセージ全体をadditional_headers
に渡すこともできなくなります。
ソリューション:
additional_headers
引数に複数の改行はありません。これらは「複数または不正な形式の改行」としてカウントされます:\r\r, \r\0, \r\n\r\n, \n\n, \n\0
。additional_headers
はヘッダーのみに使用します。電子メールメッセージ(マルチパートかどうか、添付ファイルなしのirなど)は、ヘッダーではなくmessage
引数に属します。PHPセキュリティバグレポート: https://bugs.php.net/bug.php?id=68776
Cコードdiffの修正方法: http://git.php.net/?p=php-src.git;a=blobdiff;f=ext/standard/mail.c HP = 1ebc8fecb7ef4c266a341cdc701f0686d6482242; HB = 9d168b863e007c4e15ebe4d2eecabdf8b0582e30; HPB = eee8b6c33fc968ef8c496db8fb54e8c9d9d5a8f9 ; = 448013a472a3466245e64b1cb37a9d1b0f7c007e H
上記の答えはどれも私にとってこの問題を解決しませんでした。そこで、検索を「添付ファイル付きのメールとHTMLメッセージの問題」に拡大しました。いくつかの異なる投稿からの情報をつなぎ合わせて、私はこれを思いつきました。 [〜#〜] both [〜#〜] HTMLメールと添付ファイルを使用できます。
私の元のヘッダーコード:
$header = "From: ".$from_name." <".$from_mail.">\r\n";
$header .= "Reply-To: ".$replyto."\r\n";
$header .= "MIME-Version: 1.0\r\n";
$header .= "Content-Type: multipart/mixed; boundary=\"".$uid."\"\r\n";
$header .= "--".$uid."\r\n";
$header .= "Content-Type: text/html; charset=ISO-8859-1\r\n";
$header .= "Content-Transfer-Encoding: 8bit\r\n";
$header .= $body."\r\n";
$header .= "--".$uid."\r\n";
$header .= "Content-Type: application/pdf; name=\"".$filename."\"\r\n";
$header .= "Content-Transfer-Encoding: base64\r\n";
$header .= "Content-Disposition: attachment; filename=\"".$filename."\"\r\n";
$header .= $content."\r\n";
$header .= "--".$uid."--";
if (mail($mail_to, $subject, "", $header))
{
return "mail_success";
}
else
{
return "mail_error";
}
私の新しいコード(完全):$ bodyは、異なる関数によってアセンブルされているHTMLであることに注意してください。
$file = $path.$filename;
$file_size = filesize($file);
$handle = fopen($file, "r");
$content = fread($handle, $file_size);
fclose($handle);
$content = chunk_split(base64_encode($content));
$uid = md5(uniqid(time()));
$name = basename($file);
$eol = PHP_EOL;
// Basic headers
$header = "From: ".$from_name." <".$from_mail.">".$eol;
$header .= "Reply-To: ".$replyto.$eol;
$header .= "MIME-Version: 1.0\r\n";
$header .= "Content-Type: multipart/mixed; boundary=\"".$uid."\"";
// Put everything else in $message
$message = "--".$uid.$eol;
$message .= "Content-Type: text/html; charset=ISO-8859-1".$eol;
$message .= "Content-Transfer-Encoding: 8bit".$eol.$eol;
$message .= $body.$eol;
$message .= "--".$uid.$eol;
$message .= "Content-Type: application/pdf; name=\"".$filename."\"".$eol;
$message .= "Content-Transfer-Encoding: base64".$eol;
$message .= "Content-Disposition: attachment; filename=\"".$filename."\"".$eol;
$message .= $content.$eol;
$message .= "--".$uid."--";
if (mail($mail_to, $subject, $message, $header))
{
return "mail_success";
}
else
{
return "mail_error";
}
ここで2つの重要な変更。 (1)ヘッダーからすべてのマルチパートを$ messageに削除しました。 (2)すべての「\ r\n」を削除し、$eol = PHP_EOL;
をコードに追加しました。
これらの変更により、添付ファイル付きのHTMLメールをもう一度送信できるようになりました。
同じ問題がありました:ヘッダーからMIME境界とメッセージを削除し、すべて機能しました。
$header = "From: ".$from_name." <".$from_mail.">\n";
$header .= "Reply-To: ".$replyto."\n";
$header .= "MIME-Version: 1.0\n";
$header .= "Content-Type: multipart/mixed; boundary=\"".$uid."\"\n\n";
$emessage= "--".$uid."\n";
$emessage.= "Content-type:text/plain; charset=iso-8859-1\n";
$emessage.= "Content-Transfer-Encoding: 7bit\n\n";
$emessage .= $message."\n\n";
$emessage.= "--".$uid."\n";
$emessage .= "Content-Type: application/octet-stream; name=\"".$filename."\"\n"; // use different content types here
$emessage .= "Content-Transfer-Encoding: base64\n";
$emessage .= "Content-Disposition: attachment; filename=\"".$filename."\"\n\n";
$emessage .= $content."\n\n";
$emessage .= "--".$uid."--";
mail($mailto,$subject,$emessage,$header);
上記のいずれも私のためにそれを修正しませんでした-主な問題は、ヘッダーにヘッダー定義以外のものを入れてはいけないことです。古いスクリプトはそこに何かを盛り込んでいた。そのため、ヘッダーに詰め込まれたテキストまたは添付ファイルをメッセージ本文に移動します。理にかなっています。
これには 説明 があります
(上記のフランクとダビスカの「二重改行なし」と同じ解決策だと思いますが、あなたはneed添付ファイルの改行を2倍にしました)
my PHP version-5.4.43、おそらくバグ#68776が修正されています。
同じエラーへのグーグル表示[ http://fossies.org/diffs/php/5.4.42_vs_5.4.43/ext/standard/mail.c-diff.html]
=>空の文字列をmail()パラメータとして使用することはできません。
私の古いコード:
$headers = 'From: ' . $frm . "\r\n";
$headers .= 'To: ' . $contactEmail . "\r\n";
if ( $flag ) {
$headers .= 'To: ' . $contactEmail2 . "\r\n";
}
$headers .= 'Cc: ' . $contactEmailCc . "\r\n";
$headers .= 'Bcc: ' . $contactEmailBcc . "\r\n";
$headers .= 'Return-Path: ' . $frm . "\r\n";
$headers .= 'MIME-Version: 1.0' ."\r\n";
$headers .= 'Content-Type: text/HTML; charset=ISO-8859-1' . "\r\n";
$headers .= 'Content-Transfer-Encoding: 8bit'. "\n\r\n";
$headers .= $htmlText . "\r\n";
if (!mail('', $strSubject, '', $headers)) { // !!! note the empty parameters.
私の新しいコード:
$headers = 'From: ' . $frm . "\r\n";
// note: no "To: " !!!
$headers .= 'Cc: ' . $contactEmailCc . "\r\n";
$headers .= 'Bcc: ' . $contactEmailBcc . "\r\n";
$headers .= 'Return-Path: ' . $frm . "\r\n";
$headers .= 'MIME-Version: 1.0' ."\r\n";
$headers .= 'Content-Type: text/HTML; charset=ISO-8859-1' . "\r\n";
$headers .= 'Content-Transfer-Encoding: 8bit'. "\n\r\n";
// note: no $htmlText !!!
// note: new parameters:
$mTo = $contactEmail;
if ( $flag ) {
$mTo .= ', ' . $contactEmail2;
}
$mMessage .= $htmlText . "\r\n";
if (!mail($mTo, $strSubject, $mMessage, $headers)) {
これで問題が解決します。 Frankのコードを少し変更しました。このコードは、添付ファイルとhtmlをサポートします。
<?php
$filename = "certificate.jpg";
$path = "/home/omnibl/subdomains/test/certificate/certimage/";
$file = $path . $filename;
$file_size = filesize($file);
$handle = fopen($file, "r");
$content = fread($handle, $file_size);
fclose($handle);
$content = chunk_split(base64_encode($content));
$uid = md5(uniqid(time()));
$name = basename($file);
$eol = PHP_EOL;
$subject = "Mail Out Certificate";
$message = '<h1>Hi i m mashpy</h1>';
$from_name = "[email protected]";
$from_mail = "[email protected]";
$replyto = "[email protected]";
$mailto = "[email protected]";
$header = "From: " . $from_name . " <" . $from_mail . ">\n";
$header .= "Reply-To: " . $replyto . "\n";
$header .= "MIME-Version: 1.0\n";
$header .= "Content-Type: multipart/mixed; boundary=\"" . $uid . "\"\n\n";
$emessage = "--" . $uid . "\n";
$emessage .= "Content-type:text/html; charset=iso-8859-1\n";
$emessage .= "Content-Transfer-Encoding: 7bit\n\n";
$emessage .= $message . "\n\n";
$emessage .= "--" . $uid . "\n";
$emessage .= "Content-Type: application/octet-stream; name=\"" . $filename . "\"\n"; // use different content types here
$emessage .= "Content-Transfer-Encoding: base64\n";
$emessage .= "Content-Disposition: attachment; filename=\"" . $filename . "\"\n\n";
$emessage .= $content . "\n\n";
$emessage .= "--" . $uid . "--";
mail($mailto, $subject, $emessage, $header);
同じ新しいエラーを引き起こす別のシナリオは、「mail」コマンドにヘッダーを送信していない場合です。以前は単にデフォルトを使用していたため、「additional_headerに複数の改行または不正な改行が見つかりました」という誤解を招くエラーが表示されるようになりました。
これを追加することで修正できます:
$header = "From: ".$from_name." <".$from_mail.">\n";
$header .= "Reply-To: ".$replyto."\n";
$header .= "MIME-Version: 1.0\n";
...
mail($mailto,$subject,$emessage,$header);
あなたは バグ#69874 mail()に空のadditional_headersを設定することはできません 愚かなことをしていない(つまり、ヘッダーをサニタイズするのを忘れた)場合があります。
バグをテストする
$ php -d display_errors=1 -d display_startup_errors=1 -d error_reporting=30719 -r 'mail("[email protected]","Subject Here", "Message Here",NULL);'
Warning: mail(): Multiple or malformed newlines found in additional_header in Command line code on line 1
または、PHPバージョン(ヒント:php -v
)バグ番号(69874)の 変更ログ をチェックして、バージョンに 修正 が適用されているかどうかを確認できます。
短期的な修正は、このようにmail()の呼び出しを置き換えることです
function fix_mail( $to , $subject , $message , $additional_headers =NULL, $additional_parameters=NULL ) {
$to=filter_var($to, FILTER_SANITIZE_STRING, FILTER_FLAG_NO_ENCODE_QUOTES| FILTER_FLAG_STRIP_LOW| FILTER_FLAG_STRIP_HIGH);
$subject=filter_var($subject, FILTER_SANITIZE_STRING, FILTER_FLAG_NO_ENCODE_QUOTES| FILTER_FLAG_STRIP_LOW| FILTER_FLAG_STRIP_HIGH);
if (!$additional_headers)
return mail( $to , $subject , $message );
if (!$additional_parameters)
return mail( $to , $subject , $message , $additional_headers );
return mail( $to , $subject , $message , $additional_headers, $additional_parameters );
}
これはおそらく、コードを利用して電子メールヘッダーを挿入しようとしている人です。
http://resources.infosecinstitute.com/email-injection/
アクセスログなどを調べて、異常なアクティビティを探すことをお勧めします。エラーメッセージが表示されているという事実は、スクリプトが侵害されておらず、代わりにエラーが発生していることを意味します。ただし、確認する必要があります。