正如Stopping Bot [SO]提出的那样- PHP我开发了一个PHP的反僵尸系统,可以在https://codereview.stackexchange.com/questions/2362/anti-bot-comment-system-php查看代码
但任何人都可以通过查看来获取令牌.因此,getToken.php
他们从stackauth.com[我认为通过查看页面代码] 得到令牌,但是当我浏览它时它只显示了一些文本!
我怎么能这样做?[代码只在代码请求时传递,而不是由浏览器传递]
在表单页面中生成和验证令牌的过程
$hash=sha1($time.$myKey);
echo $time.'#'.$hash;
Run Code Online (Sandbox Code Playgroud)
在海报/验证页面中
$token=explode($_POST['token'],'#',2);
if (sha1($token[0].$myKey)==$token[1])
echo 'A good Human';
Run Code Online (Sandbox Code Playgroud)
Edit
我没有在数据库中存储使用过的令牌,并且在[比较] 5分钟后令牌过期了!
认为一个坏用户获得令牌2011-05-18 11:10:12#AhAShKey000000000 他可以使用令牌提交随机文本到2011-05-18 11:15:12,我该如何解决这个问题?
仔细阅读所有答案后,我开发了这个[感谢所有人的宝贵评论和答案]
<?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/>';
}
?>
Run Code Online (Sandbox Code Playgroud)
这可以通过在中添加随机数量的空格来增强 $txt = $val.$spaces.$ope.$spaces.$val2;
而且它比验证码更快,如果人们在一小时内发布超过 30 条左右的评论,就必须做一个非常简单的数学计算!