Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 将用户输入的验证码值与会话中存储的预期值进行比较_Php_Forms_Captcha - Fatal编程技术网

Php 将用户输入的验证码值与会话中存储的预期值进行比较

Php 将用户输入的验证码值与会话中存储的预期值进行比较,php,forms,captcha,Php,Forms,Captcha,我试图在我正在构建的表单中实现一个简单的验证码,但我遇到了一个我自己似乎无法解决的问题 我用简单的代码生成一个随机数,就像这样 $randomnr = rand(1000, 9999); $_SESSION['randomnr2'] = md5($randomnr); 。。。。然后再编写一些代码,生成随机数的图像并显示在页面上。我反对这样的合法性 if (strlen($captcha) !== ($_SESSION['randomnr2'])) { $error['captcha'

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

我用简单的代码生成一个随机数,就像这样

$randomnr = rand(1000, 9999);
$_SESSION['randomnr2'] = md5($randomnr);
。。。。然后再编写一些代码,生成随机数的图像并显示在页面上。我反对这样的合法性

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

如何根据会话中存储的随机数检查输入到captcha输入字段中的值
randomnr2

我不知道为什么要根据字符串的md5哈希值检查字符串的长度,但假设
$captcha
是用户的数字,您可以这样做:

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

我不确定您为什么要在此处根据字符串的md5哈希值检查字符串的长度,但假设
$captcha
是用户提供的数字,您可以执行以下操作:

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

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

echo strlen(42); 
echo strlen('42');
两个都将输出“2”,即使第一个是整数。要将提交的值与存储值进行比较,只需

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

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

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

echo strlen(42); 
echo strlen('42');
<div id='captcha_to_show' style='border:1px solid silver;'>gobldeygook</div>
<input name='captcha' id='captcha'>
两个都将输出“2”,即使第一个是整数。要将提交的值与存储值进行比较,只需

if ($_SESSION['randomnr2'] === (int)$captcha) {
   ... it matched ...
}
您需要再次将提交的值转换为int,因为PHP$\u GET/POST数组中的任何内容在内部都被视为字符串

<div id='captcha_to_show' style='border:1px solid silver;'>gobldeygook</div>
<input name='captcha' id='captcha'>
查看开源验证码脚本。您的实现将需要在页面上发送验证码,其方式是,任何拉动页面的人都可以看到验证码的值,并且此人/机器人/任何人都可以相应地填写验证字段,因此您实际上没有任何保护。这就是为什么CAPTCHA要么使用难以用脚本阅读的复杂图像,要么使用比机器人更容易理解的语义问题,例如[“你认为1和3的总和是多少?”==4]。是的,设置字体、间距和大小的更简单的图像验证码可以通过某种像素模式字典攻击进行攻击


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

Woo-Woo-Woo-Woo!验证码不是这样工作的。您不检查长度,而是检查两个字符串的实际内容。至于你的第二个问题,不要有id=“captch”,最好是他输入的输入字段来填充验证码。你正在散列会话中存储的$randomnr的值。。。您还应该对$captcha的值进行散列并比较这两个散列values@Khez-是的,很抱歉。这不是我应该检查的长度,而是内容:)谢谢。从下面的答案中,我看到我应该用int来代替。输入字段包含两个术语。谢谢你的回复:)@Mark谢谢你的回复。这很有道理。你能给我解释一下如何对输入字段的值进行散列吗?@Mark@Jerry如果我能正确理解你在captch中显示的应用程序,则表示不需要对用户输入进行重新散列。注意,md5是一个很长的验证码。呜呜呜呜呜!验证码不是这样工作的。您不检查长度,而是检查两个字符串的实际内容。至于你的第二个问题,不要有id=“captch”,最好是他输入的输入字段来填充验证码。你正在散列会话中存储的$randomnr的值。。。您还应该对$captcha的值进行散列并比较这两个散列values@Khez-是的,很抱歉。这不是我应该检查的长度,而是内容:)谢谢。从下面的答案中,我看到我应该用int来代替。输入字段包含两个术语。谢谢你的回复:)@Mark谢谢你的回复。这很有道理。你能给我解释一下如何对输入字段的值进行散列吗?@Mark@Jerry如果我能正确理解你在captch中显示的应用程序,则表示不需要对用户输入进行重新散列。另外,md5是一个很长的验证码。谢谢你的回复。我把事情安排好的方式是,我或多或少得这样检查。。。如果输入字段“captcha”的内容与存储的哈希数字不匹配,则显示“重试”,否则继续……感谢您的回复标记。我把事情安排好的方式是,我或多或少得这样检查。。。如果输入字段“captcha”的内容与存储的哈希数字不匹配,则显示“重试”,否则继续……谢谢,但它不起作用。我要做的是确定存储在“$captcha”变量中的值(而不是strlen)是否与哈希随机数匹配。变量的确定如下所示$验证码=$_POST['captcha'];'其中,captcha是表单上的用户输入字段-。我意识到我可能不得不采取一种不同的方法——因为正如另一位乐于助人的灵魂所指出的那样,这并不安全——但如果我能学会如何做到这一点——如果能够做到的话,这仍然会真正帮助我。可以