2017-02-10 43 views
0

目前我正在处理用户可以提交表单的问题,即使使用的字符完全是随机的,并且还会随机附加一封电子邮件。了解如何使用PHP过滤来自表单的恶意输入

这样的问题的一个实例中,呈现在屏幕截图

An example of such an issue is presented in the screenshot

当前的PHP代码把手意见如下:

if(empty($_POST['First_Name']) || 
    empty($_POST['Email'])) 
{ 
    $errors .= "\n Error: all fields are required"; 
} 

$firstname = $_POST['First_Name']; 
$lastname = $_POST['Last_Name']; 
$email_address = $_POST['Email']; 
$company = $_POST['Company']; 

if (!preg_match(
"/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$/i", 
$email_address)) 
{ 
    $errors .= "\n Error: Invalid email address"; 
} 

if(empty($errors)) 
{ 
    $to = $myemail; 
    $email_subject = "Download Form Submission"; 
    $email_body = "A new white paper registration was received. ". 
    " Visitor Details:\n \n First Name: $firstname \n \n Last Name: $lastname \n \n Email: $email_address \n \n Company: $company" ; 

    $headers = "From: $myemail\n"; 
    $headers .= "Reply-To: $email_address"; 

    mail($to,$email_subject,$email_body,$headers); 
    //redirect to the appropriate page 
    header('Location: news-and-resources.php'); 
} 
?> 

这是伴随着这种形式的HTML:

    <div class="modal-body"> 
          <div class="form-group"> 
           <form method="POST" name="downloadform" action="form-handler3.php" onSubmit="MM_validateForm('firstname','','R','lastname','','R','email','','RisEmail','company','','R');return document.MM_returnValue" accept-charset="iso-8859-1"> 
            <p> 
            <label for='firstname'>First Name</label> <br> 
            <input name="First_Name" type="text" id="firstname" size="30"> 
            </p> 
            <p> 
            <label for='lastname'>Last Name</label> <br> 
            <input name="Last_Name" type="text" id="lastname" size="30"> 
            </p> 
            <p> 
            <label for='email'>Email Address</label> <br> 
            <input name="Email" type="text" id="email" size="30"> <br> 
            </p> 
            <p> 
            <label for='company'>Company</label><br> 
            <input name="Company" type="text" id="company" size="30"> <br> 
            </p> 

            <p style="text-align:center;"><input type="submit" onclick="modal.close();" value="submit"></p> 
           </form> 
          </div> <!-- END OF FORM GROUP --> 
         </div> <!-- END OF MODAL BODY --> 

我不确定我是否需要d在提交之前验证客户端,或者在提交之后验证。无论哪种方式,我希望能够获得有关如何从表单中去除随机字符和电子邮件的见解。任何有识之士将不胜感激。

感谢

+0

您一定需要在服务器端进行验证,但您也可以选择在客户端进行验证,以便您可以更快地给出反馈。 – 4castle

+0

寻找'蜂蜜罐'技术。这对于机器人来说简单而且非常有用。另外,如果你想让事情正确,你需要对注入攻击进行验证。 –

+0

事情是,你怎么知道什么是随机的,什么是一个非常奇怪的名字? (对于给定的奇数值。)我的意思是,有许多方法可以验证电子邮件至少是适当的格式,但对于名称,我曾与来自波兰,俄罗斯,韩国等的人员以及一些名称有奇怪的拼写。 –

回答

0

我不认为你需要找出一种方式剥夺随机字符这么多,因为你可能只是想捕捉到非人类的形式输入。有许多方法,如验证码,和google's ReCaptcha

但是,我见过的一个很好的PHP方法是使用我自己的方法,它是一个蜜罐。

添加像这样的形式

<p class="catchThoseBots" id="honey"> 
     <label>If you're human leave this blank:</label> 
     <input name="robotest" type="text" id="robotest" class="robotest" /> 
    </p> 

,并用CSS隐藏

.catchThoseBots{display:none} 

然后在值

$robotest = $_POST['robotest']; 
if($robotest){ 
//is a robot proceed no further 
}else{ 
//is a person 
} 

表单验证检查,我已经做到了这一点几次,但当我开始这样做时,我在笔记中保留的文章是here

这个想法是,机器人只是用数据填写表格,并希望得到他们正在努力实现的任何目标的提交。用蜜罐他们这样做的缺乏方法让他们不能在哪里。