我运行了一个游戏网站,因此我有很多用户登录,他们可以每两分钟做一次某些事情。

我在某些地方有一个验证码系统,在某些方面,它总是会要求代码,而对于其他事情,它将每10分钟要求一次。

我有一些玩家在Opera上使用自动提交功能,而我的验证码系统确实阻止了它们。

我的问题是,如何最大程度地减少要求代码的次数,但仍会阻止人们使用此自动补充?

有帮助吗?

解决方案

如果我正确理解,此任务不需要验证码。我想您想看看用户是否坐在他的PC前面。

新想法

将多个图像提交您的表格:

<input type="image" name="send1" src="buttons.php?i=1" />
...
<input type="image" name="send8" src="buttons.php?i=8" />

生成表单时,将随机数在1到8之间,并将其保存在 $_SESSION['submitnumber']。创建两个相同尺寸的图像 - 一个空的填充您的默认背景,另一个看起来像一个提交按钮。创建将使用此代码输出图像的buttons.php:

header("Content-Type: image/jpeg");
flush();
readfile($filename);

并返回空图 $_GET[i]!=$_SESSION['submitnumber'] 否则返回提交图像。

如果单击正确的imagesUbmit,请接受表格(当用户单击按钮时,浏览器将向您发送坐标,例如send1x)

这是一种验证码,但人们不知道;)

旧的主意

您需要两件事:

1 生成非常独特的形式的令牌。

<input type="hidden" name="timertoken" value="someweirdstring" />并生成“某些weirdstring”,使其成为某些(用户名和时间)依赖性事物的MD5哈希。我可以详细说明这一点,但这是安全和CSRF攻击阻塞的基本形式。发布后的令牌会得到验证。

例子:

这是 不是 令牌机制的典型实现,但这足够了。

$token=generatesomerandomtext();
$_SESSION['token']=$token; 

//... somewhere later when outputing forms:    
echo '<input type="hidden" name="token" value="'.$token.'" />';

//and when it comes back:
if($_POST['token']==$_SESSION['token']) {
   //it's ok
   }

这就是您所需要的。这个简单的示例为每个页面创建一个唯一的令牌,并列出表格。这不是时间取决于时间,也不使用MD5,而是在会话中存储令牌。要自动发送将接受的表格,该人必须使用您生成的表格或复制令牌。

真实的令牌示例更像是这样:$ token = md5($ username.'some secret text'。$ date。$ timerounded to 10minutes);

//... somewhere later when outputing forms:    
echo '<input type="hidden" name="token" value="'.$token.'" />';

//and when it comes back:
if(
 ($_POST['token']==md5($username.'some secret text'.$date.$timeRoundedTo10Minutes)) ||
 ($_POST['token']==md5($username.'some secret text'.$date.$timeRoundedTo10Minutes-10minutes)) ) {
   //it's ok
   }

为什么要用户名?因为它可以消除使用一个用户的令牌来破解另一个用户为什么为什么秘密文本(称为“盐”)?因为有人可以随着时间的流逝将其他用户的名字粘在一起,但在不猜测他不能的盐的情况下。为什么两个比较?因为如果现在是22:44:59-代币是用22:40生成的,如果用户发送它是22:45:30,则将其舍入到22:50,并且仅在10分钟后才匹配令牌。

就是这样一个基本示例。有关参考,请参见 这个 问题。

2 将您的提交按钮更改为 <input type="image" ... 当它发布单击按钮的位置的X和Y坐标时。我不知道是谁在规范中提出了这一点,但这是第一次可以使用! :)

现在,要查看用户是否单击自己,您只需要查看是否存在坐标(经典提交不会发送它们),并且要阻止简单的黑客入侵,您也可以记住玩家的会话中的最后一个X和Y,并比较。每次发送不同的坐标很难入侵它。

表格令牌是为了防止用户使用随机字段来准备您的表单副本,以模拟点击坐标。如果代币每次都更改,则很难覆盖表单字段。

这仍然可以通过用户标题功能入侵,但是要困难得多。而且,如果您一次添加一次验证码,那么没人会打扰编写脚本,这些脚本只有一个小时并在此之后休息(并且需要一些努力和知识)。

其他提示

根据收到的数据,您可以收集呼叫者是用户的情况。仅要求验证码,如果呼叫者似乎是机器人。

可见的可能是:

  • 用户代理(不可靠,因为歌剧可以伪造这个)
  • 提交触发的间隔(呼叫越严格每2分钟命中IE一次,它的可能性就越大)
  • 如果您的数据允许检查返回模式,这也可能很明显
  • ...
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top