正如Stopping Bot [SO] - PHP所提出的,我已经开发了一个PHP的反僵尸系统,可以在https://codereview.stackexchange.com/questions/2362/anti-bot-comment-system-php查看代码
但任何人都可以通过查看getToken.php
来获取令牌
在SO中,他们从stackauth.com
获取令牌[我认为通过查看页面代码],但是当我浏览它时它只显示了一些文字!
我怎么能这样做? [仅在代码请求时才传递令牌,而不是由浏览器传递]
生成和验证令牌的过程 在表单页面
$hash=sha1($time.$myKey);
echo $time.'#'.$hash;
在海报/验证页面
$token=explode($_POST['token'],'#',2);
if (sha1($token[0].$myKey)==$token[1])
echo 'A good Human';
Edit
我没有在数据库中存储使用过的令牌,并且在[比较] 5分钟后令牌过期了!
认为一个坏用户获得令牌 2011-05-18 11:10:12#AhAShKey000000000 他可以使用令牌将随机文本提交给 2011-05-18 11:15:12 < / strong>,我该如何解决这个问题?
答案 0 :(得分:3)
不完全确定这是你所追求的答案,但是......
将令牌静态加载到页面中,而不是使用Ajax。然后你就知道表单页面已经加载了。
答案 1 :(得分:2)
您可以使用ftok(__FILE__,'T');
- 并且令牌在每个系统上都是唯一的
您可以使用任何字母代替T
,而不是Manual。
例如,在你的getToken.php中你可以替换:
$hash=sha1($key.'mySecretKey');
与
$hash=sha1($key.ftok(__FILE__,'T'))
;
此功能仅存在于基于linux / unix的系统中。
答案 2 :(得分:1)
这不会阻止任何事情,事实上它只会给你的服务器增加更多压力。
改为使用hashcash(Wordpress plugin)。
答案 3 :(得分:1)
没有什么能完全阻止这种活动。但是对于99.99999999999%的情况,使用服务器端组件的方法加上使用 javascript 对从服务器返回的数据进行转换的方法将阻止大多数机器人在那里(除非他们基于node.js并使用jsdom; - ))。
答案 4 :(得分:0)
嗯,这是不可能修复的。您无法查看机器人或浏览器是否正在查看您的“令牌页面”。你可以检查的所有东西也可以模仿。 (推荐人,更多哈希或用户代理)
您应该问问自己,您希望保护自己的网站?对于常规机器人,你的方法是可以的,它将花费太多时间来破解你的脚本和垃圾邮件只是你的网站。它会继续发送并向其他人发送垃圾邮件。因此,在该演员表中,您的脚本将提供足够的保护。
当有人专门定位您的网站并且他花时间破解它时,他可能会成功。所以你也想保留这种机器人/人?我建议在一小时内从一个IP地址显示一个验证码,例如3个帖子。这将使他们不受欢迎。
并不总是保证完全安全,您的解决方案已经足够好......如果需要更多保护,只需使用验证码或类似的东西。
答案 5 :(得分:0)
好的,就像其他一切一样,并不是完全安全的。
您可以尝试使用带有时间和用户唯一ID的javascript创建类似的哈希值,并将其与请求一起发送。 然后,您甚至可以将其添加到代码生成和验证中。 如果没有此哈希,则不会提供任何代码。
有点像握手。
答案 6 :(得分:0)
在仔细阅读了所有答案之后,我已经开发了这个[感谢所有人的有价值的评论和回答]
<?php
$time = microtime();
for ($i=1;$i<=10000;$i++)
generateMath();
echo 'Generating '.$i.' math Took '.(microtime()-$time);
function generateMath()
{
$operands = array(43,45,42);
$val = chr(rand(48,57));
$ope = chr($operands[rand(0,2)]);
$txt = $val.$ope; //42* 43+ 45- 47/
$val2 = chr(rand(48,57));
$txt .= $val2;
$ans = 0;
if ($ope == '+')
$ans = $val + $val2;
else if ($ope == '-')
$ans = $val - $val2;
else if ($ope == '*')
$ans = $val * $val2;
echo $txt.' -> '.$ans.'<br/>';
}
?>
可以通过在$txt = $val.$spaces.$ope.$spaces.$val2;
它比CAPCHA快,如果他们在一小时内发布超过30条左右的评论,人们将不得不做一个非常简单的数学运算!