路由器帳戶管理實現
最近有這樣個需求,在ARM9+linux下跑的AppWeb(mini-apache) 來做一個類似路由器web管理的web server。本來appweb帶有Digest Auth,但是在源代碼里沒實現用戶密碼的修改,登陸註銷等功能,只提供了一個用於修改密碼的工具(binary文件)。使用CGI C程序調用這個工具,我已經實現了密碼的修改,但不知道現在怎麼實現用戶的登陸註銷。
現在想知道:像路由器,交換機這些web server的登陸,註銷,帳戶管理等功能,是用設計web page的腳本語言(CGI,ASP,PHP)實現的, 還是用web server自帶的訪問控制(Digest認證)實現的?
《解決方案》
Websever 提供的認證無法實現注消, 要實現注消息需要 Session 機制.
同時利用 webserver 提供的摘要認證方式在應用中還有其它許多局限性, 一般應用都自己腳本語言實現. 方法:
(1) 伺服器隨機生成摘要串 (如用 session 生成一個隨機串).
(2) 瀏覽器用 JS 將摘要和密碼一起完成 HMAC-MD5 加密, 將密文傳送給伺服器.
(3) 伺服器驗證.
如下是一個簡單的示例:
<html>
<head>
<title>Authentication Demo</title>
<script type='text/javascript' src="/md5.js"></script>
<script type='text/javascript'>
<!--
/* reference: http://www.eybuild.com */
function encrypt() {
var encrypted=hex_hmac_md5(f.pswd.value, "<% =sessid %>");
f.pswd.value = "";
f.digest.value = encrypted;
}
-->
</script>
</head>
<body>
Input passward:
<form name="f" action="" method="post" onsubmit="encrypt()">
<input type="hidden" name="digest" value="">
用戶名: <input type="text" name="user"><br>
密 碼: <input type="passwd" name="pswd"><p>
<input type="submit" name="login" value="login"><br>
</form>
<% @b
char errmsg = "";
char sessid = "";
char dst = "";
char * pusr = G("user");
char * pswd = G("digest");
if (!strissp(G("login")))
{
if (!strcmp(pusr, "user"))
pusr = "user";
else if (!strcmp(pusr, "admin"))
pusr = "admin";
else if (!strcmp(pusr, "root"))
pusr = "root";
else
pusr = "unknown";
if (!strcmp(pswd, HMAC_MD5Hex(dst, getsession("pswd"), pusr)))
{
strcpy(errmsg, "Login OK");
}
else
{
sprintf(errmsg, "Invalid passwd: %s", pswd);
}
}
ebMakeSessID(sessid, 16);
setsession("pswd", sessid);
%>
<p><b><% =errmsg %></b></p>
</body>
</html>
修改用戶賬戶, 設計一個頁面提交下修改之, 即可.
可參考: http://www.eybuild.com/develop/bbr.htm
Good Luck!
《解決方案》
Websever 提供的認證,能夠管理哪些目錄只有在登陸厚才能夠被訪問,我不清楚腳本語言,不知道能不能通過這些JS腳本語言也能實現上述功能?