Php 此“联系我们”脚本如何易受攻击/被操纵?

Php 此“联系我们”脚本如何易受攻击/被操纵?,php,spam,contact-form,Php,Spam,Contact Form,一个客户端最近收到来自其主机的垃圾邮件警告 我想我已经把这个问题指向了一个旧的联系我们表格。前端是简单的html,后端是简单的PHP脚本 if ($_POST['submit'] == "Send"){ //START SEND MAIL SCRIPT $mail = $_POST['email']; $to = "me@gmail.com"; $subject = "Message from Website Contact Us Form";

一个客户端最近收到来自其主机的垃圾邮件警告

我想我已经把这个问题指向了一个旧的联系我们表格。前端是简单的html,后端是简单的PHP脚本

    if ($_POST['submit'] == "Send"){

    //START SEND MAIL SCRIPT 
    $mail = $_POST['email'];
    $to = "me@gmail.com";
    $subject = "Message from Website Contact Us Form";
    $headers = "From: Contact us Form <webmaster@website.co.uk>";
    $message = "Message from Contact Us Form\n\n";
    $message .= "\nName: " . $_POST['contactname'];
    $message .= "\nEmail: " . $_POST['contactemail'];
    $message .= "\nTelephone: " . $_POST['contactphone'];
    $message .= "\n\n\nMessage:\n" . $_POST['contactmessage'];


        if(mail($to,$subject,$message,$headers)) {

                header('Location: http://www.website.co.uk/contact-us/?action=success');

        }else{

                header('Location: http://www.webisite.co.uk/contact-us/?action=fail');                          

        }//END IF MAIL

}//END SCRIPT
if($_POST['submit']==“Send”){
//启动发送邮件脚本
$mail=$_POST['email'];
$to=”me@gmail.com";
$subject=“来自网站的消息联系我们表格”;
$headers=“发件人:联系我们表格”;
$message=“来自联系我们表单的消息\n\n”;
$message.=“\n名称:”.$\u POST['contactname'];
$message.=“\nEmail:”.$\u POST['contactemail'];
$message.=“\nTelephone:”.$\u POST['contactphone'];
$message.=“\n\n\n消息:\n”。$\u POST['contactmessage'];
if(邮件($to、$subject、$message、$headers)){
标题('位置:http://www.website.co.uk/contact-us/?action=success');
}否则{
标题('位置:http://www.webisite.co.uk/contact-us/?action=fail');                          
}//如果是邮件,则结束
}//结束脚本
我知道修复它的方法,比如正确地消毒post VAR、使用CAPTCHA、使用隐藏的“蜜罐”空白字段、js技巧等(我也喜欢这个脚本的外观)

但是为了帮助我理解发生了什么,我想知道这个脚本是如何被操纵的。一个外国脚本向它发布变量,但是他们如何发送电子邮件给其他人 'me@gmail.com'或者如果他们以某种方式强制抄送/密件抄送字段,为什么我也不能收到所有垃圾邮件


谢谢

您没有对post数据进行任何转义。这意味着此表单易受攻击


我无法告诉您他们是如何做到的,但可能就是这样发生的。

像这样的
$message行。=“\n名称:”$_POST['contactname']可能是危险的。
如果
$\u POST['contactname']='MegaSteve4\r\nCc:email1@mail.com, email2@mail.com';已设置,2次使用将收到垃圾邮件


仔细看。它附加了更多的标题。在这种情况下,Cc。我不确定Cc是否是原始电子邮件标题。但是我希望你能理解。

如果你真的在使用gmail地址,它可能会阻止垃圾邮件。你在哪里使用
$mail
变量?这似乎是最容易受到注入攻击的一个。那么,我们如何保证post数据只包含一个电子邮件地址来避免这种情况呢?可能是正则表达式?是的,您可以使用正则表达式进行验证。:)这个脚本()使用foreach循环——可能比regex慢几毫秒,但可以正常工作。还做了一些其他的好把戏,表单是从ie同一个域提交的,还有如果有一个用户代理集等等。其中一些东西可能会被机器人欺骗,但越难。。。。。。