0

所以这就是这种情况,这与我建立的一个愚蠢的验证码系统有关。

register.php, register.tpl, writer.php

register.tpl 创建表单

register.php 处理表单,但还最初创建一个随机数,该表单在 register.tpl 中作为变量选取,即 {vcode}。

该随机数用于以下上下文:

<img src="/system/writer.php?R=0&amp;T={vcode}" />
<input type="hidden" name="syscode" value="{vcode}" />
<strong>Enter Code:</strong>
<input name="code" type="text" id="code" />

writer.php 捕获 vcode 的值并创建图像。

问题:

一个。vcode 可以被机器人读取,因此这个验证码是无用的。

湾。register.php 询问是否 syscode != code 但同样 syscode 是一个无用的字段,因为机器人可以读取它。

C。我已经在 register.php 中生成了一个随机数并将其放在 writer.php 中,但我无法获得在 register.php 中创建的随机变量的值以进行比较,如下所示:

在 writer.php 我有 $randno = and(1,999999); 并且该值显示为图像 - 我知道你们都知道,但现在我需要 register.php 来读取 $randno 或获取值,以便它可以进行比较,如下所示:

如果 $code = $randno { 东西 }

基本问题是使用 TPL 文件创建值得信赖的验证码……这并不容易。

每一个,我感谢你的帮助和试图帮助我。

4

1 回答 1

0

简单的解决方案:

使用会话存储来存储代码或使用数据库:

register 生成一个代码并将此代码存储在会话/数据库中。

如果您想使用数据库,请务必使用例如随机令牌以避免暴力破解其他代码。

如果没有,攻击者可以取消所有验证码,您的用户无法注册。

如果要使用会话,则可以省略 writer.php 的令牌、数据库、隐藏字段和参数。

但如果你不想使用会话:

注册.php:

if(form_is_submitted()) {
  /*check captcha */
  $captcha_id = (int) $_POST['captcha_id'];
  //SELECT code, token FROM captchas WHERE id = $captcha_id 
  if($token != $_POST['token'] ) 
    die("Error");

  // DELETE FROM captchas where id = ...

  if( $code != $_POST['code'])
    // -> error

}
/* Display form */
$code = generate_code();
$token = generate_token();
mysql_query("INSERT INTO captcha (code, token) VALUES ($code, $token)");
$tpl['chaptcha_id'] = mysql_insert_id()

注册.tpl

<img src="/system/writer.php?R=0&amp;T={captcha_id}" />
<input type="hidden" name="token" value="{token}" />
<input type="hidden" name="captcha_id" value="{captcha_id}" />
<strong>Enter Code:</strong>
<input name="code" type="text" id="code" />
于 2013-04-30T03:10:20.007 回答