注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

phperwuhan的博客

记载一个phper的历程!phperwuhan.blog.163.com

 
 
 

日志

 
 

用 PHPRPC 实现 Ajax 安全登录  

2010-03-29 16:26:47|  分类: php |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

来源:http://www.ugia.cn/?p=101

昨天我举了个用 PHPRPC 实现 Ajax 级联下拉菜单 的例子,那个例子中我们重点要演示的是用 PHPRPC 实现 Ajax 效果是多么的简单。今天我们这个例子主要演示用 PHPRPC 内置的安全加密机制来实现安全登录是多么简单。当然它同样可以用于密码设置、其它关键保密数据的传输等领域。

这个例子比昨天的例子还要简单,先来看服务器端:

下载: rpc.php

<?php

function login($username, $password) {

    if (($username == "root") && ($password == "admin")) {

        $_SESSION['user'] = "root";

        return true;

    }

    $_SESSION['user'] = null;

    return false;

}

 

require_once("phprpc_server.php");

new phprpc_server(array('login'));

?>

这段代码太简单了,我不需要多说什么大家也能够看明白。不过大家会发现,在 login 函数中我用了 $_SESSION 变量,但是并没有在什么位置上写 session_start(),原因在于建立加密连接时,已经自动调用了 session_start(),因此不需要再单独写 session_start() 了。为了验证它是否生效,我们在后面的另一个页面中(admin.php),将判断这里设置的 $_SESSION 变量,并根据它来报告登录成功或者没成功跳回到登录页面。

那再来看看客户端,客户端我们将 JavaScript 跟 HTML 分离了,先来看看 html 页面。

下载: index.html

<html>

<head>

<script type="text/javascript" src="phprpc_client.js"></script>

<script type="text/javascript" src="login.js"></script>

</head>

<body>

<div align="center">

帐号:<input type="text" id="username" />

密码:<input type="password" id="password" />

<input type="button" value="登录" id="loginbtn" />

</div>

</body>

</html>

这个页面很简单,只是设置好了表单输入框和按钮,所有的处理都是在 login.js 中完成的。不过需要注意的是这里的 phprpc_client.js 是 full 压缩版本,因为我们需要用到它的加密传输功能。我们来看看 login.js 是怎么写的。

下载: login.js

// 创建 phprpc 客户端对象 rpc

phprpc_client.create('rpc');

 

// 初始化带有加密连接的 rpc 服务,第二个参数表示是否创建加密连接

rpc.use_service('rpc.php', true);

 

// 登录函数

function login() {

    // 如果加密连接已经初始化完毕,则验证用户名密码

    if (rpc.ready) {

        // 获取用户输入的用户名和密码

        var username = document.getElementById('username').value;

        var password = document.getElementById('password').value;

        // 设置远程过程调用为单向加密,

        // 即传递的参数是加密的,但返回结果不加密

        rpc.encrypt = 1;

        // 调用远程过程验证用户名密码是否正确,并设置回调函数。

        rpc.login(username, password, function (result) {

            // 如果返回结果正确,则转到登录后的页面

            if (result === true) {

                window.location.replace('admin.php');

            }

            // 否则提示用户名密码不正确

            else {

                alert('用户名密码不正确!');

            }

        });

    }

    // 如果连接尚未初始化完毕,则等待 100 毫秒后重试。

    else {

        window.setTimeout('login();', 100);

    }

}

 

window.onload = function () {

    document.getElementById('loginbtn').onclick = login;

}

大家会发现除了在调用 use_service 时,设置了第二个参数为 true 外,还在调用服务器端的 login 函数前,设置了 rpc.encrypt 的值为 1,这里 1 表示单向加密传输,单向加密传输是指调用的参数会以加密的方式传给服务器,但是返回的结果不加密(如果参数是引用参数的话,参数返回时也是加密的)。如果 rpc.encrypt 的值为 0,则表示不加密;如果是 2,则表示双向加密。

这里因为只有用户名和密码是敏感数据,需要保证它在传递给服务器时不被截获(即使截获也是加密的内容,无法破解),但返回的结果成功还是不成功并不是什么需要保密的数据,所以可以不加密。因此这里选择了单向加密传输。

大家也不必担心密钥是否会被截获,因为密钥是通过密钥交换算法,在服务器端和客户端(浏览器端)随机同步生成的,但没有经过网络传输,在网络上传输的是生成同步密钥的相关信息,但是只获取到这些信息是不足以算出密钥的,因此可以保证密钥的安全性。而加密算法本身也是一个强加密算法,密钥长度是 128 位,在没有密钥的情况下采用穷举法也是无法破解的。

大家会发现登录成功后,我们转向了 admin.php 页面,下面是这个页面的一个简单的例子:

下载: admin.php

<?php

    session_start();

    if ($_SESSION['user'] == 'root') {

        echo "登录成功!";

    }

    else {

        header("Location: index.html");

    }

?>

这里需要自己 sestion_start() 一下了,之后就可以验证 $_SESSION['user'] 是否设置了。

通过 PHPRPC,你不再需要为 Ajax 程序中数据的安全性而头痛,也不必为回话支持而苦恼,这一切 PHPRPC 都已经帮你自动完成了,你只需要关注具体的事务就可以了。用 PHPRPC 来做 Ajax 安全编程,就是这么简单!

首发于:CoolCode.CN

Permalink

3 Comments »

  1. crazysoul said,

    June 8, 2006 @ 1:43 am

    加密算法是不是类似RSA的对称加密(公私密钥)的算法,需要叫唤公钥来加密,用私钥解密?

    btw,评论提交时建议改造成AJAX方式,刚才忘了填EMAIL提交出错后退什么都没了.

  2. andot said,

    June 8, 2006 @ 4:20 am

    RSA 是非对称加密算法(所以才有公钥和私钥之分),因为这种加密算法非常耗时,不适合用 JS 来实现。(网上有这样的程序,但是实际效果很差,无法满足实际应用的需求)。

    所以这里的加密算法是类似于 DES、AES 之类的对称加密算法,但 DES、AES 这些加密算法也很慢。这里采用的是 XXTEA 加密算法,该算法非常快速,实现也很容易,安全性还非常高。而对称加密算法需要客户端和服务器端使用相同的密钥,但是要保证密钥不被泄漏的话,密钥本身就不能在网络上传输,因此密钥是采用密钥交换算法生成的,该算法可以保证客户端和服务器端能够生成相同的密钥,而不会在网络上传输。RSA 算法也可以进行密钥交换,但是这里用的不是它(它太慢了),这里使用的是 DH 密钥交换算法。

  评论这张
 
阅读(375)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017