原始代码 - PHP请求时的响应

时间:2011-05-12 03:09:21

标签: php security

正如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>,我该如何解决这个问题?

7 个答案:

答案 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)

这不会阻止任何事情,事实上它只会给你的服务器增加更多压力。

改为使用hashcashWordpress 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条左右的评论,人们将不得不做一个非常简单的数学运算!