龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > web编程 > php编程 >

登录验证新思路,演示登录代码.

时间:2014-07-22 14:48来源: 作者: 点击:
分享到:
需要用到 jquery 以及 md5 相关javascrip方法. 代码中直接引用了外部链接. 如果运行出现状况, 请单独下载,修改代码.演示数据只有一个用户 id:test. passwd:abc123. 用文本存放数据. 简单演示. 喜欢
需要用到 jquery 以及 md5 相关javascrip方法. 代码中直接引用了外部链接. 如果运行出现状况, 请单独下载,修改代码.

演示数据只有一个用户 id:test. passwd:abc123. 用文本存放数据. 简单演示. 喜欢记得收藏, 转载请注明出处.
<?php
/* 演示 登录 
 $ua 表示存在的用户数据信息,
 md5 是一个javascript 函数. 需要用户自己导入库.
 引入 jquery . 方便 Ajax 调用.
*/

define('H_MAX', (256*8)-1); /*本可以设置更大, 只可惜IE的弹出框...*/

@ $a = isset($_GET['a']);
@ $id = $_POST['id'];
@ $passwd = $_POST['passwd'];

if($a) {
	$mstr = get_mstr(); /* 随机串 */
	$hstr = get_hstr(); /* 混杂串 */
	// $hstr = 256*2-1;
	$ua = get_u_i(); /* 获取用户数据. */
	$str = md5($ua['passwd'].dechex($mstr+$hstr).dechex($hstr));
	$ua['str'] = dechex($hstr);
	set_u_i($ua); /* 将信息保存,为实际登录做准备.演示用. */
	echo json_encode(array('mstr'=>$mstr, 'str'=>$str));
	exit;
}

/* 真正的登录验证开始了,之前的都是准备工作 */
if(isset($_POST['id'])) {
	/* 跳过其他验证,只针对密码验证 */
	$st = false;
	$ua = get_u_i();
	if($id && ($ua['id'] == $id) && (md5($ua['passwd'].$ua['str']) == $passwd)) {
		$st=true;
	}
	if($st) { /* 验证通过了, 随便搞吧 */
	$ua['str'] = dechex(get_hstr());
	set_u_i($ua); /* 将信息保存,为实际登录做准备.演示用. */
echo <<<EOT
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>test login</title>
</head>
<body>
	胜利大联欢.
</body>
</html>
EOT;
	}
	else {
		/* 失败了, 干脆啥事不干得了. */
	}
	exit;
}

$ua = array('id'=>'test', 'passwd'=>md5('abc123'), 'str'=>'');
set_u_i($ua); /* 先写入点数据 演示用,无实际意义, 实际应用这步骤不需要 */

function get_mstr() {
	$t = explode(' ', microtime());
	$time = $t[0] * 1000;
	$time = intval($time);
	//$time = dechex($time);
	return $time;
}

function get_hstr() {
	$h_max = H_MAX;
	return mt_rand(0, $h_max);
}

/* 获取用户信息 演示用,无实际意义*/
function get_u_i() {
	$file = 'test_login.txt';
	$str = file_get_contents($file);
	$str = trim($str);
	@list($id, $passwd, $str)  = explode("\t", $str);
	return array('id'=>$id, 'passwd'=>$passwd, 'str'=>$str);
}
/* 更新用户信息,为用户登录做准备. 演示用, 无实际意义 */
function set_u_i($ua) {
	$file = 'test_login.txt';
	file_put_contents($file,implode("\t", $ua));
}

?>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>test login</title>
<script src="http://pajhome.org.uk/crypt/md5/2.2/md5-min.js" type="text/javascript"></script>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js" type="text/javascript"></script>
<script type="text/javascript">
$(function(){
	var h_max = <?=H_MAX;?>;
	var last_id='';
	var mstr='';
	var str='';
	var $id = $('#id');
	var $passwd = $('#passwd');
	var $form = $("form:first");

	$id.focus(); /* 自动聚焦 */
	/* 焦点转移后 */
	$id.blur(function(a,b){
		if(last_id == $id.val()) return ;
		last_id = $id.val();
		var o = s1();
		if(o) {
			mstr = o.mstr;
			str = o.str;
		}
	});
	$form.submit(function() {
		$('#submit').prop('disabled',true);
		var p = md5($passwd.val());
		var st=0; /* 匹配状态 */
		for(var i=0;i<=h_max;i++){
			var t=''+(p)+(parseInt(mstr)+parseInt(i)).toString(16)+i.toString(16);
			if(str==md5(t)) {
				st=1; /* 找到匹配,更新状态 */
				$passwd.val(md5(p+i.toString(16)));
				break;
			};
		}
		if(!st) {
			/* 执行到这里 基本上可以确定密码错误. 可以直接给出提示, 也可以不理会
			{
			alert('登录失败');
			return false;
			}
			这里阻止了提交,实际中可以根据需求决定 */
		}
		//$('#submit').attr('disabled','disabled');
		return true;
	});

function md5(s) {
	return hex_md5(s);
}

function s1(){
	var a;
	var e;
	$.ajax({
		url: "?a",
		type: "POST",
		timeout:10000,
		data: {},
		dataType: "json",
		async: false,
		error: function(XMLHttpRequest, textStatus, errorThrown){
			e=true;
			//alert(textStatus+"&"+errorThrown);
		},
		success: function(data, textStatus){
			a = data;
		}
	});
	if(e) return false;
	return a;
}
});
</script>
</head>
<body>
<form action="" method="post" enctype="application/x-www-form-urlencoded" name="form1" target="_self" id="from1">
  <label>用户名:
  <input name="id" type="text" id="id">
  </label>
  <label>密码:
  <input name="passwd" type="password" id="passwd">
  </label>
  <label>
  <input name="submit" type="submit" id="submit" value="登录">
  </label>
</form>
</body>
</html>
精彩图集

赞助商链接