簡體   English   中英

單一登錄的最小會話管理?

[英]minimal session management for single login?

我已經編寫了一個用於預訂商品的C / CGI Web應用程序。 我的客戶要求我添加“管理員”功能,授權用戶可以刪除和更改數據,而非授權用戶只能添加數據。 它在概念上比大多數登錄實現要簡單得多,因為只有一個密碼,並且實際上只有兩個狀態,即“匿名”和“管理員”。

我來自PHP背景,其中會話管理與session_start()一樣簡單,並且我可以立即使用$_SESSION 當然,在C / CGI中沒有這樣的內置函數。 我想避免添加CGI庫依賴項(我已經依賴於glib,迷惑和libmysqlclient,而且我很想了解會話管理)。

在C / CGI中進行基於密碼的會話管理的最簡單方法是什么,而無需多個用戶,大量的會話數據或任何復雜的東西?

會話表示服務器端保持狀態。 由於您沒有用戶,我想您希望它更簡單。 如果是這種情況,則帶有過期日期的簽名Cookie可以做到這一點。 本教程將展示如何使用Python進行操作:

http://webpython.codepoint.net/cgi_cookie

首先,您必須決定如何在瀏覽器中保持狀態:您將要使用會話cookie還是在每個頁面上傳遞會話令牌? 如果采用Cookie方式,則無需更改頁面和表單,但是如果尚不存在Cookie管理,則需要添加它(請注意使用會話+ httpOnly cookie)

然后,您必須決定如何獲取有關服務器上狀態的數據:如果您已經在使用數據庫,則可以添加帶有列“ SESSION_ID”和“ EXPIRATION_DATE”的“ SESSION”表以及帶有“ SESSION_DATA”的第二個表列“ SESSION_ID”,“ KEY”,“ VALUE”。

您現在“只需”必須創建一些簡單的功能:

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中,通過檢查登錄名/密碼是否正確來處理接收到的數據(盡管不要將密碼存儲在db中:存儲加鹽的哈希)
  • 如果連接正常,請在會話中保存用戶ID(或者,在您的情況下,您可以保存“ IsAdmin”值)

實際上,您可以做得更簡單:在您的情況下(只有一個數據庫表),僅一個session_createNewSession(long&session_id,int isAdmin)就足夠了,但是隨着時間的流逝,您的客戶端可能會問更多功能,不是嗎?

最后一點:請注意您的session_id是隨機的,而不是縮進字段,否則劫持其他人的會話將非常簡單。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM