標籤:python django
Python的Django架構中的Cookie相關處理
瀏覽器的開發人員在很早的時候就已經意識到, HTTP‘s 的無狀態會對Web開發人員帶來很大的問題,於是(cookies)應運而生。 cookies 是瀏覽器為 Web 服務器儲存的一小段資訊。 每次瀏覽器從某個伺服器請求頁面時,它向伺服器回送之前收到的cookies
來看看它是怎麼工作的。 當你開啟瀏覽器並訪問 google.com ,你的瀏覽器會給Google發送一個HTTP請求,起始部分就象這樣:
GET / HTTP/1.1Host: google.com...
當 Google響應時,HTTP的響應是這樣的:
HTTP/1.1 200 OKContent-Type: text/htmlSet-Cookie: PREF=ID=5b14f22bdaf1e81c:TM=1167000671:LM=1167000671; expires=Sun, 17-Jan-2038 19:14:07 GMT; path=/; domain=.google.comServer: GWS/2.1...
注意 Set-Cookie 的頭部。 你的瀏覽器會儲存cookie值( PREF=ID=5b14f22bdaf1e81c:TM=1167000671:LM=1167000671 ) ,而且每次訪問google 網站都會回送這個cookie值。 因此當你下次訪問Google時,你的瀏覽器會發送像這樣的請求:
GET / HTTP/1.1Host: google.comCookie: PREF=ID=5b14f22bdaf1e81c:TM=1167000671:LM=1167000671...
於是 Cookies 的值會告訴Google,你就是早些時候訪問過Google網站的人。 這個值可能是資料庫中儲存使用者資訊的key,可以用它在頁面上顯示你的使用者名稱。 Google會(以及目前)使用它在網頁上顯示你帳號的使用者名稱。
存取Cookies
在Django中處理持久化,大部分時候你會更願意用高層些的session 和/或 後面要討論的user 架構。 但在此之前,我們需要停下來在底層看看如何讀寫cookies。 這會協助你理解本章節後面要討論的工具是如何工作的,而且如果你需要自己操作cookies,這也會有所協助。
讀取已經設定好的cookies極其簡單。 每一個`` HttpRequest`` 對象都有一個`` COOKIES`` 對象,該對象的行為類似一個字典,你可以使用它讀取任何瀏覽器發送給視圖(view)的cookies。
def show_color(request): if "favorite_color" in request.COOKIES: return HttpResponse("Your favorite color is %s" % request.COOKIES["favorite_color"]) else: return HttpResponse("You don‘t have a favorite color.")
寫cookies稍微複雜點。 你需要使用 HttpResponse對象的 set_cookie()方法。 這兒有個基於 GET 參數來設定 favorite_color
cookie的例子:
--edit http://www.aichengxu.com/view/61768 --def set_color(request): if "favorite_color" in request.GET: # Create an HttpResponse object... response = HttpResponse("Your favorite color is now %s" % request.GET["favorite_color"]) # ... and set a cookie on the response response.set_cookie("favorite_color", request.GET["favorite_color"]) return response else: return HttpResponse("You didn‘t give a favorite color.")
你可以給 response.set_cookie() 傳遞一些可選的參數來控制cookie的行為,參考: http://www.aichengxu.com/view/61768
好壞參半的Cookies
也許你已經注意到了,cookies的工作方式可能導致的問題。 讓我們看一下其中一些比較重要的問題:
cookie的儲存是自願的,一個用戶端不一定要去接受或儲存cookie。 事實上,所有的瀏覽器都讓使用者自己控制 是否接受cookies。 如果你想知道cookies對於Web應用有多重要,你可以試著開啟這個瀏覽器的 選項:
儘管cookies廣為使用,但仍被認為是不可靠的的。 這意味著,開發人員使用cookies之前必須 檢查使用者是否可以接收cookie。
Cookie(特別是那些沒通過HTTPS傳輸的)是非常不安全的。 因為HTTP資料是以明文發送的,所以 特別容易受到嗅探攻擊。 也就是說,嗅探攻擊者可以在網路中攔截並讀取cookies,因此你要 絕對避免在cookies中儲存敏感資訊。 這就意味著您不應該使用cookie來在儲存任何敏感資訊。
還有一種被稱為”中間人”的攻擊更陰險,攻擊者攔截一個cookie並將其用於另一個使用者。 第19章將深入討論這種攻擊的本質以及如何避免。
即使從預想中的接收者返回的cookie也是不安全的。 在大多數瀏覽器中您可以非常容易地修改cookies中的資訊。有經驗的使用者甚至可以通過像mechanize(http://wwwsearch.sourceforge.net/mechanize/) 這樣的工具手工構造一個HTTP請求。
因此不能在cookies中儲存可能會被篡改的敏感性資料。 在cookies中儲存 IsLoggedIn=1 ,以標識使用者已經登入。 犯這類錯誤的網站數量多的令人難以置信; 繞過這些網站的安全系統也是易如反掌。
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
Python的Django架構中的Cookie相關處理