PHP+Ajax验证码验证用户登录


Posted in PHP onJuly 20, 2016

用AJAX 验证用户登录的一个好处是不刷新跳转页面,外加用到验证码就更安全了,摸索的写了下。一共用到三个文件:

yz.php:  生成验证码的PHP 文件,将验证码将在SESSION 里,供登录时对比调用
index.php: 用户登录的HTML 文件
loginCheck.php: 验证用户登录的文件

下面一一解析:
yz.php 文件

<?php
 session_start();

 //生成验证码图
 Header("Content-type: image/PNG");
 //长与宽
 $im = imagecreate(44,18);
 // 设置背景色:
 $back = ImageColorAllocate($im, 245,245,245);
 // 填充背景色:
 imagefill($im,0,0,$back);

 srand((double)microtime()*1000000);
 $vcodes;
 //生成4位数字
 for($i=0;$i<4;$i++){
  $font = ImageColorAllocate($im, rand(100,255),rand(0,100),rand(100,255));
  $authnum=rand(1,9);
  $vcodes.=$authnum;
  imagestring($im, 5, 2+$i*10, 1, $authnum, $font);
 }

 //加入干扰象素
 for($i=0;$i<100;$i++){
  $randcolor = ImageColorallocate($im,rand(0,255),rand(0,255),rand(0,255));
  imagesetpixel($im, rand()%70 , rand()%30 , $randcolor);
 }
  
 ImagePNG($im);
 ImageDestroy($im);

 // 将四位的验证码保存在 SESSION 里,登录时调用对比
 $_SESSION["VCODE"]=$vcodes;
?>

index.php: 注意,在这文件里不要取 $_SESSION["VCODE"], 否则会取晚一步的,刷新后才能显示上一个验证码

在 loginCheck.php 里验证就好了

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head>
<meta http-equiv="Content-Type" content="text/html;charset=gb2312">
<title>管理后台| 请登录</title>
<link rel="stylesheet" type="text/css" href="\css\a.css">
<style type="text/css">
<!--
  #main{
   font-family:宋体;
   font-size:10pt;
   text-align:center;
   margin-top:510px;
  }
  
  body{
   background-attachment:fixed;
   background-position:center;
   background-image:url(./images/w2.jpg);
   background-repeat: no-repeat;
  }
  
  #authCode{background-Color:#F8F9FF;}
  
  table{text-align:center;}

//-->
</style>
<script type="text/javascript" src="./js/trim.js"></script>
<script type="text/javascript">
<!--

 function clearX(){
  document.getElementById('authCode').value="";
 }

 // 点击图片重新获得新的验证码:
 function getVCode() { 
  var vcode=document.getElementById('vcode'); 
  vcode.src ='yz.php?nocache='+new Date().getTime(); 
 }


 //定义XMLHttpRequest对象
 var xmlHttp;     

 // 创建 XMLHttpRequest:
 function createXmlHttpRequest(){
 var xmlHttp=null;
 try{
  // Firefox, Opera 8.0+, Safari
  xmlHttp=new XMLHttpRequest();
 }catch(e){
  // Internet Explorer
  try{
  xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
  }catch(e){
  xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
  }
 }
 return xmlHttp;
 }

 // AJAX 检查登录: 有密码,要用POST 提交
 function login(){
  var authCode=trim(document.getElementById('authCode').value);
  var username=trim(document.getElementById('username').value);
  var password=trim(document.getElementById('password').value);
  if(username=="" || password=="" || authCode==""){
   alert("请输入用户名和密码和验证码!");
   return false;
  }else{
   if(!xmlHttp) xmlHttp=createXmlHttpRequest();
    var send_string="username="+username+"&password="+password+"&authCode="+authCode+"&fresh="+Math.random();
    xmlHttp.open("POST","loginCheck.php",true); 
    xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded"); 
    xmlHttp.send(send_string); 
    xmlHttp.onreadystatechange=function(){
     if(xmlHttp.readystate==4 && xmlHttp.status==200){
      var answer=xmlHttp.responseText;
      if(answer=="ok")                     //跳转到管理中心页面
       window.location.href="adminCenter.php";
      else{
       alert("用户名密码或验证码不正确! 请重新输入!");
       document.getElementById('username').focus();
      }
    }
   }
  }
 }

//-->
</script>
</head>
<body onload="document.getElementById('username').focus();">
 <div id="main">
   <table>
     <tr>
     <td>用户名:<input type="text" id="username" /></td>
     <td>密   码:<input type="password" id="password" /></td>
     <td>验证码:<input type="text" id="authCode" size="6" maxlength="4" value="验证码" onfocus="clearX()"/></td>
     <td><img id="vcode" src="yz.php" alt="看不清?点击换一张" onclick="getVCode()" /></td>
     <td><input id="loginButton" type="submit" value="登 录" onclick="login()"/></td>
     </tr>
    </table>
 </div>
</body>
</html>

loginCheck.php  验证用户登录的文件

<?php 
 session_start();
 include("../conn/connDB.php");
 
 // 取得POST过来的参数:
 $username=$_POST["username"];
 $password=md5($_POST["password"]);
 $authCode=$_POST["authCode"];       
 
 $feedback="no";

//对比是否==SESSION中的验证码,不能放在客户端做,否则取不正确的值
 if($authCode==$_SESSION["VCODE"]){

   $SQL="select * from users where username='$username' and password='$password'";
   $result=mysql_query($SQL);
   $rows=mysql_num_rows($result);
  if($rows==1)                       // 验证成功
   $feedback="ok";
   $_SESSION["admin"]=true;           //为了后台安全,存入SESSION,表明 ADMIN 已登录,供后面调用
  }
  
 echo $feedback;
 
?>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
php截取utf-8中文字符串乱码的解决方法
Mar 29 PHP
yii框架通过控制台命令创建定时任务示例
Apr 30 PHP
深入探究PHP的多进程编程方法
Aug 18 PHP
yii用户注册表单验证实例
Dec 26 PHP
WordPress中用于获取搜索表单的PHP函数使用解析
Jan 05 PHP
YII动态模型(动态表名)支持分析
Mar 29 PHP
PHP导出带样式的Excel示例代码
Aug 28 PHP
php封装的验证码工具类完整实例
Oct 19 PHP
解决form中action属性后面?传递参数 获取不到的问题
Jul 21 PHP
ThinkPHP5 的简单搭建和使用详解
Nov 15 PHP
PHP里的$_GET数组介绍
Mar 22 PHP
laravel 之 Eloquent 模型修改器和序列化示例
Oct 17 PHP
PHP+Ajax实现验证码的实时验证
Jul 20 #PHP
php+ajax注册实时验证功能
Jul 20 #PHP
PHP实现的随机IP函数【国内IP段】
Jul 20 #PHP
Zend Framework教程之Zend_Helpers动作助手ViewRenderer用法详解
Jul 20 #PHP
php+flash+jQuery多图片上传源码分享
Jul 27 #PHP
php安装ssh2扩展的方法【Linux平台】
Jul 20 #PHP
值得分享的php+ajax实时聊天室
Jul 20 #PHP
You might like
php 操作数组(合并,拆分,追加,查找,删除等)
2012/07/20 PHP
Laravel框架学习笔记(一)环境搭建
2014/10/15 PHP
php+js实现百度地图多点标注的方法
2016/11/30 PHP
Yii2 queue的队列使用详解
2019/07/19 PHP
jQuery+PHP实现图片上传并提交功能
2020/07/27 PHP
JavaScript实现Sleep函数的代码
2007/03/04 Javascript
javascript 设计模式之单体模式 面向对象学习基础
2010/04/18 Javascript
实现51Map地图接口(示例代码)
2013/11/22 Javascript
为Javascript中的String对象添加去除左右空格的方法(示例代码)
2013/11/30 Javascript
js导航栏单击事件背景变换示例代码
2014/01/13 Javascript
JS实现网页滚动条感应鼠标变色的方法
2015/02/26 Javascript
Bootstrap3下拉菜单的实现
2017/02/22 Javascript
jQuery中animate()的使用方法及解决$(”body“).animate({“scrollTop”:top})不被Firefox支持的问题
2017/04/04 jQuery
angularjs实现首页轮播图效果
2017/04/14 Javascript
vue 使用鼠标滚动加载数据的例子
2019/10/31 Javascript
微信小程序实现选择地址省市区三级联动
2020/06/21 Javascript
Java Web开发过程中登陆模块的验证码的实现方式总结
2016/05/25 Python
Python数据结构与算法之使用队列解决小猫钓鱼问题
2017/12/14 Python
简单实现python画圆功能
2018/01/25 Python
python2.6.6如何升级到python2.7.14
2018/04/08 Python
DataFrame中的object转换成float的方法
2018/04/10 Python
浅谈python中对于json写入txt文件的编码问题
2018/06/07 Python
使用Python读取二进制文件的实例讲解
2018/07/09 Python
Python re 模块findall() 函数返回值展现方式解析
2019/08/09 Python
python双向链表原理与实现方法详解
2019/12/03 Python
python闭包与引用以及需要注意的陷阱
2020/09/18 Python
美国隐形眼镜网上商店:Lens.com
2019/09/03 全球购物
马来西亚在线健康商店:Medipal Malaysia
2020/04/13 全球购物
大专毕业生自我评价分享
2013/11/10 职场文书
医院护士专业个人的求职信
2013/12/09 职场文书
幼儿园父亲节活动方案
2014/03/11 职场文书
工作目标责任书
2014/07/23 职场文书
总经理助理岗位职责范本
2015/03/31 职场文书
2016年暑假家长对孩子评语
2015/12/01 职场文书
配置nginx 重定向到系统维护页面
2021/06/08 Servers
动画《朋友游戏》公开佐藤友生绘制的开播纪念绘
2022/04/06 日漫