https://www.jmqz1000.com

PHP实例实现验证码功能

  • 大家都知道,验证码在网站注册,登录以及很多的时候都是必备的功能。没有了验证码,网站的安全性在很大程度上就受到了威胁。所以说,验证码是网站开发过程中不可或缺的一个功能,验证码的效果直接影响到网站的安全性。(这里博主也顺便吐槽一下,验证码这功能着实蛋疼,动不动就要输个验证码,看着真心烦。前段时间12306还出了个动态验证码,尼玛我想说全宿舍没有人能输入正确。只希望赶快出个替代性的功能,结束这个操蛋功能,我想没几个用户喜欢整天对着验证码吧)。好了,废话不说了。

    先用思维导图理清整体思路:

    在auth.php中使用GD库进行画图,布置验证码背景,将随机生成的字符串添加到背景中,同时将字符串存到session中,保证在任何页面中都可以抠出这验证码。在form.html中写个简单的登录表格,重点是有验证码环节,用<img>标签加载auth.php中的验证码。然后将数据提交到submit.php页面。在submit.php中,首先进行验证码验证(这里不讨论username和password),看session中存的字符串和form.html提交上来的验证码的字符串是否相同,在这里之前为了不区分大小写,一律将字符串转为小写。若字符串相同,则进行页面跳转。若不同则返回登录页面。

    1.auth.php

    <?php
    header("content-type:text/html;charset=utf-8");
    
    //开启session
    session_start();
    
    //准备画布
    $im=imagecreatetruecolor(50,25);
    
    //准备涂料
    $black=imagecolorallocate($im,0,0,0);
    $gray=imagecolorallocate($im,200,200,200);
    
    //背景填充
    imagefill($im,0,0,$gray);
    
    //文字居中
    $x=(50-10*4)/2;
    $y=(25-5)/2+5;
    
    //准备文字
    $arr=array_merge(range(0,9),range('a','z'),range('A','Z'));
    shuffle($arr);
    $str=implode(array_slice($arr,0,4));
    
    //把$str放入session中,方便所有页面中调用
    $_SESSION['vstr']=$str;
    
    $file="fonts/simsun.ttc";
    imagettftext($im,10,0,$x,$y,$black,$file,$str);
    
    
    //输出到浏览器上或保存起来
    header("content-type:image/png");
    imagepng($im);
    
    //关闭画布
    imagedestory($im);
    ?>
    

    (1)header头部前面不能够有任何的输出

    (2)在使用session之前必须开启session

    2.form.html

    <html>
     <head>
    	<meta charset="utf-8">
    	<title>登录</title>
    	<style>
    		table{
    			
    			border-collapse:collapse;
    		}
    		img{
    			margin-top:5px;
    		}
    	</style>
     </head>
    
     <body>
    	<h4>用户登录页面</h4>
    	<hr>
    	<table width="500px" border="1px">
    		<form action="submit.php" method="post">
    			<tr>
    			<td>姓    名:</td>
    			<td><input type="text" name="username" id=""></td>
    			</tr>
    			<tr>
    			<td>密    码:</td>
    			<td><input type="password" name="password" id=""></td>
    			</tr>
    			<tr>
    			<td>验证码:</td>
    			<td><input type="text" name="vcode"> 
    			<img src="auth.php"></td>
    			</tr>
    			<tr>
    			<td><input type="submit" value="提交"></td>
    			<td><input type="reset" value="重置"></td>
    			</tr>
    		</form>
    	</table>
     </body>
    </html>
    
    (1)method的提交方式为post

    (2)尽量保证文本框和验证码的协调

    3.submit.php

    <?php
    header("content-type:text/html;charset=utf-8");
    session_start();
    $code=strtolower($_POST['vcode']);
    $str=strtolower($_SESSION['vstr']);
    	
    if($code==$str){
    	//页面跳转
    	echo "<script>location='http://www.baidu.com'</script>";
    }else{
    	echo "<script>alert('验证码输入错误');</script>";
    	echo "<a href='form.html'>返回登录页面</a>";
    		
    }
    ?>
    (1)使用strtolower()将字符串全部转为小写,就免去了验证码区分大小写的麻烦过程。

    (2)使用if语句进行判断两个字符串相等是否为true。

    (3)里面加了一点js的东西,在<script>location=''</script>的引号中添加需要跳转的地址,就能直接跳转。当然用header()也行,但是header()前面不能有输出,局限性太大。最好还是用js。



    PHP编程

    郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

  • 相关文章阅读