- <?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 src1="http://pajhome.org.uk/crypt/md5/2.2/md5-min.js" type="text/javascript"></script>
- <script src1="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>
- //该片段来自于http://www.codesnippet.cn/detail/250220148795.html
来源: http://www.codesnippet.cn/detail/250220148795.html