我有一个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),我可以输入任何我想要的数据。
你可以通过:
- 只循环
$_POST
参数,你知道你的表单可以提交 - 在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"。不是那些疯狂的,看看这个混乱的验证码