Mar
2
PHP的验证码程序 (原来这么简单!)
想接一个资料站的项目. 虽然什么都还没开始具体考虑, 不过我突然想到上传资料的时候肯定是需要验证码的. 于是上网去搜. 百度了一下"验证码程序 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 ------------------
------------------ End of index.php -------------------------
--------------------- img.php --------------------
---------------- End of img.php -----------------------
转载请注明出自 ,如是转载文则注明原出处,谢谢:)
RSS订阅地址: https://www.felix021.com/blog/feed.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>
//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);
?>
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 。
boluor
2009-5-31 01:14
这是一条隐藏评论或留言。您需要以合适的身份登入后才能看到。
felix021 回复于 2009-5-31 11:02
要想真正明白cookie和session的区别,就要去看HTTP协议中的cookie字段。
分页: 1/1 1