1

この問題がさまざまな質問で議論されていることは知っていますが、人々が与えた回答は私の側ではうまくいかないようです. 私は次の問題を扱っています:

if ( (preg_match($suspect, $lowmsg) )
  || (preg_match($suspect, strtolower($_POST['name'])))
  || (preg_match($suspect, strtolower($_POST['email']))))

"/"さて、 '/email/' のように前後に引用符を付ければ、問題が解決するだろうと人々は言っています。メールと名前に / を入れてみましたが、それでも同じ区切り文字エラーに戻りました。

次の最終エラーも表示されます: 警告: ヘッダー情報を変更できません - 61 行目の (私のウェブサイトの send.php:43) によって既に送信されたヘッダー。以前のエラー?

関係者向けのコード全体は次のとおりです。

<?php

 if(($_POST['email']=="")||($_POST['name']=="")||($_POST['message']==""))

 {

  echo "<html><body><p>The following fields are <strong>required</strong>.</p><ul>";

  if($_POST['name'] == ""){ echo "<li>Name</li>"; }

  if($_POST['email'] == ""){ echo "<li>Email</li>"; }

  if($_POST['message'] == ""){ echo "<li>Message</li>"; }

  echo "</ul><p>Please use your browser's back button to complete the form.</p></body></html>";

 }

 else

 {

  $message = "";

  $message .= "Name: " . htmlspecialchars($_POST['name'], ENT_QUOTES) . "<br>\n";

  $message .= "Email: " . htmlspecialchars($_POST['email'], ENT_QUOTES) . "<br>\n";

  $message .= "Message: " . htmlspecialchars($_POST['message'], ENT_QUOTES) . "<br>\n";

  $subject = htmlspecialchars($_POST['subject'], ENT_QUOTES);

  $pagelink = htmlspecialchars($_POST['pagelink'], ENT_QUOTES);

  $repemail = htmlspecialchars($_POST['repemail'], ENT_QUOTES);

  $injection_strings = array ( "content-type:","charset=","mime-version:","multipart/mixed","bcc:","cc:");

  foreach($injection_strings as $suspect)

  {

   if((preg_match($suspect, $lowmsg)) || (preg_match($suspect, strtolower($_POST['/name/']))) || (preg_match($suspect, strtolower($_POST['/email/']))))

   {

     die ( 'Illegal Input.  Go back and try again.  Your message has not been sent.' );

   }

  }

 $headers = "MIME-Version: 1.0\r\nContent-type: text/html; charset=iso-8859-1\r\n";

 $headers .= "From: \"" . $_POST['/name/'] . "\" <" . $_POST['/email/'] . ">\r\n";

 $headers .= "Reply-To: " . $_POST['/email/'] . "\r\n\r\n";

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

 header("Location: " . $pagelink . "");

 }

?>
4

1 に答える 1

0

/#〜などの他の区切り文字を試すことができます

regexp.reference.delimitersを参照してください

お役に立てば幸いです。

編集:$_POST内でバックスラッシュを実行する必要はありません

Use $_POST['name'] instead of $_POST['/name/']

編集:試してみてください

preg_match("/".$suspect."/i", strtolower($_POST['name']);

しかし、私はあなたがあなたの$injection_strings内部の投稿名のいずれかを見つけるとは思わない。検索方法を再考する必要があるかもしれません。「content_type」は「text/html」を現在のステートメントと一致させません。次のような他の正規表現を試す必要があります

preg_match("/".$suspect."(.*)/i", strtolower($_POST['name'], $output);

そうするために$output[0]、あなたの「疑わしい」変数。それがあなたが探しているものかどうかはわかりませんが、おそらくあなたを正しい軌道に乗せます。

編集:ここに。

「cc:」と言ってそれが何のメールかを知りたい場合は、これを使用してください。

preg_match("/cc:(.*)/i",'cc:'.$_POST['email'],$output);
$output[0]; would equal your email. 

foreachループと互換性を持たせるために、それも変更することをお勧めします。

「ifステートメント」内で以下のコードを切り替えます

preg_match("/".$suspect."(.*)/i",$suspect.$_POST['email'])
于 2012-09-24T03:08:36.993 に答える