2013-02-13 85 views
6

我有一個Flask應用程序,與Nginx + WSGI(FastCGI & Gevent)一起服務並使用標準Flask會話。我做不是使用session.permanent=True或任何其他額外的選項,但簡單地設置SECRET_KEY在默認配置。恆定瓶會話ID

我做不是保存會話中的任何(鍵,值)對,只依賴於SID = session['_id']條目來識別返回的用戶。我用下面的代碼讀取SID

@page.route ('/') 
def main (page='home', template='index.html'): 

    if not request.args.get ('silent', False): 
     print >> sys.stderr, "Session ID: %r" % session['_id'] 

我提出以下意見:

  1. 對於相同的IP地址,但不同的瀏覽器我得到不同的SIDs - 這是預期;
  2. 對於不同的IP &同一瀏覽器我再次有不同的SIDs - 預期;
  3. 對於具有相同瀏覽器的相同IP地址,我得到相同的SID - 也是預期的;現在

點,(3)是有趣的,因爲即使刪除相應的cookie中的SID保持不變!在某種程度上,即使這可能是可以理解的,但實際上我期望SID在不同的cookie之間進行更改。但我看到的唯一區別是,

session.new is True 

的cookie的刪除後立即第一請求。即使這是非常期望的;但鑑於這些事實,我面臨着以下問題:

  1. 這是否意味着,對於不同用戶坐在相同 IP背後(具有相同的瀏覽器配置),我的後端會誤認爲是該相同用戶?

  2. 如果點(1)的情況下,這些「粘性」當前會話的行爲實際上是相當愉快的,因爲這避免了僅僅是因爲他們刪除了相應的cookie我的用戶可能會失去存在的數據的情況。

    他們仍然可以通過使用同一瀏覽器從同一網絡重新訪問該網站來節省時間。我喜歡那個,但只有如果點(1)是不是的情況。

  3. 我認爲點(1)實際上會咬我,結論實際上是否會在會話中保存一個token,並因此接受用戶可以通過簡單地刪除他的cookie來炸掉自己的命運?

  4. 或者有沒有辦法告訴Flask給每個新鮮的餅乾不同的SIDs

其實,這個問題引起,因爲我用衝擊負荷的服務,這是模擬不同用戶(同一IP),但我的後端不斷看到它們作爲一個用戶,因爲相應SIDs人全部都一樣。

的應用可以在http://webed.blackhan.ch測試(其中經發布將移動https://notex.ch [基於瀏覽器的文本編輯器])。謝謝您的回答。

回答

5

看起來你正在使用Flask-Login擴展。下面是生成id令牌的代碼:

def _create_identifier(): 
    base = unicode("%s|%s" % (request.remote_addr, 
           request.headers.get("User-Agent")), 'utf8', errors='replace') 
    hsh = md5() 
    hsh.update(base.encode("utf8")) 
    return hsh.digest() 

它基本上只是md5(ip_address + user_agent)

燒瓶使用Werkzeug's secure cookies來存儲此標識符。安全cookie(如其名稱所暗示的)安全:

該模塊實現了一個不能從客戶端改變的cookie,因爲它添加了服務器檢查的校驗和。如果您擁有的是用戶標識或用於標記已登錄用戶的內容,則可以將其用作會話替換。

+0

謝謝你的回答:的確,我正在使用'Flask-Login',我想這解釋了爲什麼我只看到一個具有相同(IP,User-Agent)組合的用戶。我在cookie中引入了一個令牌,以便在這種情況下能夠區分。 – hsk81 2013-02-13 10:56:58

+0

@ hsk81:這很奇怪。我很確定Flask的會話被分配了隨機ID,以防止像這樣的問題。 – Blender 2013-02-13 10:58:08

+0

不知道,即使在刪除cookie後,它仍會給我一個'session ['_ id']'的常量值。我的印象是,沒有這樣的隨機化,或者以某種方式'session ['_ id']'是訪問會話身份的錯誤方式。我還沒有找到關於* canonical *方法應該是什麼的參考,並且只是在cookie中查看Flask創建和使用的那個:'_id''。我可能會忽略文檔中的某些內容。 – hsk81 2013-02-13 11:09:02

0

session['_id']不是實際的會話標識符。這只是Flask-Login用來實現Session Protection的一個值。

標準 Flask會話沒有SID--因爲會話的實際內容存儲在cookie本身中,所以它沒有任何用處。另見this