是机器人提交表单的方式不同于使用浏览器的人


Is the way a bot submits a form different than someone using a browser?

我有一个HTML表单,使用php发送信息捕获到我的电子邮件。

最近我一直收到一些没有有用信息的电子邮件。我认为这只是机器人提交的随机表格,因为我不麻烦捕获或其他任何东西,并驳回了它。

今天,当其中一封电子邮件进来时,我注意到如果我从浏览器提交表单,我无法复制我收到的电子邮件的内容,因为有几个字段会包含某些内容-即使它只是我的下拉菜单的默认值。

你认为机器人的方式(如果这是做这个)提交表单删除默认值?或者更有可能的是,这些是合法用户,而我的php代码有bug,破坏了我的邮件表单?

我的php代码基本上循环并检查字段是否为空,如果不是,则将其添加到电子邮件正文中。

编辑:

下面是我使用的php代码:
 $valid = new Validation($_POST);
if($CONTINUE = $valid->success) {
    $to = "myemail";
    $subject = "Subject";
    $from_email = $to;
    $from_name = $name;
    $headers = "From: $from_name<$from_email>'n"; 
    $headers .= "Reply-To: <$email>'n";
    $headers .= "Return-Path: <$from_email>'n"; 

    $body = "The following information we recently submitted'n";
    $qstring="";
    unset($_POST['required_fields']);
    reset($_POST);
    while(list($key, $value) = each($_POST)) {
        if(!empty($value)) {
            $body .= proper_form($key) . ":  " . stripslashes($value) ."'n";
            $qstring .= "&".$key."=".$value;
        }   
    }
    mail($to,$subject,$body,$headers);

大多数表单都是使用HTTP提交的,使用POST请求。这些请求仅仅包含打包在其中的数据——HTTP并不关心下拉框中的有效值。然而,一般的浏览器可以。当请求由浏览器提交时,它将按照所讨论的HTML表单的规则进行操作。如果我手动提交POST(使用curl或bot),我可以输入任何我想要的数据。

你可以通过:

  1. 只循环$_POST参数,你知道你的表单可以提交
  2. 在PHP中验证这些参数的值。
(顺便说一下,验证码可能是一个合理的想法。试着找一个不太难读的验证码——我以前遇到过几个难得离谱的验证码。

既然您知道任何bot(可能是爬虫)在调用中包含额外的参数,那么您可以假设它不是对您的服务器的直接攻击,尽管它可能是在寻找mysql转义中的弱点(或类似的攻击)。

我要关注的几件事:

1) POST页面内容(而不是GET),以避免随机的网络链接,如果你的域名以前属于别人。

2)如果$_POST包含您期望的字段以外的任何内容,则忽略整个帖子(浏览器不会发送额外的字段,除非您自己指定它们或有人使用greasemonkey脚本(或类似)将它们添加到页面)。你可以这样检查:

$allowedParams = array('name', 'email', 'subject', 'etc');
foreach($_POST as $param=>$val) {
    if(!in_array($param, $allowedParams))
    {
       die();
    }
}

3)检查referer和/或useragent是否有常见的bot,要么拒绝数据,要么以不同的方式处理。不防弹,但很方便。

4)如果这个脚本是通过Ajax调用的,查看跨域资源共享

5)不要使用验证码,除非你真的真的必须使用(你可能不会使用)。如果你决定使用验证码,使用一些简单的问题,比如"你是人类吗?"(输入yes)",并在文本框中输入"yes"。不是那些疯狂的,看看这个混乱的验证码