我在注册表单中遇到了垃圾信息入库的问题。我已经尝试过许多开源验证码解决方案,但仍然面临同样的问题。
因此,我正在寻找替代解决方案。那么,使用用户需要输入答案的解决方案如何?问题的答案将是服务器端特定的单词,这样是否一定能打败垃圾机器人?
是随机提出一系列简单的问题还是像“6 +?= 9”这样的问题更好?唯一让我担心的是,如果这么容易保护注册,那么像 Facebook 这样的大公司为什么不这样做呢?
我在注册表单中遇到了垃圾信息入库的问题。我已经尝试过许多开源验证码解决方案,但仍然面临同样的问题。
因此,我正在寻找替代解决方案。那么,使用用户需要输入答案的解决方案如何?问题的答案将是服务器端特定的单词,这样是否一定能打败垃圾机器人?
是随机提出一系列简单的问题还是像“6 +?= 9”这样的问题更好?唯一让我担心的是,如果这么容易保护注册,那么像 Facebook 这样的大公司为什么不这样做呢?
请注意,大多数专业垃圾邮件发送者都与血汗工厂(每1000个解决方案1美元)人类验证码解决API集成。当垃圾邮件发送者无法通过验证码本身时(垃圾邮件机器人),它会保持数百个开放连接,并发送包含CAPTCHA的屏幕截图(或网页代码)以供血汗工厂人员解决。这是合法的,也是一个巨大的生意。为了合法,并通过API与机器人集成,人类解决者不能直接与已破解的网络板块(博客评论、注册页面、聊天、维基、论坛等)进行互动。
另一个问题是反垃圾邮件程序无法检测专业机器人基于上下文的垃圾邮件。有许多方法。最简单的方法是从其他网络板块中网页抓取多作者人类对话,并从不同国家的不同IP地址在不同时间发布它们(机器人可以检测到主题),因此即使(博客)所有者(人类)也无法检测到对话是由机器人发布的(它们实际上是存储在数据库中的人类对话)。
这只是关于您的网站是否受到专业垃圾邮件发送者兴趣或业余爱好者自动规避大多数(如果不是全部)CAPTCHA的问题。
这个问题在这个网站上已经被提出很多次了[需要参考文献:)]
这是一个相当复杂的问题,但我想简短的答案是我们只能使用通常的方法!
我认为这个网站很好地解决了这个问题,但是,像往常一样,如果不牺牲用户的可用性,你将不得不使用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);
?>
您可以为其添加一些 高斯模糊 等等-
当然,这只是一个例子(永远不要使用这个 :))
但这只是一个想法,可以做些什么。
遗憾的是,除非您希望用户进行非常复杂的数学计算(这可能仅适用于某些受众群体),否则您的选项更加有限。此外,如果任何人想要专门针对您的网站进行攻击,则具有有限选项可能会是一个坏主意,因为非常容易受到攻击。
总之,在我看来,您将被困在通常的广告中,并且必须忍受一些垃圾邮件,这只是您可能需要面对的妥协。
您可能会发现 杰夫的编码恐怖文章 很有趣。
祝好运!
既然这里没有提到,我将简要介绍我一直在一个中等访问量的论坛上使用的方法。请注意,我只会解释基本思路。有几种变化可以实现,使自动垃圾邮件更难。
我的做法是:
email
、name
等),因此现在每个字段名称都是按客户端计算的。我在前面加了一些字母或类似的东西,以确保名称不以数字开头,这可能会引起问题。同样,这可以与其他手段结合使用。但是唯一的盐将使其被广泛使用-不同的盐值使得即使已知计算哈希的方法,也很难预测字段名称。如果垃圾邮件发送者变聪明了,就必须使用其他手段来掩盖相应的表单输入元素(即使他们不仅仅寻找字段名称)。
它很简单,100%屏幕阅读器兼容(即使对于盲人也可用),并且在我管理的论坛中奏效。它大大减少了垃圾邮件。希望它也能帮助到您。
6 + ? = 9
。您可以不用验证码实现这一功能,您可以添加一个隐藏的表单,然后检查人们无法看到的表单是否已被填充,您可以使用 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;"/>
你尝试过reCAPTCHA了吗?
已经有很多垃圾邮件机器人能够解决简单的数学问题。
Facebook不使用类似的解决方案的原因是,如果他们这样做,他们的解决方案会被破解,因为他们是一个拥有数百万用户的大公司。
我刚刚完成了将Jake Munson的优秀CFFormProtect移植到PHP的工作。它托管在http://code.google.com/p/phpformprotect/。
它使用了一系列测试,包括基于JavaScript的鼠标移动、键盘使用和填写时间检查,以及一些基本的URL检查、垃圾邮件词汇检查,并可选择与Akismet和Project Honey Pot进行集成。我发现它是一个非常好的威慑措施,对合法用户几乎完全不可见。
我相信这个移植还需要改进,但它对我来说已经可以使用了。欢迎贡献任何东西。