【问题标题】:I am tring to make a simple captcha in PHP, what am I doing wrong?我正在尝试用 PHP 制作一个简单的验证码,我做错了什么?
【发布时间】:2015-07-02 07:50:14
【问题描述】:

我正在尝试在 PHP 中制作一个简单的验证码,只是为了学习,目前还没有将字符串转换为图像,我不知道我做错了什么?我什至无法验证代码,它给出的字符串每次都不匹配

这是代码

    <?php


    $var = 'abcdefghijklmnopqrstuywxyz1234567890';

    $random = str_shuffle($var);

    $captcha = substr($random,0,10);
    echo $captcha;


    if(isset($_POST['captcha'])){

    $check = $_POST['captcha'];
    if ($captcha==$check){
    echo 'Verified.';

    }else{echo 'string didn\'t match';}

    }

    ?>
    <form action="random.php" method="POST">
    <input type="text" name="captcha"><br>
    <input type="submit" value="Submit">
    </form>

【问题讨论】:

  • 有什么不工作吗?这是一个反问句吗?
  • 呃,不想打扰你,但验证码的全部意义在于防止机器人发送垃圾邮件。这不会那样做。机器人会笑话你的。
  • 验证码本质上应该是图形而不是文本!机器人可以轻松阅读文本。
  • "学习目的,现在不把字符串转换成图像"如果你想构建一些东西来学习就可以了。问题是您在检查 POST 数据是否正确时再次生成验证码。你应该怎么做,呸!稍后将在下面解释。
  • 1 生成随机字符串。 2 显示它 3 用户填写表格并提交它 4 生成随机字符串 5 检查新的随机字符串与发布的值!在这里发现问题?

标签: php captcha


【解决方案1】:

我不建议将其用于验证码。

但我只为您的learning purpose 更正您的代码。

<?php

session_start();

if(isset($_POST['captcha'])){

$check = $_POST['captcha'];
if ($_SESSION['captcha']==$check){
echo 'Verified.';

}else{echo 'string didn\'t match';}

}

$var = 'abcdefghijklmnopqrstuywxyz1234567890';

$random = str_shuffle($var);

$captcha = substr($random,0,10);
echo $captcha;
$_SESSION['captcha'] = $captcha;

?>
<form action="random.php" method="POST">
<input type="text" name="captcha"><br>
<input type="submit" value="Submit">
</form>

【讨论】:

  • Thanx Ashwin,所以我想如果不开始会话就无法做到这一点
  • 您必须以某种方式存储验证码文本的值。在这里,我正在使用会话进行此操作。
  • 所以我们需要存储 $captcha 的值,因为每次我们点击提交页面都会刷新并且 $captcha 的值会发生变化。甜:)
【解决方案2】:

要创建一个简单的验证码表单,那么这里有一个小指南:

===== 1 步 ====== 在您的 FTP 文件夹(您需要的位置)中,放置一个字体文件(例如:yourfont.ttf)。 然后创建一个文件(称为 captcha.php)并将下面的代码粘贴到其中(然后将该 captcha.php 放在同一个 ftp 文件夹中):

<?php session_start();

// generate random number and store in session
$randomnr = rand(1000, 9999);
$_SESSION['randomnr2'] = md5($randomnr);
//generate image
$im = imagecreatetruecolor(100, 38);
//colors:
$white = imagecolorallocate($im, 255, 255, 255);
$grey = imagecolorallocate($im, 128, 128, 128);
$black = imagecolorallocate($im, 0, 0, 0);
imagefilledrectangle($im, 0, 0, 200, 35, $black);

// -------------      your fontname    -------------
//  example font http://www.webpagepublicity.com/free-fonts/a/Anklepants.ttf
$font = 'yourfont.ttf';

//draw text:
imagettftext($im, 35, 0, 22, 24, $grey, $font, $randomnr);

imagettftext($im, 35, 0, 15, 26, $white, $font, $randomnr);

// prevent client side  caching
header("Expires: Wed, 1 Jan 1997 00:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: no-store, no-cache, must-revаlidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");

//send image to browser
header ("Content-type: image/gif");
imagegif($im);
imagedestroy($im);
?>

===== 2 步 ======

然后在任何页面(您要实现验证码的地方)将此代码放在该页面内的某个位置(当然,在此代码的最后一部分,如果代码是,有一个示例 PHP 函数可以执行示例操作输入正确。所以你应该知道更多的PHP编程来在验证码正确时执行你想要的功能):

<form method="post" action=""> <img src="captcha.php" />
<input class="input" type="text" name="codee" />
<input type="submit" value="Submit" />
</form>

<?php
session_start();
if (md5($_POST['codee']) == $_SESSION['randomnr2']) { 
// here you  place code to be executed if the captcha test passes
  echo "YES. Do Something function1";
} 

else {  
 // here you  place code to be executed if the captcha test fails
  echo "No.  Do Something function2";
}
?>

【讨论】:

  • 我可以通过阻止对“captcha.php”的访问来轻松破解此示例。这样,$_SESSION['randomnr2'] 是空的,所以我需要做的就是不要填充 $_POST['codee']。检查验证码时,应该检查以确保 $_POST['codee'] 和 $_SESSION['randomnr2'] 都不是空的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-03
  • 2012-05-19
  • 1970-01-01
相关资源
最近更新 更多