-1

フラッシュで使用する小さなメール スクリプトを php にまとめました。より安全にするために、リファラーを比較する preg_match チェックとヘッダー インジェクションを防ぐ preg_match を追加しました。

リファラーチェックのために、私は $url 変数に対してチェックしています。そして、それがリファラー URL で始まる場合にのみ true になります。たとえば、http://spambot.com/index.php?http://www.mysite.nlは許可されていませんが、「http://www.mysite.nl」は許可されています。それを行うには、これは正しい形式ですか?

//check start with string
if (preg_match("/^".$url."/",$result); 

$result を文字列 '$url' ではなく変数 $url に対してチェックしたいので、少し混乱しました。

ヘッダー インジェクション保護の場合: この preg_match 行でそれを行う必要がありますか?

//prevent header injection
if (preg_match( "/[\r\n]/", $_POST["sFrom"] ) || preg_match( "/[\r\n]/", $$_POST["sEmail"] ) ) 

以下は、さらに参照するための完全な電子メール スクリプトです。

?php

//referrer: 
$url = http://www.mysite.nl

//check referrer
$result = stripos($url, $_SERVER['HTTP_REFERER']);

//check start with string
if (preg_match("/^".$url."/",$result); 
{

//prevent header injection
if (preg_match( "/[\r\n]/", $_POST["sFrom"] ) || preg_match( "/[\r\n]/", $$_POST["sEmail"] ) ) 
        {

if ($result === false)
{
die("error"); //bad referrer
}
else
{
//process the action

$sendTo = $_POST["sEmail"];
$subject = $_POST["sSubject"];

$headers = "From: " . $_POST["sFrom"] . "<noreply@mysite.nl>\r\n";
$headers .= "Reply-To: " . "<noreply@mysite.nl>\r\n";
$headers .= "Return-path: " . "<noreply@mysite.nl>";

$message = $_POST["sMessage"];

mail ($sendTo, $subject, $message, $headers);

}

}

}
?>
4

1 に答える 1

0

Mamp でテストしたところ、$url で始まる文字列を検索する preg_match の使用は正しかった。ヘッダー インジェクションでの preg_match の使用には、いくつかの修正が必要でした。from フィールドと to フィールドに改行がない場合にのみスクリプトが続行されるため、両方の場合に !pregmatch を使用する必要がありました。

于 2013-05-31T07:35:04.083 に答える