如何从垃圾邮件发送者那里保护html表单?

时间:2010-12-19 18:39:01

标签: php html captcha spam-prevention

我通过注册表单在数据库中遇到垃圾邮件条目问题。 我尝试了很多开源的Captcha解决方案,但仍面临同样的问题。

因此,我正在寻找替代解决方案。解决方案怎么样,用户必须输入问题的答案?这个问题的答案将是一个服务器端特定的单词然后这肯定会击败一个spambot?

将一系列简单的随机问题或类似“6 +?= 9”的问题作为一个问题更好吗?唯一令我担忧的是,如果保护注册这么简单那么为什么不像Facebook这样的大巨头呢?

10 个答案:

答案 0 :(得分:7)

更新:答案被接受,因为我推荐了KeyCAPTCHA。从我辛苦赚来的痛苦经历KeyCAPTCHA is a scam by professional spammers开始。我删除了我对KeyCAPTCHA

的推荐

请注意,大多数专业的垃圾邮件程序都与sweatshops (1 USD a 1000 solutions)人类captcha解算器API集成在一起。当一个spambot无法通过captcha本身(垃圾邮件机器人),保留数百个打开的连接时,会发送带有CAPTCHA的屏幕截图(或网页代码),以供血汗工厂人员解决。这是合法的大企业。为了合法并通过API与机器人集成,人工解算器无法直接与破解的Web板(博客评论,注册页面,聊天,维基,论坛等)进行交互。

另一个问题是,反垃圾邮件程序无法通过专业制作的僵尸程序检测基于上下文的垃圾邮件。有很多方法。最简单的是来自其他网络的web scraping多作者人类对话,并在不同时间从不同国家的不同IP地址发布它们(机器人可以检测主题),所以甚至(一个博客)所有者(人类) )无法检测到机器人发布的对话框(它们实际上是存储在数据库人工对话框中)。

这只是您的网站感兴趣的专业垃圾邮件发送者或时间+业余爱好者的合格持久性,以自动规避大多数(如果不是全部)CAPTCHA

答案 1 :(得分:2)

说实话,我觉得那些东西很无用。如果有人可以绕过你的CAPTCHA那么他们肯定能够绕过简单的数学方程,因为它需要更少的努力。

如果是注册表单,我想最好的办法是通过电子邮件发送CAPTCHA +确认链接(并排除虚假电子邮件地址,如mailinator)。您可以定期从未经证实的注册中清除数据库。

当然没有100%安全的方法,任何形式的CAPTCHA都可以被绕过(给予足够的时间和资源),所以我想我们必须接受它。

答案 2 :(得分: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);
?>

你可以向它添加一些gaussian blur等等 -

当然这只是一个例子(不要经常使用:))

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

关于这一点的坏处是,除非你希望用户做非常复杂的数学运算(对于一些观众来说可能没什么用),你有限制选项,此外,如果有人想要专门定位你的网站,选择有限,因为非常脆弱,可能是一个坏主意。

总而言之,恕我直言,你很难接受通常的广告,不得不忍受一些垃圾邮件,这只是你可能不得不忍受的妥协。

你可能会对Jeff's article编码恐怖非常有趣。

祝你好运!!

答案 3 :(得分:1)

  

我遇到垃圾邮件条目问题   在我的数据库中通过注册表单。一世   尝试了很多开源Captcha   解决方案,但仍面临同样的问题   问题

您使用什么样的spamprotection?我觉得奇怪的是,spamprotection失败了(完全)。就像很多其他人都说recaptcha非常好而且很多大玩家都在使用它们(Think Twitter)。

例如,您可以使用recaptcha进行注册。接下来通过使用wordpress akismet测试一些垃圾邮件(第一篇)来验证用户是否发布了垃圾邮件。这可以帮助您更多地检测垃圾邮件。

然后再次完全击败垃圾邮件真的很难。彻底打败垃圾邮件几乎是不可能的。我读到某个地方,一些垃圾邮件发送者甚至从印度雇佣人员来破坏你的垃圾邮件保护。

  

有一系列更好的   简单的随机问题或   像“6 +?= 9”这样的东西会更好   作为一个问题?唯一的事情   我担心的是,如果它就像它一样容易   这是为了保护注册然后为什么   不像Facebook这样的大巨头   这样做?

这种方法有一些缺点:

  • 这个逻辑很容易嵌入到spambot中。我甚至可以编写能够毫不费力地打败6 + ? = 9的代码。
  • 有些用户在数学方面可能不好(或确实),或者不知道问题的答案。

答案 4 :(得分:1)

由于这里没有提及,我将简要介绍一下我在中等访问过的论坛上使用的方法。请注意,我只会解释基本想法。可以实施多种变体来使自动化垃圾邮件变得更加困难。

我的工作是:

  1. 引入一些常数作为盐。这个常数对于您的网站来说是独一无二的,它应该是一个秘密。
  2. 使用远程IP,用户代理,一天中的小时(请注意,如果小时在请求和发送表单之间切换时可能会失败)和类似的数据来计算盐渍哈希值(MD5,SHA1)。另一个输入是论坛元素的原始字段名称(例如emailname,...),以便现在每个客户端计算每个字段名称。我在前面加上一些字母或类似字母,以确保名称不以数字开头,这可能会导致问题。
  3. 用户发送表单。
  4. 接收脚本具有相同的输入数据(即不必通过表格左右发送)。
  5. 接收脚本使用与2.中相同的方法后,它可以评估表单数据并采取相应的操作。
  6. 同样,这可以与其他方法结合使用。但是,独特的盐将允许广泛使用 - 不同的盐值使得无法轻易预测字段名称,即使已知计算哈希的方法。如果垃圾邮件发送者变得聪明,则必须使用其他手段来伪装相应的表单输入元素(即,如果他们不只是查找字段的名称)。

    这很简单,100%兼容屏幕阅读器(即使对盲人也可以使用),并为我创造了奇迹。它在我管理的论坛中大大减少了垃圾邮件。希望它也会帮助你。

答案 5 :(得分:0)

甚至验证码都经过解码,正如John Resig在本文中所看到的那样:

OCR and Neural Nets in JavaScript

And there exist online tools too.

话虽如此,流行的Google reCAPTCHA解决方案似乎也很适合,也就是这个网站使用的解决方案。

另一方面,人们总是可以选择审核。

答案 6 :(得分:0)

您是否已尝试reCAPTCHA

已经有很多垃圾邮件可以解决简单的数学问题。

Facebook没有使用类似的东西的原因是,如果他们这样做,他们的解决方案将被特别破解,因为他们是一家拥有数百万用户的大公司。

答案 7 :(得分:0)

您确定无法使用reCAPTCHA吗?我认为这是目前互联网上最好的验证码。

但我想到了一个完全不同的问题方法,这可能值得尝试。

通过使用OpenID进行注册,您可以解决Google,Twitter,Facebook和其他问题。这样,垃圾邮件发送者就需要拥有Google帐户。我很确定他们不会垃圾邮件。

答案 8 :(得分:0)

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

它使用了一系列测试组合,包括基于javascript的鼠标移动检查,键盘使用情况和填写时间,以及对网址,垃圾词和与Akismet和{{的可选集成的一些基本检查3}}。我发现它是一种极好的威慑力,对合法用户来说几乎是完全不可见的。

我确定端口需要工作但它对我有用。随意贡献任何东西。

答案 9 :(得分:0)

你可以在没有验证码的情况下做到这一点,你可以添加一个隐藏的表格,而不是检查这个人们看不到的表格是否填满,你可以用php做到这一点

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

这是因为spambot通常会填充每个文本区域。

在表单中,您应该只添加

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