如何保护HTML表单免受垃圾邮件发送者的攻击?

13

我在注册表单中遇到了垃圾信息入库的问题。我已经尝试过许多开源验证码解决方案,但仍然面临同样的问题。

因此,我正在寻找替代解决方案。那么,使用用户需要输入答案的解决方案如何?问题的答案将是服务器端特定的单词,这样是否一定能打败垃圾机器人?

是随机提出一系列简单的问题还是像“6 +?= 9”这样的问题更好?唯一让我担心的是,如果这么容易保护注册,那么像 Facebook 这样的大公司为什么不这样做呢?


3
要求用户在注册你的网站时进行代数运算是个糟糕的主意。如果这么做,你会对教育系统感到非常失望。 - Stefan H
你能告诉我你是如何在服务器端处理数据的吗?你能在这里发布一下你的 PHP 代码吗? 如果你确定是验证码问题,那么 reCaptcha 是最好的选择。 - Kishan Gajjar
如果你的验证码实现得不够好,这个数学公式也无济于事。而如果你的验证码已经被识别了,这个简单的数学公式也毫无用处。你最好开始思考和研究。这将总是有所帮助的。 - Your Common Sense
不妨采用略有不同的方法,尝试使用非验证码(uncaptcha)而不是验证码?或者两者的组合。如果您还没有听说过uncaptcha,这里有一个Drupal插件,可以很好地解释并简要介绍整个概念:http://drupal.org/project/uncaptchalous。 - András Szepesházi
10个回答

7

更新:该答案被采纳,因为我推荐了KeyCAPTCHA。从我艰难痛苦的经历中得知,KeyCAPTCHA是一种由专业垃圾邮件发送者骗取利润的骗局。我已删除对KeyCAPTCHA的推荐。


请注意,大多数专业垃圾邮件发送者都与血汗工厂(每1000个解决方案1美元)人类验证码解决API集成。当垃圾邮件发送者无法通过验证码本身时(垃圾邮件机器人),它会保持数百个开放连接,并发送包含CAPTCHA的屏幕截图(或网页代码)以供血汗工厂人员解决。这是合法的,也是一个巨大的生意。为了合法,并通过API与机器人集成,人类解决者不能直接与已破解的网络板块(博客评论、注册页面、聊天、维基、论坛等)进行互动。

另一个问题是反垃圾邮件程序无法检测专业机器人基于上下文的垃圾邮件。有许多方法。最简单的方法是从其他网络板块中网页抓取多作者人类对话,并从不同国家的不同IP地址在不同时间发布它们(机器人可以检测到主题),因此即使(博客)所有者(人类)也无法检测到对话是由机器人发布的(它们实际上是存储在数据库中的人类对话)。

这只是关于您的网站是否受到专业垃圾邮件发送者兴趣或业余爱好者自动规避大多数(如果不是全部)CAPTCHA的问题。


有趣,但这个验证码很难解决 :P。我想很多人不想花时间来解决这个验证码。 - Alfred
这是什么胡说八道。它和其他验证码一样容易被破解。只需要花点时间去反编译Flash小程序并逆向算法即可。这个验证码变得越流行,就越快被破解。 - Your Common Sense
我认为它比许多其他解决方案更好。我认为现在使用它是一个不错的选择。至少现在它是不可破坏的。我同意它将来可能会被破解。但是keyCaptcha开发人员可能有更好的未来计划。 - Adnan

2
说实话,我觉得这些东西相当无用。如果有人能够绕过您的CAPTCHA,那么他们肯定能够绕过简单的数学方程,因为这需要更少的努力。
如果是注册表格,我想最好的做法是使用CAPTCHA + 通过电子邮件发送确认链接(并排除虚假电子邮件地址,例如mailinator)。您可以定期从未经确认的注册中清除数据库。
当然,没有100%安全的方法,任何形式的CAPTCHA都可以被绕过(如果有足够的时间和资源),所以我想我们必须接受这一点。

我们考虑用一个简单的问题和答案文本框代替Captcha验证方式怎么样?可以让一系列类似于“What is the first letter of English Alphabet?”(英文字母表的第一个字母是什么?)这样的问题随机出现并逐个呈现在表单中,用户需要在文本框内输入相应的回答。这种方法能否有效地防止垃圾信息的发送? - Adnan
@user278194:我认为问题并不在于 CAPTCHA 的难度。你可以为几乎任何 CAPTCHA 设计一个临时解决方案,问题是:垃圾邮件发送者真的对攻击你的网站感兴趣吗?垃圾邮件发送者会选择易攻击的目标,所以最好的方法是使用不常见的系统。当他们可以在另外一百万个网站上使用标准解决方案时,他们不会花费大量时间为您的网站设计特定的解决方案... - nico

1

这个问题在这个网站上已经被提出很多次了[需要参考文献:)]

这是一个相当复杂的问题,但我想简短的答案是我们只能使用通常的方法!

我认为这个网站很好地解决了这个问题,但是,像往常一样,如果不牺牲用户的可用性,你将不得不使用CAPTCHA。你使用得越多,收到的垃圾邮件就越少,但要记住,当某个IP涉及可疑活动时,始终有限制IP的选项。

至于mat问题验证,我自己在PHP中尝试过,大致如下:

<?php

$x = mt_rand(1,5);
$y = mt_rand(1,5);

function add($x, $y) { return $x + $y; }
function subtract($x, $y) { return $x - $y; }
function multiply($x, $y) { return $x * $y; }

$operators = array(
    'add',
    'subtract', 
    'multiply'
    );

$rdno = $operators[array_rand($operators)];

$result = call_user_func_array($rdno, array($x, $y));
session_start();
$_SESSION['res'] = $result;

if ($rdno == "add") {
    $whato = "+";
}elseif ($rdno == "subtract") {
    $whato = "-";
} else {
    $whato = "*";
}
$output = $x . $whato . $y . " = ";
$_SESSION['out'] = $output;
?>
<img src="image.php" />
<form name="input" action="check.php" method="post">
<input type="text" name="result" />
<input type="submit" value="Check" />
</form>

chech.php:

<?php

session_start();


if($_SESSION['res'] == $_POST["result"]){
    echo "correct!";
    $_MCAPTCHA = TRUE;

}else{

    echo "incorrect";
    $_MCAPTCHA = FALSE;

}
session_unset();

?>

并且

<?php
session_start();
//image creation

// Create a 100*30 image
$im = imagecreate(100, 30);

// White background and blue text
$bg = imagecolorallocate($im, 255, 255, 255);
$textcolor = imagecolorallocate($im, 0, 0, 255);

// Write the string at the top left
imagestring($im, 5, 0, 0, $_SESSION['out'], $textcolor);

// Output the image
header('Content-type: image/png');

imagepng($im);
imagedestroy($im);
?>

您可以为其添加一些 高斯模糊 等等-

当然,这只是一个例子(永远不要使用这个 :))

但这只是一个想法,可以做些什么。

遗憾的是,除非您希望用户进行非常复杂的数学计算(这可能仅适用于某些受众群体),否则您的选项更加有限。此外,如果任何人想要专门针对您的网站进行攻击,则具有有限选项可能会是一个坏主意,因为非常容易受到攻击。

总之,在我看来,您将被困在通常的广告中,并且必须忍受一些垃圾邮件,这只是您可能需要面对的妥协。

您可能会发现 杰夫的编码恐怖文章 很有趣。

祝好运!


1

既然这里没有提到,我将简要介绍我一直在一个中等访问量的论坛上使用的方法。请注意,我只会解释基本思路。有几种变化可以实现,使自动垃圾邮件更难。

我的做法是:

  1. 引入某个常数作为盐。这个常数对于您的网站是唯一的,应该是秘密的。
  2. 使用远程IP、用户代理、一天中的小时数(请注意,如果请求和发送表单之间的小时数切换,可能会导致失败)以及类似的数据来计算盐散列(MD5、SHA1)...另一个输入是论坛元素的原始字段名称(例如emailname等),因此现在每个字段名称都是按客户端计算的。我在前面加了一些字母或类似的东西,以确保名称不以数字开头,这可能会引起问题。
  3. 用户发送表单。
  4. 接收脚本具有相同的输入数据(即不必通过表单或其他方式发送)。
  5. 在接收脚本使用与2.中相同的方法后,它可以评估表单数据并采取相应的操作。

同样,这可以与其他手段结合使用。但是唯一的盐将使其被广泛使用-不同的盐值使得即使已知计算哈希的方法,也很难预测字段名称。如果垃圾邮件发送者变聪明了,就必须使用其他手段来掩盖相应的表单输入元素(即使他们不仅仅寻找字段名称)。

它很简单,100%屏幕阅读器兼容(即使对于盲人也可用),并且在我管理的论坛中奏效。它大大减少了垃圾邮件。希望它也能帮助到您。


1
我在我的注册表格中遇到了垃圾邮件入口问题。我尝试了许多开源验证码方案,但仍然面临同样的问题。
你使用了什么样的垃圾邮件保护措施?我发现很奇怪的是垃圾邮件保护措施完全失灵了。像很多其他人说的那样,reCAPTCHA相当不错,许多大型公司都在使用它们(比如Twitter)。
例如,您可以使用reCAPTCHA进行注册。接下来,通过使用WordPress akismet测试大量(首次)帖子是否为垃圾邮件来验证用户是否未发布垃圾邮件。这应该有助于更好地检测垃圾邮件。
然而,彻底打败垃圾邮件确实很困难。完全击败垃圾邮件几乎是不可能的。我在某个地方看到过一些垃圾邮件发送者甚至便宜地雇用印度人来破解您的垃圾邮件保护措施。
“一系列简单的随机问题”或者像“6 +?= 9”这样的问题会更好吗?唯一让我担心的是,如果保护注册这么容易,为什么像Facebook这样的巨头不在使用这种方法?
这种方法有一些缺点:
  • 这个逻辑可以轻松地嵌入到垃圾邮件机器人中。我甚至可以编写代码,毫不费力地击败6 + ? = 9
  • 有些用户可能在数学方面很差,或者不知道如何回答你的问题。

5
对于最后一句话,我想要保护我的网站不被这些人以及垃圾邮件机器人攻击。 - Your Common Sense
就像我说的那样,几乎不可能完全防止这种情况发生。为了保护用户免受此类消息的影响,您可以使用审核制度。只有在确定用户可信时,才可以取消审核标记。 - Alfred
事实上,对于99%的网站,即使是最简单的蜜罐也可以起作用。 - Your Common Sense
询问一个简单的问题,然后放置一个文本框来作答,而不是使用验证码怎么样?我是说我们可以在表单上随机出现一系列逐个出现的问题。例如:“英文字母表的第一个字母是什么?”用户必须在答案框中键入“A”。这会打败垃圾邮件发送者吗? - Adnan

0

您可以不用验证码实现这一功能,您可以添加一个隐藏的表单,然后检查人们无法看到的表单是否已被填充,您可以使用 PHP 实现此功能

if($_POST['hidden_input'] != ""){
    echo('<p>You are a spam bot</p>');    
}

这是因为垃圾邮件机器人通常会填满每个文本区域。

在表单中,您应该只添加

 <input type="text" id="hidden_input" name="hidden_input" style="display:none;"/>

0

0

你尝试过reCAPTCHA了吗?

已经有很多垃圾邮件机器人能够解决简单的数学问题。

Facebook不使用类似的解决方案的原因是,如果他们这样做,他们的解决方案会被破解,因为他们是一个拥有数百万用户的大公司。


0

你确定不能使用reCAPTCHA吗?我认为它是目前互联网上最好的验证码。

但是我想到了一种完全不同的解决问题的方法,也许值得一试。

你可以通过使用OpenID进行注册,将问题交给Google、Twitter、Facebook等公司。这样,垃圾邮件发送者就需要拥有Google帐户等,我相信他们不会用这种方式发送垃圾邮件。


1
我从未尝试过reCaptcha。 实际上,我的客户不喜欢reCaptcha,他认为reCaptcha生成的字母不容易识别。 那么,使用一个简单的问题并放置一个文本框以供回答,而不是使用Captcha呢? 我的意思是我们可以在表单上随机出现一系列问题中的一个。 例如:“英文字母表的第一个字母是什么?”用户将不得不在答案框中输入“A”。 这能够打败垃圾邮件发送者吗? - Adnan

0

我刚刚完成了将Jake Munson的优秀CFFormProtect移植到PHP的工作。它托管在http://code.google.com/p/phpformprotect/

它使用了一系列测试,包括基于JavaScript的鼠标移动、键盘使用和填写时间检查,以及一些基本的URL检查、垃圾邮件词汇检查,并可选择与AkismetProject Honey Pot进行集成。我发现它是一个非常好的威慑措施,对合法用户几乎完全不可见。

我相信这个移植还需要改进,但它对我来说已经可以使用了。欢迎贡献任何东西。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接