2011-03-02 37 views
1

我已經寫了一個C/CGI web應用程序預訂項目。我的客戶要求我在授權用戶可以刪除和更改數據的地方添加一個'管理員'功能,而那些不是的用戶只能添加數據。它在概念上比大多數登錄實現簡單得多,因爲只有密碼,並且實際上只有兩種狀態,即'匿名'和'管理'。單一登錄的最小會話管理?

我來自PHP背景,會話管理像session_start()一樣簡單,我可以立即與$_SESSION一起玩。當然,在C/CGI中沒有像這樣內置的東西。我想避免添加CGI庫依賴項(我已經依賴於glib,confuse和libmysqlclient,加上我很想了解會話管理)。

在C/CGI中進行基於密碼的會話管理,而不需要多個用戶,大量會話數據或任何複雜的任務,最簡單的方法是什麼?

回答

2

會話意味着服務器端維護狀態。由於您沒有用戶,我想您希望它更簡單。如果是這種情況,可以使用帶有過期日期的簽名cookie來做到這一點。本教程將介紹如何使用Python做到這一點:

http://webpython.codepoint.net/cgi_cookie

+0

我怎麼會「標誌」,而且我應該做的檢查,如果客戶端登錄和授權是什麼?將密碼的密碼散列存儲在Cookie密鑰中?這種方法很有趣;我肯定會喜歡這種方式來做這種簡單的事情。 – 2011-03-02 11:48:39

+0

@Delan密碼的哈希值將不夠用,因爲它不會頻繁更改,因此很容易被劫持。這將是一個像日期加上一些應用程序狀態加鹽的散列。如果客戶端發送了正確簽名且未過期的cookie,則他已登錄並獲得授權。 – 2011-03-02 12:02:36

+0

@Delan一個更好的哈希將是一個存儲在cookie中的時間戳+固定的時間間隔(n天+ x小時+ y分鐘+ z秒)+鹽。這將是個人和更容易創建和檢查。 – 2011-03-11 00:53:46

1

首先,您必須決定如何在瀏覽器中保持狀態:您打算使用會話cookie還是在每個頁面上傳遞會話令牌?如果使用cookie方式,則不必更改頁面和表單,但如果尚未存在,請添加cookie管理(請小心使用session + httpOnly cookie)

然後您必須決定如何獲取有關服務器狀態的數據:如果您已經在使用數據庫,則可以添加一個帶有「SESSION_ID」和「EXPIRATION_DATE」列的「SESSION」表以及名爲「SESSION_DATA」的第二個表,其中列「SESSION_ID」 , 「核心價值」。

現在「只是」需要創建一些簡單的功能:

int session_createNewSession(long& session_id, long duration) 
int session_setValue(long session, char[] key, char[] value) 
int session_getValue(long session, char[] key, char[] value) 
int session_abandonSession(long session) 

此函數將返回錯誤代碼,如果會議不能創建或價值不能設置/獲取。您還應該創建一個定期在數據庫上運行的作業,以刪除較舊的會話。

現在,你有你的會話系統到位,其餘部分是相當簡單:

  • 創建一個登錄表單
  • 在CGI通過檢查處理接收到的數據,如果登錄/密碼是正確的(不存儲在數據庫中的密碼,但:存儲鹽漬哈希)
  • 如果接頭是OK,保存會話的用戶ID(或你的情況,你可以只保存一個「IsAdmin」值)

事實上你可以做得更簡單:只要一個session_createNewSession(long & session_id,int isAdmin)就足夠你的情況(只有一個數據庫表),但你的客戶端可能會隨着時間的推移要求更多的功能是不是他?

最後一點:小心你的session_id是隨機的,而不是縮進字段,否則劫持別人的會話將會非常簡單。