Mar 2

PHP的验证码程序 (原来这么简单!) 不指定

felix021 @ 2008-3-2 01:42 [IT » 网络] 评论(1) , 引用(0) , 阅读(6456) | Via 本站原创 | |
想接一个资料站的项目. 虽然什么都还没开始具体考虑, 不过我突然想到上传资料的时候肯定是需要验证码的. 于是上网去搜. 百度了一下"验证码程序 PHP", 搜到一堆相同的文章, 代码是贴出来了,不过基本上只是介绍了如何生成验证码图片并加入干扰象素: 那代码把验证码放在了表单里作为隐藏的字段, 那就失去了意义. 不过作者提示, 可以用session来实现真正的验证码的安全性. 于是开始看和Session有关的东西. 以前一直觉得Session很神秘, 用了才知道, 简单的要死...靠...牛X的PHP啊.

所以这里先记录一下session的使用吧(session是什么?汗...百度一下吧):
1. 要想使用session, 必须先使用函数 session_start();
2. 给session变量赋值有两种办法:
  a. session_register()函数;
  b. $_SESSION["xxxx"] = ooxx;
3. 取得session变量的值:  $a = $_SESSION["xxxx"];
4. 注销一个session变量: session_unregister()函数.
比Cookie还简单啊..不得不说PHP真是太牛B了......

好, 开始正文.

直接贴代码吧, 有注释, 很简单的.

参见了搜到的代码, Felix自己加以改进和丰富, 一般OCR程序恐怕对付不了~~呵呵
-----------------  index.php  ------------------
<?php

//Copyleft Felix021 http://www.19880711.com

session_start();//开启session

function rndstr($length=4)//随机生成字符串函数
{
  srand((double)microtime()*1000000);
  $charset = "23456789"; //设置字符串中可以有的字符
  $charset .= "ABCDEFGHJKLMNPQRSTUVWXYZ"; //同上
  $charset .= ""; //同上,用于自行添加
  $str = "";
  while($length--)
    $str .= substr($charset,rand(0,strlen($charset)-1),1);
  return $str;
}

if(!isset($_POST['checkcode']))
{
  $_SESSION['imgstr'] = rndstr(); //生成验证码并存入session
  echo <<<eot
<form action="{$_SERVER['PHP_SELF']}" method="post">
input checkcode:<br/>
<input type="text" name="checkcode"/><img src="img.php"/><br/>
<input type="submit" value="verify"/>
</form>
eot;
}
else
{  //使用strtolower以忽略大小写
  if(strtolower($_POST['checkcode']) == strtolower($_SESSION['imgstr']))
  {    echo "OK";  }
  else
  {    echo "BAD";  }
}
?><br/><a href=".">try again</a>

------------------ End of index.php -------------------------

---------------------  img.php    --------------------
<?php
session_start(); //开启session
srand((double)microtime()*1000000);//初始化随机数生成器
header("Content-type: image/PNG");//表示输出PNG图片

$x = 40; //验证图片宽度
$y = 22; //验证图片长度

// 新建一个基于调色板的图像, 分配一个对应x*y大小的内存空间
$im = @imagecreate($x, $y) or die("Cannot Initialize new GD image stream");

// 用RGB方式生成背景颜色,这里是纯白
$background_color = imagecolorallocate($im, 255, 255, 255);
// 生成黑色(后面用于干扰象素)
$black = imagecolorallocate($im, 0, 0, 0);
// 生成文本的颜色,这里是红色
$text_color = imagecolorallocate($im, 233, 14, 91);

// 在图片里写入的[rand()%5, rand()%5]位置以5号大小的字体写入字符串.
// rand()%5+1是为了保证写入字符串的位置不固定,避免OCR识别
imagestring($im, 5, rand()%5+1, rand()%5+1,  $_SESSION['imgstr'], $text_color);

//加入干扰象素
for($i=0;$i<20;$i++)
  imagesetpixel($im, rand()%$x , rand()%$y , $black);

//完成图片并输出
imagepng($im);

//释放与 image 关联的内存
imagedestroy($im);

?>

---------------- End of img.php -----------------------



欢迎扫码关注:




转载请注明出自 ,如是转载文则注明原出处,谢谢:)
RSS订阅地址: https://www.felix021.com/blog/feed.php
Tags: , ,
boluor Email Homepage
2009-5-31 01:14
这是一条隐藏评论或留言。您需要以合适的身份登入后才能看到。
felix021 回复于 2009-5-31 11:02
要想真正明白cookie和session的区别,就要去看HTTP协议中的cookie字段。
分页: 1/1 第一页 1 最后页
发表评论
表情
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
打开HTML
打开UBB
打开表情
隐藏
记住我
昵称   密码   *非必须
网址   电邮   [注册]