php实现验证码,php验证码
验证码在表单实现越来越多了,但是用js的写的验证码,总觉得不方便,所以学习了下php实现的验证码。
好吧,其实是没有事情干,但是又不想浪费时间,所以学习了下php实现验证码。正所谓,技多不压身。而且,也可以封装成一个函数,以后使用的时候也是很方便的,当然现在未封装。
现在来说说简单的纯数字验证码吧。
如果是初学者,建议按照我代码的注释 //数字 一步步来。最简单的方法,还是把整个代码复制走了。
新建一个captcha.php:
<?<span>php </span><span>//</span><span>10>设置session,必须处于脚本最顶部</span> <span>session_start</span><span>(); </span><span>$image</span> = imagecreatetruecolor(100, 30); <span>//</span><span>1>设置验证码图片大小的函数 //5>设置验证码颜色 imagecolorallocate(int im, int red, int green, int blue);</span> <span>$bgcolor</span> = imagecolorallocate(<span>$image</span>,255,255,255); <span>//</span><span>#ffffff //6>区域填充 int imagefill(int im, int x, int y, int col) (x,y) 所在的区域着色,col 表示欲涂上的颜色</span> imagefill(<span>$image</span>, 0, 0, <span>$bgcolor</span><span>); </span><span>//</span><span>10>设置变量</span> <span>$captcha_code</span> = ""<span>; </span><span>//</span><span>7>生成随机数字</span> <span>for</span>(<span>$i</span>=0;<span>$i</span><4;<span>$i</span>++<span>){ </span><span>//</span><span>设置字体大小</span> <span>$fontsize</span> = 6<span>; </span><span>//</span><span>设置字体颜色,随机颜色</span> <span>$fontcolor</span> = imagecolorallocate(<span>$image</span>, <span>rand</span>(0,120),<span>rand</span>(0,120), <span>rand</span>(0,120)); <span>//</span><span>0-120深颜色 //设置数字</span> <span>$fontcontent</span> = <span>rand</span>(0,9<span>); </span><span>//</span><span>10>.=连续定义变量</span> <span>$captcha_code</span> .= <span>$fontcontent</span><span>; </span><span>//</span><span>设置坐标</span> <span>$x</span> = (<span>$i</span>*100/4)+<span>rand</span>(5,10<span>); </span><span>$y</span> = <span>rand</span>(5,10<span>); imagestring(</span><span>$image</span>,<span>$fontsize</span>,<span>$x</span>,<span>$y</span>,<span>$fontcontent</span>,<span>$fontcolor</span><span>); } </span><span>//</span><span>10>存到session</span> <span>$_SESSION</span>['authcode'] = <span>$captcha_code</span><span>; </span><span>//</span><span>8>增加干扰元素,设置雪花点</span> <span>for</span>(<span>$i</span>=0;<span>$i</span><200;<span>$i</span>++<span>){ </span><span>//</span><span>设置点的颜色,50-200颜色比数字浅,不干扰阅读</span> <span>$pointcolor</span> = imagecolorallocate(<span>$image</span>,<span>rand</span>(50,200), <span>rand</span>(50,200), <span>rand</span>(50,200<span>)); </span><span>//</span><span>imagesetpixel — 画一个单一像素</span> imagesetpixel(<span>$image</span>, <span>rand</span>(1,99), <span>rand</span>(1,29), <span>$pointcolor</span><span>); } </span><span>//</span><span>9>增加干扰元素,设置横线</span> <span>for</span>(<span>$i</span>=0;<span>$i</span><4;<span>$i</span>++<span>){ </span><span>//</span><span>设置线的颜色</span> <span>$linecolor</span> = imagecolorallocate(<span>$image</span>,<span>rand</span>(80,220), <span>rand</span>(80,220),<span>rand</span>(80,220<span>)); </span><span>//</span><span>设置线,两点一线</span> imageline(<span>$image</span>,<span>rand</span>(1,99), <span>rand</span>(1,29),<span>rand</span>(1,99), <span>rand</span>(1,29),<span>$linecolor</span><span>); } </span><span>//</span><span>2>设置头部,image/png</span> <span>header</span>('Content-Type: image/png'<span>); </span><span>//</span><span>3>imagepng() 建立png图形函数</span> imagepng(<span>$image</span><span>); </span><span>//</span><span>4>imagedestroy() 结束图形函数 销毁$image</span> imagedestroy(<span>$image</span>);
接着就是静态页的代码了:index.html
<span><!</span><span>doctype html</span><span>></span> <span><</span><span>html</span><span>></span> <span><</span><span>head</span><span>></span> <span><</span><span>meta </span><span>http-equiv</span><span>="Content-Type"</span><span> content</span><span>="text/html; charset=UTF-8"</span><span>></span> <span><</span><span>title</span><span>></span>确认验证码<span></</span><span>title</span><span>></span> <span></</span><span>head</span><span>></span> <span><</span><span>body</span><span>></span> <span><</span><span>form </span><span>method</span><span>="post"</span><span> action</span><span>="./form.php"</span><span>></span> <span><</span><span>p</span><span>></span>验证码: <span><</span><span>img </span><span>id</span><span>="captcha_img"</span><span> border</span><span>='1' </span><span>src</span><span>='./captcha.php?r=<?php </span><span>echo rand(); ?</span><span>></span><span>'><</span><span>a </span><span>href</span><span>="javascript:void(0)"</span><span> onclick</span><span>="document.getElementById('captcha_img').src='./captcha.php?r='+Math.random()"</span><span>></span>换一个?<span></</span><span>a</span><span>></span> <span></</span><span>p</span><span>></span> <span><</span><span>P</span><span>></span>请输入验证码:<span><</span><span>input </span><span>type</span><span>="text"</span><span> name</span><span>='authcode' </span><span>value</span><span>=''</span><span>/></</span><span>p</span><span>></span> <span><</span><span>p</span><span>><</span><span>input </span><span>type</span><span>='submit' </span><span>value</span><span>='提交' </span><span>style</span><span>='padding:6px </span><span>5px;'</span><span>/></</span><span>p</span><span>></span> <span></</span><span>body</span><span>></span> <span></</span><span>html</span><span>></span>
从index.html可以看到,提交的表单是到form.php的,所以还要有一个判断的form.php代码:
<?<span>php </span><span>header</span>("Content-Type:text/html;charset=utf-8"); <span>//</span><span>设置头部信息 //isset()检测变量是否设置</span> <span>if</span>(<span>isset</span>(<span>$_REQUEST</span>['authcode'<span>])){ </span><span>session_start</span><span>(); </span><span>//</span><span>strtolower()小写函数</span> <span>if</span>(<span>strtolower</span>(<span>$_REQUEST</span>['authcode'])== <span>$_SESSION</span>['authcode'<span>]){ </span><span>//</span><span>跳转页面</span> <span>echo</span> "<script language=\"javascript\">"<span>; </span><span>echo</span> "document.location=\"./form.php\""<span>; </span><span>echo</span> "</script>"<span>; }</span><span>else</span><span>{ </span><span>//</span><span>提示以及跳转页面</span> <span>echo</span> "<script language=\"javascript\">"<span>; </span><span>echo</span> "alert('输入错误!');"<span>; </span><span>echo</span> "document.location=\"./form.php\""<span>; </span><span>echo</span> "</script>"<span>; } </span><span>exit</span><span>(); }</span>
显示页面如下:
那么,纯数字的实现了,数字加英文的也应该不难了。要修改的代码 只是在 captcha.php 将 //7>生成随机数字 修改成 //7>生成随机的字母和数字,如果你真的很可爱的就修改这几个字就认为可以实现的话,那么祝贺你,你永远保持快乐。脑残儿童欢乐多。
废话不多说了,拉代码吧。
<?<span>php </span><span>//</span><span>10>设置session,必须处于脚本最顶部</span> <span>session_start</span><span>(); </span><span>$image</span> = imagecreatetruecolor(100, 30); <span>//</span><span>1>设置验证码图片大小的函数 //5>设置验证码颜色 imagecolorallocate(int im, int red, int green, int blue);</span> <span>$bgcolor</span> = imagecolorallocate(<span>$image</span>,255,255,255); <span>//</span><span>#ffffff //6>区域填充 int imagefill(int im, int x, int y, int col) (x,y) 所在的区域着色,col 表示欲涂上的颜色</span> imagefill(<span>$image</span>, 0, 0, <span>$bgcolor</span><span>); </span><span>//</span><span>10>设置变量</span> <span>$captcha_code</span> = ""<span>; </span><span>//</span><span>7>生成随机的字母和数字</span> <span>for</span>(<span>$i</span>=0;<span>$i</span><4;<span>$i</span>++<span>){ </span><span>//</span><span>设置字体大小</span> <span>$fontsize</span> = 8<span>; </span><span>//</span><span>设置字体颜色,随机颜色</span> <span>$fontcolor</span> = imagecolorallocate(<span>$image</span>, <span>rand</span>(0,120),<span>rand</span>(0,120), <span>rand</span>(0,120)); <span>//</span><span>0-120深颜色 //设置需要随机取的值,去掉容易出错的值如0和o</span> <span>$data</span> ='abcdefghigkmnpqrstuvwxy3456789'<span>; </span><span>//</span><span>取出值,字符串截取方法 strlen获取字符串长度</span> <span>$fontcontent</span> = <span>substr</span>(<span>$data</span>, <span>rand</span>(0,<span>strlen</span>(<span>$data</span>)),1<span>); </span><span>//</span><span>10>.=连续定义变量</span> <span>$captcha_code</span> .= <span>$fontcontent</span><span>; </span><span>//</span><span>设置坐标</span> <span>$x</span> = (<span>$i</span>*100/4)+<span>rand</span>(5,10<span>); </span><span>$y</span> = <span>rand</span>(5,10<span>); imagestring(</span><span>$image</span>,<span>$fontsize</span>,<span>$x</span>,<span>$y</span>,<span>$fontcontent</span>,<span>$fontcolor</span><span>); } </span><span>//</span><span>10>存到session</span> <span>$_SESSION</span>['authcode'] = <span>$captcha_code</span><span>; </span><span>//</span><span>8>增加干扰元素,设置雪花点</span> <span>for</span>(<span>$i</span>=0;<span>$i</span><200;<span>$i</span>++<span>){ </span><span>//</span><span>设置点的颜色,50-200颜色比数字浅,不干扰阅读</span> <span>$pointcolor</span> = imagecolorallocate(<span>$image</span>,<span>rand</span>(50,200), <span>rand</span>(50,200), <span>rand</span>(50,200<span>)); </span><span>//</span><span>imagesetpixel — 画一个单一像素</span> imagesetpixel(<span>$image</span>, <span>rand</span>(1,99), <span>rand</span>(1,29), <span>$pointcolor</span><span>); } </span><span>//</span><span>9>增加干扰元素,设置横线</span> <span>for</span>(<span>$i</span>=0;<span>$i</span><4;<span>$i</span>++<span>){ </span><span>//</span><span>设置线的颜色</span> <span>$linecolor</span> = imagecolorallocate(<span>$image</span>,<span>rand</span>(80,220), <span>rand</span>(80,220),<span>rand</span>(80,220<span>)); </span><span>//</span><span>设置线,两点一线</span> imageline(<span>$image</span>,<span>rand</span>(1,99), <span>rand</span>(1,29),<span>rand</span>(1,99), <span>rand</span>(1,29),<span>$linecolor</span><span>); } </span><span>//</span><span>2>设置头部,image/png</span> <span>header</span>('Content-Type: image/png'<span>); </span><span>//</span><span>3>imagepng() 建立png图形函数</span> imagepng(<span>$image</span><span>); </span><span>//</span><span>4>imagedestroy() 结束图形函数 销毁$image</span> imagedestroy(<span>$image</span>);
其他的两个页面,不许要修改。
一般而言,现在就已经够用了。但是就像动漫一样,总会有番外。
那么,我们来个汉字的番外吧。其实我也准备将汉字的验证码放到我的毕业设计里面,虽然现在很流行滑动验证码,但是本人毕竟不是专门学习js的。
而且,还可以和答辩的老师说,我们验证码不需要素材,连图片也是生成的,用自己的知识装13,也没有设么的。
<?<span>php </span><span>//</span><span>11>设置session,必须处于脚本最顶部</span> <span>session_start</span><span>(); </span><span>//</span><span>1>设置验证码图片大小的函数</span> <span>$image</span> = imagecreatetruecolor(200, 60<span>); </span><span>//</span><span>5>设置验证码颜色 imagecolorallocate(int im, int red, int green, int blue);</span> <span>$bgcolor</span> = imagecolorallocate(<span>$image</span>,255,255,255); <span>//</span><span>#ffffff //6>区域填充 int imagefill(int im, int x, int y, int col) (x,y) 所在的区域着色,col 表示欲涂上的颜色</span> imagefill(<span>$image</span>, 0, 0, <span>$bgcolor</span><span>); </span><span>//</span><span>7>设置ttf字体</span> <span>$fontface</span> = 'FZYTK.TTF'<span>; </span><span>//</span><span>7>设置字库,实现简单的数字储备</span> <span>$str</span>='天地不仁以万物为刍狗圣人不仁以百姓为刍狗这句经常出现在控诉暴君暴政上地残暴不仁把万物都当成低贱的猪狗来看待而那些高高在上的所谓圣人们也没两样还不是把我们老百姓也当成猪狗不如的东西但实在正取的解读是地不情感用事对万物一视同仁圣人不情感用事对百姓一视同仁执子之手与子偕老当男女主人公含情脉脉看着对方说了句执子之手与子偕老女方泪眼朦胧含羞地回一句讨厌啦这样的情节我们是不是见过很多但是我们来看看这句的原句死生契阔与子成说执子之手与子偕老于嗟阔兮不我活兮于嗟洵兮不我信兮意思是说战士之间的约定说要一起死现在和我约定的人都走了我怎么活啊赤裸裸的兄弟江湖战友友谊啊形容好基友的基情比男女之间的爱情要合适很多吧'<span>; </span><span>//</span><span>str_split()切割字符串为一个数组,一个中文在utf_8为3个字符</span> <span>$strdb</span> = <span>str_split</span>(<span>$str</span>,3<span>); </span><span>//</span><span>>11</span> <span>$captcha_code</span> = ''<span>; </span><span>//</span><span>8>生成随机的汉子</span> <span>for</span>(<span>$i</span>=0;<span>$i</span><4;<span>$i</span>++<span>){ </span><span>//</span><span>设置字体颜色,随机颜色</span> <span>$fontcolor</span> = imagecolorallocate(<span>$image</span>, <span>rand</span>(0,120),<span>rand</span>(0,120), <span>rand</span>(0,120)); <span>//</span><span>0-120深颜色 //随机选取中文</span> <span>$in</span> = <span>rand</span>(0,<span>count</span>(<span>$strdb</span><span>)); </span><span>$cn</span> = <span>$strdb</span>[<span>$in</span><span>]; </span><span>//</span><span>将中文记录到将保存到session的字符串中</span> <span>$captcha_code</span> .= <span>$cn</span><span>; </span><span>/*</span><span>imagettftext (resource $image ,float $size ,float $angle ,int $x ,int $y,int $color, string $fontfile ,string $text ) 幕布 ,尺寸,角度,坐标,颜色,字体路径,文本字符串 mt_rand()生成更好的随机数,比rand()快四倍</span><span>*/</span><span> imagettftext(</span><span>$image</span>, <span>mt_rand</span>(20,24),<span>mt_rand</span>(-60,60),(40*<span>$i</span>+20),<span>mt_rand</span>(30,35),<span>$fontcolor</span>,<span>$fontface</span>,<span>$cn</span><span>); } </span><span>//</span><span>11>存到session</span> <span>$_SESSION</span>['authcode'] = <span>$captcha_code</span><span>; </span><span>//</span><span>9>增加干扰元素,设置点</span> <span>for</span>(<span>$i</span>=0;<span>$i</span><200;<span>$i</span>++<span>){ </span><span>//</span><span>设置点的颜色,50-200颜色比数字浅,不干扰阅读</span> <span>$pointcolor</span> = imagecolorallocate(<span>$image</span>,<span>rand</span>(50,200), <span>rand</span>(50,200), <span>rand</span>(50,200<span>)); </span><span>//</span><span>imagesetpixel — 画一个单一像素</span> imagesetpixel(<span>$image</span>, <span>rand</span>(1,199), <span>rand</span>(1,59), <span>$pointcolor</span><span>); } </span><span>//</span><span>10>增加干扰元素,设置线</span> <span>for</span>(<span>$i</span>=0;<span>$i</span><4;<span>$i</span>++<span>){ </span><span>//</span><span>设置线的颜色</span> <span>$linecolor</span> = imagecolorallocate(<span>$image</span>,<span>rand</span>(80,220), <span>rand</span>(80,220),<span>rand</span>(80,220<span>)); </span><span>//</span><span>设置线,两点一线</span> imageline(<span>$image</span>,<span>rand</span>(1,199), <span>rand</span>(1,59),<span>rand</span>(1,199), <span>rand</span>(1,59),<span>$linecolor</span><span>); } </span><span>//</span><span>2>设置头部,image/png</span> <span>header</span>('Content-Type: image/png'<span>); </span><span>//</span><span>3>imagepng() 建立png图形函数</span> imagepng(<span>$image</span><span>); </span><span>//</span><span>4>imagedestroy() 结束图形函数 销毁$image</span> imagedestroy(<span>$image</span>);
其他的页面也是不需要修改的。
效果图如下:

php把负数转为正整数的方法:1、使用abs()函数将负数转为正数,使用intval()函数对正数取整,转为正整数,语法“intval(abs($number))”;2、利用“~”位运算符将负数取反加一,语法“~$number + 1”。

实现方法:1、使用“sleep(延迟秒数)”语句,可延迟执行函数若干秒;2、使用“time_nanosleep(延迟秒数,延迟纳秒数)”语句,可延迟执行函数若干秒和纳秒;3、使用“time_sleep_until(time()+7)”语句。

php除以100保留两位小数的方法:1、利用“/”运算符进行除法运算,语法“数值 / 100”;2、使用“number_format(除法结果, 2)”或“sprintf("%.2f",除法结果)”语句进行四舍五入的处理值,并保留两位小数。

判断方法:1、使用“strtotime("年-月-日")”语句将给定的年月日转换为时间戳格式;2、用“date("z",时间戳)+1”语句计算指定时间戳是一年的第几天。date()返回的天数是从0开始计算的,因此真实天数需要在此基础上加1。

方法:1、用“str_replace(" ","其他字符",$str)”语句,可将nbsp符替换为其他字符;2、用“preg_replace("/(\s|\ \;||\xc2\xa0)/","其他字符",$str)”语句。

php判断有没有小数点的方法:1、使用“strpos(数字字符串,'.')”语法,如果返回小数点在字符串中第一次出现的位置,则有小数点;2、使用“strrpos(数字字符串,'.')”语句,如果返回小数点在字符串中最后一次出现的位置,则有。

在PHP中,可以利用implode()函数的第一个参数来设置没有分隔符,该函数的第一个参数用于规定数组元素之间放置的内容,默认是空字符串,也可将第一个参数设置为空,语法为“implode(数组)”或者“implode("",数组)”。

php字符串有下标。在PHP中,下标不仅可以应用于数组和对象,还可应用于字符串,利用字符串的下标和中括号“[]”可以访问指定索引位置的字符,并对该字符进行读写,语法“字符串名[下标值]”;字符串的下标值(索引值)只能是整数类型,起始值为0。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

Atom編輯器mac版下載
最受歡迎的的開源編輯器

Dreamweaver Mac版
視覺化網頁開發工具

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。