2

私は何年もの間、同じphpスクリプトを使用して連絡先フォームからメールを送信してきました。しかし、私のWebサーバーがphp 5.3にアップグレードしたとき、eregiを呼び出すと、非推奨のエラーが表示されていました。

グーグル検索の後、私はエレギの代わりにストリストを使うことができることを知りました。

この単純なスイッチを作成すると、すべてが正常に機能しますが、私はphpウィザードではないので、スクリプトがヘッダーインジェクションから保護されているかどうかを知りたいです。

誰かが私の心を落ち着かせて、このスクリプトが連絡フォームからの電子メールの送信に使用するのに安全である(または少なくとも十分に安全である)ことを確認できますか?

stristrを使用している現在のスクリプトの例を次に示します。

    <?

$to="myemail@gmail.com";

// the $Name is the PHP variable, the _Post['Name'] should match the name of the input boxes in the form

$Name=$_POST['Name'];

$Email=$_POST['Email'];

$Phone=$_POST['Phone'];

$Message=$_POST['Message'];

// you can format the email anyway you want.

$message="Form submitted by $Name

Applicant Information:\n

Name: $Name

Email: $Email

Phone: $Phone

Message: $Message";

// Check for script HiJack

$arBadStr = array("Content-Type:", "MIME-Version:", "Content-Transfer-Encoding:", "bcc:", "cc:");

foreach($_POST as $tName => $tVal){

foreach($arBadStr as $tStr){

if(stristr($tStr, $tVal)){

$fSub = "Failed: Header Injection.";

reportError($fSub); 

}}}





if(mail($to,"mywebsite.com contact Form Submission",$message,"From: $Name <$Email>")) {

echo "Thank you $Name for your interest. We will contact you shortly";

} else {

echo "There was a problem sending the mail. Please check that you filled in the form correctly.";

}



// Report error function called when test detects hijacking. Mails report to webmaster and kills process.

function reportError($fSub) {

while(list($name, $value) = each($_POST)) {

$eBody .= "$name : $value \n\r"; }

mail( "myemail@gmail.com", $fSub, $eBody, "From: Webmaster <myemail@gmail.com>");

exit(header("Location: http://www.mywebsite.com")); }

?>

アップデート

暗号からのこれまでにない優雅な助けに基づいて、これは私の新しいスクリプトがどのように見えるかです。ご覧のとおり、入力フィールドを単純にサニタイズする代わりに、ヘッダー検証関数の一部を削除しました。

    <?
$to="myemail@gmail.com";

// the $Name is the PHP variable, the _Post['Name'] should match the name of the input boxes in the form

$Name = str_replace(array("\n", "\r"), '', $_POST['Name']);
$Email = str_replace(array("\n", "\r"), '', $_POST['Email']);
$Phone = str_replace(array("\n", "\r"), '', $_POST['Phone']);
$Message = str_replace(array("\n", "\r"), '', $_POST['Message']);


function clean_string($string) {
      $bad = array("content-type","bcc:","to:","cc:","href");
      return str_replace($bad,"",$string);
    }

$Name = clean_string($Name);
$Email = clean_string($Email);
$Phone = clean_string($Phone);
$Message = clean_string($Message);


// you can format the email anyway you want.

$message="Form submitted by $Name

Applicant Information:\n

Name: $Name

Email: $Email

Phone: $Phone

Message: $Message";


if(mail($to,"mywebsite.com contact Form Submission",$message,"From: $Name <$Email>")) {

echo "Thank you $Name for your interest. We will contact you shortly";

} else {

echo "There was a problem sending the mail. Please check that you filled in the form correctly.";

}
?>
4

1 に答える 1

4

BCC、CCなどのヘッダーをブラックリストに登録しようとしましたが、TO、FROMをブロックできませんでした。

セクション4.1の16ページのRFC822には、次のように記載されています。

この仕様では、ほとんどのフィールドを複数回出現させることができます。特に記載のない限り、ここではそれらの解釈は指定されておらず、使用はお勧めしません。

したがって、攻撃者はメッセージを操作して、受信者と送信者を追加することができます。実際には、改行とキャリッジリターンをチェックするか、\r文字と\n文字を削除してすべての$_POST値をサニタイズする必要があります。

<?php

function clean_string($string) 
{
    return str_replace(array("\n", "\r"), '', $string);
}

$to = 'myemail@gmail.com';

// the $Name is the PHP variable, the _Post['Name'] should match the name of the input boxes in the form
$Name    = clean_string($Name);
$Email   = clean_string($Email);
$Phone   = clean_string($Phone);
$Message = clean_string($Message);

// you can format the email anyway you want.
$message = "Form submitted by $Name

Applicant Information:\n

Name: $Name

Email: $Email

Phone: $Phone

Message: $Message";

if (mail($to, 'mywebsite.com contact Form Submission', $message, "From: $Name <$Email>"))
{
    echo 'Thank you ' . htmlspecialchars($Name) . ' for your interest. We will contact you shortly';
}
else
{
    echo "There was a problem sending the mail. Please check that you filled in the form correctly.";
}

?>
于 2012-12-08T01:40:26.833 に答える