>백엔드 개발 >PHP 튜토리얼 >24교 달빛밤 24

24교 달빛밤 24

WBOY
WBOY원래의
2016-07-29 09:16:09940검색

폼으로 구현되는 인증코드가 점점 많아지는데, js로 작성한 인증코드는 늘 불편한 느낌이 들어서 php로 구현하는 인증코드를 배웠습니다.

뭐 사실 할 일도 없었지만 시간낭비하기 싫어서 PHP로 인증코드를 구현하는 방법을 배웠습니다. 속담처럼, 기술이 너무 많다고 해서 부담이 되는 것은 아닙니다. 게다가 함수로 캡슐화할 수도 있는데, 이는 향후 사용에 매우 편리합니다. 물론 지금은 캡슐화되지 않습니다.

이제 간단한 순수 숫자 인증 코드에 대해 이야기해 보겠습니다.

초보자라면 제 코드 //number의 설명을 차근차근 따라해 보시는 걸 추천드립니다. 가장 쉬운 방법은 전체 코드를 복사하는 것입니다.

새 captcha.php를 만듭니다.

<?<span>php
    </span><span>//</span><span>10>设置session,必须处于脚本最顶部<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>$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 &mdash; 画一个单一像素</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>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>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><</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>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>$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 &mdash; 画一个单一像素</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>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>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>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>$_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 &mdash; 画一个单一像素</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>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>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>);
다른 페이지는 수정할 필요가 없습니다.

렌더링은 다음과 같습니다.

이상으로 달밤 24교 24를 관련 내용과 함께 소개하였습니다. PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되었으면 좋겠습니다.

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.