当前位置:首页>开发>正文

如何用PHP生成验证码 如何运用PHP GD库生成验证码

2023-04-25 18:44:42 互联网 未知 开发

 如何用PHP生成验证码 如何运用PHP GD库生成验证码

如何用PHP生成验证码

PHP生成验证码的原理:使用PHP的GD库,生成一张带验证码的图片,并将验证码保存在Session中。PHP生成验证码的大致流程有:
1、产生一张png的图片;
2、为图片设置背景色;
3、设置字体颜色和样式;
4、产生4位数的随机的验证码;
5、把产生的每个字符调整旋转角度和位置画到png图片上;
6、加入噪点和干扰线防止注册机器分析原图片来恶意破解验证码;
7、输出图片;
8、释放图片所占内存。
session_start() 
getCode(4,60,20) 

function getCode($num,$w,$h) { 
    $code = "" 
    for ($i = 0 $i < $num $i ) { 
        $code .= rand(0, 9) 
    } 
    //4位验证码也可以用rand(1000,9999)直接生成 
    //将生成的验证码写入session,备验证时用 
    $_SESSION["helloweba_num"] = $code 
    //创建图片,定义颜色值 
    header("Content-type: image/PNG") 
    $im = imagecreate($w, $h) 
    $black = imagecolorallocate($im, 0, 0, 0) 
    $gray = imagecolorallocate($im, 200, 200, 200) 
    $bgcolor = imagecolorallocate($im, 255, 255, 255) 
    //填充背景 
    imagefill($im, 0, 0, $gray) 

    //画边框 
    imagerectangle($im, 0, 0, $w-1, $h-1, $black) 

    //随机绘制两条虚线,起干扰作用 
    $style = array ($black,$black,$black,$black,$black, 
        $gray,$gray,$gray,$gray,$gray 
    ) 
    imagesetstyle($im, $style) 
    $y1 = rand(0, $h) 
    $y2 = rand(0, $h) 
    $y3 = rand(0, $h) 
    $y4 = rand(0, $h) 
    imageline($im, 0, $y1, $w, $y3, IMG_COLOR_STYLED) 
    imageline($im, 0, $y2, $w, $y4, IMG_COLOR_STYLED) 

    //在画布上随机生成大量黑点,起干扰作用 
    for ($i = 0 $i < 80 $i ) { 
        imagesetpixel($im, rand(0, $w), rand(0, $h), $black) 
    } 
    //将数字随机显示在画布上,字符的水平间距和位置都按一定波动范围随机生成 
    $strx = rand(3, 8) 
    for ($i = 0 $i < $num $i ) { 
        $strpos = rand(1, 6) 
        imagestring($im, 5, $strx, $strpos, substr($code, $i, 1), $black) 
        $strx  = rand(8, 12) 
    } 
    imagepng($im)//输出图片 
    imagedestroy($im)//释放图片所占内存 
}

如何运用PHP GD库生成验证码




验证码


请输入验证码



   
   
   


 
   session_start()
   header("Content-type:image/png")

   $img_width=100
   $img_height=20

   srand(microtime()*100000)
   for($i=0$i<4$i )
   {
        $new_number.=dechex(rand(0,15))
   }

   $_SESSION[check_auth]=$new_number
   $new_number=imageCreate($img_width,$img_height)//创建图象
   ImageColorAllocate($new_number,255,255,255)  //设置背景色为白色

   for($i=0$i   {
       $font=mt_rand(3,5)
       $x=mt_rand(1,8)   $img_width*$i/4
       $y=mt_rand(1,$img_height/4)
       $color=imageColorAllocate($new_number,mt_rand(0,100),mt_rand(0,150),mt_rand(0,200))//设置字符颜色
       imageString($new_number,$font,$x,$y,$_SESSION[check_auth][$i],$color)//输出字符
   }

   ImagePng($new_number)
   ImageDestroy($new_number)
?>

怎样用PHP制作验证码


//验证码类
class ValidateCode {
 private $charset = abcdefghkmnprstuvwxyzABCDEFGHKMNPRSTUVWXYZ23456789//随机因子
 private $code//验证码
 private $codelen = 4//验证码长度
 private $width = 90//宽度
 private $height = 40//高度
 private $img//图形资源句柄
 private $font//指定的字体
 private $fontsize = 20//指定字体大小
 private $fontcolor//指定字体颜色
 //构造方法初始化
 public function __construct() {
  $this->font = dirname(__FILE__)./font/elephant.ttf//注意字体路径要写对,否则显示不了图片
 }
 //生成随机码
 private function createCode() {
  $_len = strlen($this->charset)-1
  for ($i=0$i<$this->codelen$i ) {
   $this->code .= $this->charset[mt_rand(0,$_len)]
  }
 }
 //生成背景
 private function createBg() {
  $this->img = imagecreatetruecolor($this->width, $this->height)
  $color = imagecolorallocate($this->img, mt_rand(157,255), mt_rand(157,255), mt_rand(157,255))
  imagefilledrectangle($this->img,0,$this->height,$this->width,0,$color)
 }
 //生成文字
 private function createFont() {
  $_x = $this->width / $this->codelen
  for ($i=0$i<$this->codelen$i ) {
   $this->fontcolor = imagecolorallocate($this->img,mt_rand(0,156),mt_rand(0,156),mt_rand(0,156))
   imagettftext($this->img,$this->fontsize,mt_rand(-30,30),$_x*$i mt_rand(1,5),$this->height / 1.4,$this->fontcolor,$this->font,$this->code[$i])
  }
 }
 //生成线条、雪花
 private function createLine() {
  //线条
  for ($i=0$i<6$i ) {
   $color = imagecolorallocate($this->img,mt_rand(0,156),mt_rand(0,156),mt_rand(0,156))
   imageline($this->img,mt_rand(0,$this->width),mt_rand(0,$this->height),mt_rand(0,$this->width),mt_rand(0,$this->height),$color)
  }
  //雪花
  for ($i=0$i<100$i ) {
   $color = imagecolorallocate($this->img,mt_rand(200,255),mt_rand(200,255),mt_rand(200,255))
   imagestring($this->img,mt_rand(1,5),mt_rand(0,$this->width),mt_rand(0,$this->height),*,$color)
  }
 }
 //输出
 private function outPut() {
  header(Content-type:image/png)
  imagepng($this->img)
  imagedestroy($this->img)
 }
 //对外生成
 public function doimg() {
  $this->createBg()
  $this->createCode()
  $this->createLine()
  $this->createFont()
  $this->outPut()
 }
 //获取验证码
 public function getCode() {
  return strtolower($this->code)
 }
}

PHP CRYPT实现密码验证原理是什么?

例:
  
    $user_name=$_POST["user_name"]
  require_once("sys_conf.inc") //系统配置文件,包含数据库配置信息
  //连接数据库
  $link_id=mysql_connect($DBHOST,$DBUSER,$DBPWD)
  mysql_select_db($DBNAME) //选择数据库my_chat
  //查询是否存在登录用户信息
  $str="select name,password from user where name =$user_name"
  $result=mysql_query($str,$link_id) //执行查询
  @$rows=mysql_num_rows($result) //取得查询结果的记录笔数
  $user_name=$_SESSION["user_name"]
  $password=$_POST["password"]
  $salt = substr($password, 0, 2)
  $password_en=crypt($password,$salt) //使用crypt()对用户密码进行加密
  //对于老用户
  if($rows!=0)
  {
  list($name,$pwd)=mysql_fetch_row($result)
  //如果密码输入正确
  if($pwd==$password_en)
  {
  $str="update user set is_online =1 where name =$user_name and password=$password_en"
  $result=mysql_query($str, $link_id)//执行查询
  require("main.php") //转到聊天页面
  }
  //密码输入错误
  else
  {
  require("relogin.php")
  }
  }
  //对于新用户,将其信息写入数据库
  else
  {
  $str="insert into user (name,password,is_online) values($user_ name,$password_en,1)"
  $result=mysql_query($str, $link_id) //执行查询
  require("main.php") //转到聊天页面
  }
  //关闭数据库
  mysql_close($link_id)
  ?>
核心部分在于第16、17行使用crypt()函数获取加密后的密码,而通过在第25行比较数据库中的密码和加密后的密码是否相等来检查用户是否合法。
例如,用户名为rock,密码为123456,则加密后的密码为: 12tir.zIbWQ3c 
  上面就实现了一个简单的用户身份验证系统。在使用crypt()保护重要的机密信息时,需要注意的是,在缺省状态下使用crypt()并不是最安全的,只能用在对安全性要求较低的系统中。

更多问题到后盾网问题求助专区。

php如何使用随机函数rand()生成一个数字验证码?

参考这个
$code=""
//画布
$image=imagecreatetruecolor(80, 25)
imagefill($image, 0, 0, imagecolorallocate($image, 255, 255, 255))

for($i=0$i<4$i ){
$rand_color=imagecolorallocate($image, rand(0,155), rand(0,155), rand(0,155))
$code_tmp=dechex(rand(1,15))
$code.=$code_tmp
imagestring($image, rand(4,5), rand($i*20,$i*20 20-6), rand(0,13),$code_tmp , $rand_color)
//干扰线
imageline($image, rand($i*20,$i*20 20), rand(0,25), rand($i*20,$i*20 20), rand(0,25), $rand_color)
imageline($image, rand($i*20,$i*20 20), rand(0,25), rand($i*20,$i*20 20), rand(0,25), $rand_color)
}

//保存
session_start()
$_SESSION[yzm]=$code
session_write_close()

header("content-type:image/png")

imagepng($image)
imagedestroy($image)