【问题标题】:Comparing user-input CAPTCHA value against expected value stored in session将用户输入的验证码值与会话中存储的预期值进行比较
【发布时间】:2011-04-13 21:20:03
【问题描述】:

我正在尝试在我正在构建的表单中实现一个简单的验证码,但我遇到了一个我自己似乎无法解决的问题。

我正在使用简单的代码来生成一个像这样的随机数......

$randomnr = rand(1000, 9999);
$_SESSION['randomnr2'] = md5($randomnr);

....然后是更多代码来生成随机数的图像并将其显示在页面上。我反对这样的有效性....

if (strlen($captcha) !== ($_SESSION['randomnr2'])) { 
    $error['captcha'] = "CAPTCHA error. Please try again";
}

如何检查输入到验证码输入字段的值与存储在会话randomnr2 中的随机数?

【问题讨论】:

  • 呜呜呜呜!这不是验证码的工作方式。您不检查长度,而是检查两个字符串的实际内容。至于你的第二个问题,没有 id="captch" 有一个 ,最好是他输入的输入字段来填写验证码。
  • 您正在对存储在会话中的 $randomnr 的值进行哈希处理...您还应该对 $captcha 的值进行哈希处理并比较两个哈希值
  • @Khez - 是的,很抱歉。这不是我应该检查的长度 - 这是内容:) 谢谢。从下面的答案中,我看到我应该改用“int”。输入字段有两个术语 。谢谢你的回复:)
  • @Mark 感谢您的回复。这很有意义。你能向我解释一下如何对输入字段的值进行哈希处理吗?
  • @Mark @Jerry 如果我正确理解您在验证码中显示的应用程序哈希,这意味着不需要重新哈希用户输入。附言md5 是一个很长的验证码。

标签: php forms captcha


【解决方案1】:

我不确定您为什么要在这里对照字符串的 md5 哈希检查字符串的长度,但假设 $captcha 是来自用户的数字,您可以这样做:

if(md5($captcha) !== $_SESSION['randomnr2']) {
  $error['captcha'] = "CAPTCHA error. Please try again";
}

【讨论】:

  • 谢谢,但它不起作用。我要做的是确定存储在“$captcha”变量中的 VALUE(而不是 strlen)是否与散列随机数匹配。变量确定如下..... $captcha = $_POST['captcha'];'其中验证码是表单上的用户输入字段 - 。我意识到我可能不得不采取不同的方法——因为正如另一个有用的灵魂所指出的那样,这并不安全——但如果我能学会如何做到这一点,它仍然会真正帮助我——如果可以做到的话。可以将该值与散列数进行比较吗?
  • 让我看看,你上面写的代码说“如果散列变量'captcha'不等于存储在会话'randomnr2'中的散列数返回错误变量......对吧?那应该对我有用......但它没有:(
  • 它确实有效。我很抱歉,非常感谢您提供的这些信息 GSto。笨蛋,我今天早些时候更改了验证码脚本,并删除了会话中存储随机数的部分——我只是想让原始数字匹配。无论如何,由于没有与储值的会话,它永远不会起作用,但现在有,它就像一个魅力。谢谢:)
【解决方案2】:

PHP 会自动将 strlen() 的任何内容转换为字符串(如果可以的话),所以

echo strlen(42); 
echo strlen('42');

都会输出'2',即使第一个是整数。将提交的值与存储的值进行比较,很简单

if ($_SESSION['randomnr2'] === (int)$captcha) {
   ... it matched ...
}

您需要再次将提交的值转换为 int,因为 PHP $_GET/POST 数组中的任何内容在内部都被视为字符串。

【讨论】:

  • 感谢您的回复马克。我设置东西的方式是我或多或少必须以这种方式检查它......如果输入字段“验证码”的内容与存储的哈希数字不匹配,则显示“重试”否则继续.. ....
【解决方案3】:
<div id='captcha_to_show' style='border:1px solid silver;'>gobldeygook</div>
<input name='captcha' id='captcha'>

...

通过 scriptmonkey 附加...

$('document').ready(function(){
  $('#captcha').val($('#captcha_to_show').html());
});

查看开源验证码脚本。您的实现将需要在页面上发送该验证码,使其值可以被任何拉动页面的人看到,并且该人/机器人/任何人都可以相应地填写验证字段,因此您实际上拥有零保护。这就是为什么验证码要么使用难以用脚本阅读的复杂图像,要么使用人类在上下文中比机器人更好理解的语义问题,例如 ['你认为 1 和 3 的总和是多少?' === 4]。是的,设置字体、间距和大小的更简单的图像验证码可以通过一种像素模式字典攻击来破解。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-27
    • 2023-04-01
    相关资源
    最近更新 更多