我有一个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);
答案 0 :(得分:2)
大多数表单都是使用HTTP使用POST
请求提交的。这些请求只包含数据 - HTTP不关心下拉列表中的有效值。但是,普通的浏览器确实如此。当请求由浏览器提交时,它将根据相关HTML表单的规则进行播放。如果我要手动提交POST
(使用curl
或机器人),我可以输入我想要的任何数据。
您可以通过以下方式解决此问题:
$_POST
个参数(顺便说一句,验证码可能是一个合理的想法。只是试着找一个不太难读的 - 我过去碰到了几个非常难以辨认的验证码。)
答案 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除非你真的真的需要(你可能没有)。如果您决定使用验证码,请使用简单的内容,例如“你是人吗?(输入是)”,文本框为“是”。不是那些疯狂的人,请阅读这个混乱的验证码。