机器人提交表单的方式与使用浏览器的人不同吗?

时间:2013-05-03 14:50:47

标签: php html forms

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

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

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

你认为机器人(如果是这样做的话)的方式是提交表格去除默认值吗?或者更有可能这些可能是合法用户,我的PHP代码有错误,并以某种方式打破我的电子邮件表单?

我的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);

2 个答案:

答案 0 :(得分:2)

大多数表单都是使用HTTP使用POST请求提交的。这些请求只包含数据 - HTTP不关心下拉列表中的有效值。但是,普通的浏览器确实如此。当请求由浏览器提交时,它将根据相关HTML表单的规则进行播放。如果我要手动提交POST(使用curl或机器人),我可以输入我想要的任何数据。

您可以通过以下方式解决此问题:

  1. 仅循环显示您知道表单可以提交的$_POST个参数
  2. 在PHP中验证这些参数的值。
  3. (顺便说一句,验证码可能是一个合理的想法。只是试着找一个不太难读的 - 我过去碰到了几个非常难以辨认的验证码。)

答案 1 :(得分:1)

既然你知道任何机器人(可能是一个爬虫)在调用中包含其他参数,你可能会认为它不是对你的服务器的定向攻击,尽管它可能是因为你的mysql逃逸中的弱点(或类似的攻击) )。

我关注的一些事情:

1)发布页面内容(而不是GET),以避免在您的域名之前由其他人拥有时随机网页链接。

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

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

3)检查referer和/或useragent是否有公共机器人,否则拒绝数据或以不同方式处理数据。不是防弹,但很方便。

4)如果通过Ajax调用此脚本,请查看Cross Origin Resource Sharing

5)Don't use a captcha除非你真的真的需要(你可能没有)。如果您决定使用验证码,请使用简单的内容,例如“你是人吗?(输入是)”,文本框为“是”。不是那些疯狂的人,请阅读这个混乱的验证码。