热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

使用PHPRPC实现Ajax安全登录

PHPRPC是一个轻型的、安全的、跨网际的、跨语言的、跨平台的、跨环境的、跨域的、支持复杂对象传输的、支持引用参数传递的、支持内容输出重定向的、支持分级错误处理的、支持会话的、面向服务的高性能远程过程调用协议。
PHPRPC 是一个轻型的、安全的、跨网际的、跨语言的、跨平台的、跨环境的、跨域的、支持复杂对象传输的、支持引用参数传递的、支持内容输出重定向的、支持分级错误处理的、支持会话的、面向服务的高性能远程过程调用协议。

PHPRPC 与其它 ajax 框架不同,PHPRPC 遵循的是“只做一件事,并把它做好”的原则。它只负责数据传输,并且将传输做到最好!它将你以前用传统的 ajax 方式做不到或者很难做到的事情变得轻而易举!
相信好多人选择 PHPRPC 的一个主要原因就是它能够让你开发 ajax 应用变得更加容易!尽管 PHPRPC 的强大之处不仅限于此,但我不得不承认,这确实是 PHPRPC 的一大亮点!
所以,我们的第一站,就来看看如何用 PHPRPC 3.0 来编写 ajax 应用吧。

下 面我们举一个最简单的例子(甚至可以算是无聊的例子 :mrgreen: )来说明如何使用 PHPRPC 3.0 编写 ajax 应用。这个例子很好的说明了上面所提到的 MVC 模式如何具体的工作。这里我们先以 PHP 为服务器端的情况为例来说明。我们的第一个例子很简单,客户端输入一段字符串,然后服务器端计算出它的 SHA1 值。

require_once("../php/phprpc_server.php");
$server = new PHPRPC_Server();
$server->add("sha1");
$server->start();
?>

只有这么简单的 4 行代码,就把 PHP 内置的 sha1 函数发布了。现在,客户端可以直接使用这个函数了。















这个例子非常简单,并且跟 PHPRPC 有关的只有两条语句,一条是:

var rpc = new PHPRPC_Client('sha1.php', ['sha1']);


这条语句用来创建一个 PHPRPC_Client 对象,第一个参数是服务器地址,这里可以用相对路径,也可以用绝对路径。
而且这个路径可以跨域!因此你可以做跨域的应用!
第二个参数是你需要使用的服务器端的函数名列表,所以,虽然我们这里只有一个函数,也要写成数组的形式。这样我们就有了一个可以调用服务器端方法的客户端对象了。
那该如何调用呢?我们来看第二条关于 PHPRPC 的语句:

rpc.sha1(input, showResult);

这条语句相当简单,你会发现我们直接使用了服务器端发布的函数名作为 rpc 对象的一个方法来调用。它的第一个参数就是 sha1 函数的参数值。第二个参数是个函数,这个是回调函数,也就是说,当服务器端方法执行完之后就会自动调用这个函数来完成结果的处理。它是在前面定义的,你会 发现它有一个参数 result,这个参数就是我们的远程过程 sha1 的返回值,它是通过回调函数的这个参数传入的。
另外一篇文章,整理的代码比较详细
昨天我举了个用 PHPRPC 实现 Ajax 级联下拉菜单 的例子,那个例子中我们重点要演示的是用 PHPRPC 实现 Ajax 效果是多么的简单。今天我们这个例子主要演示用 PHPRPC 内置的安全加密机制来实现安全登录是多么简单。当然它同样可以用于密码设置、其它关键保密数据的传输等领域。

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

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 页面。








帐号:
密码:





这个页面很简单,只是设置好了表单输入框和按钮,所有的处理都是在 login.js 中完成的。不过需要注意的是这里的 phprpc_client.js 是 full 压缩版本,因为我们需要用到它的加密传输功能。我们来看看 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 页面,下面是这个页面的一个简单的例子:


session_start();
if ($_SESSION['user'] == 'root') {
echo "登录成功!";
}
else {
header("Location: index.html");
}
?>

这里需要自己 sestion_start() 一下了,之后就可以验证 $_SESSION['user'] 是否设置了。
通过 PHPRPC,你不再需要为 Ajax 程序中数据的安全性而头痛,也不必为回话支持而苦恼,这一切 PHPRPC 都已经帮你自动完成了,你只需要关注具体的事务就可以了。用 PHPRPC 来做 Ajax 安全编程,就是这么简单!

推荐阅读
  • 本文介绍了使用cacti监控mssql 2005运行资源情况的操作步骤,包括安装必要的工具和驱动,测试mssql的连接,配置监控脚本等。通过php连接mssql来获取SQL 2005性能计算器的值,实现对mssql的监控。详细的操作步骤和代码请参考附件。 ... [详细]
  • 项目需要将音视频文件上传服务器,考虑并发要求高,通过七牛来实现。直接上代码usingQiniu.IO;usingQiniu.IO.Resumable;usingQiniu.RPC; ... [详细]
  • ASP.NET MVC 小牛之旅3:Routing——网址路由
    网址路由(Routing)在ASP.NETMVC中有两个主要用途,一个用途是匹配通过浏览器传来的HTTP请求,另一个用途则是响应适当的网址给浏览器。3.1匹配通过浏览器传来的HTT ... [详细]
  • 前言对于从事技术的人员来说ajax是这好东西,都会使用,而且乐于使用。但对于新手,开发一个ajax实例,还有是难度的,必竟对于他们这是新东西。leo开发一个简单的ajax实例,用的是 ... [详细]
  • 表单提交前的最后验证:通常在表单提交前,我们必须确认用户是否都把必须填选的做了,如果没有,就不能被提交到服务器,这里我们用到表单的formname.submit()看演示,其实这个对于我们修炼道 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • MVC设计模式的介绍和演化过程
    本文介绍了MVC设计模式的基本概念和原理,以及在实际项目中的演化过程。通过分离视图、模型和控制器,实现了代码的解耦和重用,提高了项目的可维护性和可扩展性。详细讲解了分离视图、分离模型和分离控制器的具体步骤和规则,以及它们在项目中的应用。同时,还介绍了基础模型的封装和控制器的命名规则。该文章适合对MVC设计模式感兴趣的读者阅读和学习。 ... [详细]
  • MySQL中的MVVC多版本并发控制机制的应用及实现
    本文介绍了MySQL中MVCC的应用及实现机制。MVCC是一种提高并发性能的技术,通过对事务内读取的内存进行处理,避免写操作堵塞读操作的并发问题。与其他数据库系统的MVCC实现机制不尽相同,MySQL的MVCC是在undolog中实现的。通过undolog可以找回数据的历史版本,提供给用户读取或在回滚时覆盖数据页上的数据。MySQL的大多数事务型存储引擎都实现了MVCC,但各自的实现机制有所不同。 ... [详细]
  • SpringMVC工作流程概述
    SpringMVC工作流程概述 ... [详细]
  • MVC中的自定义控件
    怎么样创建自定义控 ... [详细]
  • MVC就是model模型control控制view视图把web开发的分工明确各施其职,互不干涉在MVC模式中,三个层各施其职,所以如果一旦哪一层的需求发生了变化,就只需要更改相 ... [详细]
  • SOA架构理解理解SOA架构,了解ESB概念,明白SOA与微服务的区别和联系,了解SOA与热门技术的结合与应用。1、面向服务的架构SOASOA(ServiceOrien ... [详细]
  • 本文为转载,原连接:https:www.zhihu.comquestion40822826简单说一下吧做要解释这些要从netconf说起。netconf ... [详细]
  • springboot dubbo框架中log4j与slf4jlog4j12日志冲突问题的解决方法
    在基于springboot开发项目中,使用dubbo的RPC框架进行业务拆分,出 ... [详细]
author-avatar
君琪2010_207
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有