2

我有一个 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);
4

2 回答 2

2

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

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

  1. 只循环$_POST你知道你的表单可以提交的参数
  2. 在您的 PHP 中验证这些参数的值。

(顺便说一句,验证码可能是一个合理的想法。试着找一个不太难读的验证码——我过去遇到过几个非常难的验证码。)

于 2013-05-03T14:59:45.623 回答
1

由于您知道任何机器人(可能是爬虫)在调用中包含附加参数,因此您可能会假设它不是对您的服务器的定向攻击,尽管它可能是在寻找您的 mysql 转义(或类似攻击)中的弱点。

我会重点关注的几件事:

1) 发布页面内容(而不是 GET)以避免在您的域之前由其他人拥有的情况下出现随机的 Web 链接。

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

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

3) 检查常见机器人的引用者和/或用户代理,并拒绝数据或以不同方式处理数据。不是防弹的,但很方便。

4)如果这个脚本是通过 Ajax 调用的,请查看Cross Origin Resource Sharing

5)不要使用验证码,除非你真的真的必须(你可能不需要)。如果您确实决定使用验证码,请使用简单的内容,例如“您是人类吗?(输入是)”和“是”的文本框。不是那些疯狂的人,请阅读这个混乱的验证码。

于 2013-05-03T15:15:47.430 回答