使用PHPRPC實(shí)現(xiàn)Ajax安全登錄
更新時(shí)間:2011年10月31日 23:00:10 作者:
PHPRPC 是一個(gè)輕型的、安全的、跨網(wǎng)際的、跨語言的、跨平臺(tái)的、跨環(huán)境的、跨域的、支持復(fù)雜對(duì)象傳輸?shù)?、支持引用參?shù)傳遞的、支持內(nèi)容輸出重定向的、支持分級(jí)錯(cuò)誤處理的、支持會(huì)話的、面向服務(wù)的高性能遠(yuǎn)程過程調(diào)用協(xié)議。
另外一篇文章,整理的代碼比較詳細(xì)
昨天我舉了個(gè)用 PHPRPC 實(shí)現(xiàn) Ajax 級(jí)聯(lián)下拉菜單 的例子,那個(gè)例子中我們重點(diǎn)要演示的是用 PHPRPC 實(shí)現(xiàn) Ajax 效果是多么的簡單。今天我們這個(gè)例子主要演示用 PHPRPC 內(nèi)置的安全加密機(jī)制來實(shí)現(xiàn)安全登錄是多么簡單。當(dāng)然它同樣可以用于密碼設(shè)置、其它關(guān)鍵保密數(shù)據(jù)的傳輸?shù)阮I(lǐng)域。
這個(gè)例子比昨天的例子還要簡單,先來看服務(wù)器端:
復(fù)制代碼 代碼如下:
<?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'));
?>
這段代碼太簡單了,我不需要多說什么大家也能夠看明白。不過大家會(huì)發(fā)現(xiàn),在 login 函數(shù)中我用了 $_SESSION 變量,但是并沒有在什么位置上寫 session_start(),原因在于建立加密連接時(shí),已經(jīng)自動(dòng)調(diào)用了 session_start(),因此不需要再單獨(dú)寫 session_start() 了。為了驗(yàn)證它是否生效,我們?cè)诤竺娴牧硪粋€(gè)頁面中(admin.php),將判斷這里設(shè)置的 $_SESSION 變量,并根據(jù)它來報(bào)告登錄成功或者沒成功跳回到登錄頁面。
那再來看看客戶端,客戶端我們將 JavaScript 跟 HTML 分離了,先來看看 html 頁面。
復(fù)制代碼 代碼如下:
<html>
<head>
<script type="text/javascript" src="phprpc_client.js"></script>
<script type="text/javascript" src="login.js"></script>
</head>
<body>
<div align="center">
帳號(hào):<input type="text" id="username" />
密碼:<input type="password" id="password" />
<input type="button" value="登錄" id="loginbtn" />
</div>
</body>
</html>
這個(gè)頁面很簡單,只是設(shè)置好了表單輸入框和按鈕,所有的處理都是在 login.js 中完成的。不過需要注意的是這里的 phprpc_client.js 是 full 壓縮版本,因?yàn)槲覀冃枰玫剿募用軅鬏敼δ堋N覀儊砜纯?login.js 是怎么寫的。
復(fù)制代碼 代碼如下:
// 創(chuàng)建 phprpc 客戶端對(duì)象 rpc
phprpc_client.create('rpc');
// 初始化帶有加密連接的 rpc 服務(wù),第二個(gè)參數(shù)表示是否創(chuàng)建加密連接
rpc.use_service('rpc.php', true);
// 登錄函數(shù)
function login() {
// 如果加密連接已經(jīng)初始化完畢,則驗(yàn)證用戶名密碼
if (rpc.ready) {
// 獲取用戶輸入的用戶名和密碼
var username = document.getElementById('username').value;
var password = document.getElementById('password').value;
// 設(shè)置遠(yuǎn)程過程調(diào)用為單向加密,
// 即傳遞的參數(shù)是加密的,但返回結(jié)果不加密
rpc.encrypt = 1;
// 調(diào)用遠(yuǎn)程過程驗(yàn)證用戶名密碼是否正確,并設(shè)置回調(diào)函數(shù)。
rpc.login(username, password, function (result) {
// 如果返回結(jié)果正確,則轉(zhuǎn)到登錄后的頁面
if (result === true) {
window.location.replace('admin.php');
}
// 否則提示用戶名密碼不正確
else {
alert('用戶名密碼不正確!');
}
});
}
// 如果連接尚未初始化完畢,則等待 100 毫秒后重試。
else {
window.setTimeout('login();', 100);
}
}
window.onload = function () {
document.getElementById('loginbtn').onclick = login;
}
大家會(huì)發(fā)現(xiàn)除了在調(diào)用 use_service 時(shí),設(shè)置了第二個(gè)參數(shù)為 true 外,還在調(diào)用服務(wù)器端的 login 函數(shù)前,設(shè)置了 rpc.encrypt 的值為 1,這里 1 表示單向加密傳輸,單向加密傳輸是指調(diào)用的參數(shù)會(huì)以加密的方式傳給服務(wù)器,但是返回的結(jié)果不加密(如果參數(shù)是引用參數(shù)的話,參數(shù)返回時(shí)也是加密的)。如果 rpc.encrypt 的值為 0,則表示不加密;如果是 2,則表示雙向加密。
這里因?yàn)橹挥杏脩裘兔艽a是敏感數(shù)據(jù),需要保證它在傳遞給服務(wù)器時(shí)不被截獲(即使截獲也是加密的內(nèi)容,無法破解),但返回的結(jié)果成功還是不成功并不是什么需要保密的數(shù)據(jù),所以可以不加密。因此這里選擇了單向加密傳輸。
大家也不必?fù)?dān)心密鑰是否會(huì)被截獲,因?yàn)槊荑€是通過密鑰交換算法,在服務(wù)器端和客戶端(瀏覽器端)隨機(jī)同步生成的,但沒有經(jīng)過網(wǎng)絡(luò)傳輸,在網(wǎng)絡(luò)上傳輸?shù)氖巧赏矫荑€的相關(guān)信息,但是只獲取到這些信息是不足以算出密鑰的,因此可以保證密鑰的安全性。而加密算法本身也是一個(gè)強(qiáng)加密算法,密鑰長度是 128 位,在沒有密鑰的情況下采用窮舉法也是無法破解的。
大家會(huì)發(fā)現(xiàn)登錄成功后,我們轉(zhuǎn)向了 admin.php 頁面,下面是這個(gè)頁面的一個(gè)簡單的例子:
復(fù)制代碼 代碼如下:
<?php
session_start();
if ($_SESSION['user'] == 'root') {
echo "登錄成功!";
}
else {
header("Location: index.html");
}
?>
這里需要自己 sestion_start() 一下了,之后就可以驗(yàn)證 $_SESSION['user'] 是否設(shè)置了。
通過 PHPRPC,你不再需要為 Ajax 程序中數(shù)據(jù)的安全性而頭痛,也不必為回話支持而苦惱,這一切 PHPRPC 都已經(jīng)幫你自動(dòng)完成了,你只需要關(guān)注具體的事務(wù)就可以了。用 PHPRPC 來做 Ajax 安全編程,就是這么簡單!
您可能感興趣的文章:
- PHP遠(yuǎn)程調(diào)用以及RPC框架
- PHP實(shí)現(xiàn)創(chuàng)建一個(gè)RPC服務(wù)操作示例
- php實(shí)現(xiàn)的一個(gè)簡單json rpc框架實(shí)例
- ThinkPHP內(nèi)置jsonRPC的缺陷分析
- PHP采用XML-RPC構(gòu)造Web Service實(shí)例教程
- php中關(guān)于codeigniter的xmlrpc的類在進(jìn)行數(shù)據(jù)交換時(shí)的類型問題
- AMFPHP php遠(yuǎn)程調(diào)用(RPC, Remote Procedure Call)工具 快速入門教程
- php xml-rpc遠(yuǎn)程調(diào)用
- 詳解php中流行的rpc框架
相關(guān)文章
簡單設(shè)置IIS配置PHP調(diào)試環(huán)境
簡單設(shè)置IIS配置PHP調(diào)試環(huán)境...2006-10-10