使用PHPRPC實現(xiàn)Ajax安全登錄第2/2頁
更新時間:2011年10月31日 23:00:10 作者:
PHPRPC 是一個輕型的、安全的、跨網(wǎng)際的、跨語言的、跨平臺的、跨環(huán)境的、跨域的、支持復雜對象傳輸?shù)?、支持引用參?shù)傳遞的、支持內容輸出重定向的、支持分級錯誤處理的、支持會話的、面向服務的高性能遠程過程調用協(xié)議。
另外一篇文章,整理的代碼比較詳細
昨天我舉了個用 PHPRPC 實現(xiàn) Ajax 級聯(lián)下拉菜單 的例子,那個例子中我們重點要演示的是用 PHPRPC 實現(xiàn) Ajax 效果是多么的簡單。今天我們這個例子主要演示用 PHPRPC 內置的安全加密機制來實現(xiàn)安全登錄是多么簡單。當然它同樣可以用于密碼設置、其它關鍵保密數(shù)據(jù)的傳輸?shù)阮I域。
這個例子比昨天的例子還要簡單,先來看服務器端:
復制代碼 代碼如下:
<?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'));
?>
這段代碼太簡單了,我不需要多說什么大家也能夠看明白。不過大家會發(fā)現(xiàn),在 login 函數(shù)中我用了 $_SESSION 變量,但是并沒有在什么位置上寫 session_start(),原因在于建立加密連接時,已經(jīng)自動調用了 session_start(),因此不需要再單獨寫 session_start() 了。為了驗證它是否生效,我們在后面的另一個頁面中(admin.php),將判斷這里設置的 $_SESSION 變量,并根據(jù)它來報告登錄成功或者沒成功跳回到登錄頁面。
那再來看看客戶端,客戶端我們將 JavaScript 跟 HTML 分離了,先來看看 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 是怎么寫的。
復制代碼 代碼如下:
// 創(chuàng)建 phprpc 客戶端對象 rpc
phprpc_client.create('rpc');
// 初始化帶有加密連接的 rpc 服務,第二個參數(shù)表示是否創(chuàng)建加密連接
rpc.use_service('rpc.php', true);
// 登錄函數(shù)
function login() {
// 如果加密連接已經(jīng)初始化完畢,則驗證用戶名密碼
if (rpc.ready) {
// 獲取用戶輸入的用戶名和密碼
var username = document.getElementById('username').value;
var password = document.getElementById('password').value;
// 設置遠程過程調用為單向加密,
// 即傳遞的參數(shù)是加密的,但返回結果不加密
rpc.encrypt = 1;
// 調用遠程過程驗證用戶名密碼是否正確,并設置回調函數(shù)。
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;
}
大家會發(fā)現(xiàn)除了在調用 use_service 時,設置了第二個參數(shù)為 true 外,還在調用服務器端的 login 函數(shù)前,設置了 rpc.encrypt 的值為 1,這里 1 表示單向加密傳輸,單向加密傳輸是指調用的參數(shù)會以加密的方式傳給服務器,但是返回的結果不加密(如果參數(shù)是引用參數(shù)的話,參數(shù)返回時也是加密的)。如果 rpc.encrypt 的值為 0,則表示不加密;如果是 2,則表示雙向加密。
這里因為只有用戶名和密碼是敏感數(shù)據(jù),需要保證它在傳遞給服務器時不被截獲(即使截獲也是加密的內容,無法破解),但返回的結果成功還是不成功并不是什么需要保密的數(shù)據(jù),所以可以不加密。因此這里選擇了單向加密傳輸。
大家也不必擔心密鑰是否會被截獲,因為密鑰是通過密鑰交換算法,在服務器端和客戶端(瀏覽器端)隨機同步生成的,但沒有經(jīng)過網(wǎng)絡傳輸,在網(wǎng)絡上傳輸?shù)氖巧赏矫荑€的相關信息,但是只獲取到這些信息是不足以算出密鑰的,因此可以保證密鑰的安全性。而加密算法本身也是一個強加密算法,密鑰長度是 128 位,在沒有密鑰的情況下采用窮舉法也是無法破解的。
大家會發(fā)現(xiàn)登錄成功后,我們轉向了 admin.php 頁面,下面是這個頁面的一個簡單的例子:
復制代碼 代碼如下:
<?php
session_start();
if ($_SESSION['user'] == 'root') {
echo "登錄成功!";
}
else {
header("Location: index.html");
}
?>
這里需要自己 sestion_start() 一下了,之后就可以驗證 $_SESSION['user'] 是否設置了。
通過 PHPRPC,你不再需要為 Ajax 程序中數(shù)據(jù)的安全性而頭痛,也不必為回話支持而苦惱,這一切 PHPRPC 都已經(jīng)幫你自動完成了,你只需要關注具體的事務就可以了。用 PHPRPC 來做 Ajax 安全編程,就是這么簡單!