1

我知道这个问题已经在不同的问题中讨论过,但人们给出的答案似乎对我不起作用。我正在处理以下问题:

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

现在,人们一直在说,如果我"/"在前面和后面加上 '/email/' 这样的引号,这将解决问题。我尝试将 / 用于电子邮件和姓名,但它仍然让我回到相同的分隔符错误。

我还收到一个最终错误:警告:无法修改标头信息 - 标头已由(我的网站的 send.php:43)在第 61 行发送。这与它有什么关系,或者这只是由于以下原因导致的错误较早的错误?

这是感兴趣的各方的完整代码:

<?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 回答