Python的Django框架中的Cookie相关处理
浏览器的开发人员在非常早的时候就已经意识到。 HTTP's 的无状态会对Web开发人员带来非常大的问题,于是(cookies)应运而生。 cookies 是浏览器为 Web server存储的一小段信息。 每次浏览器从某个server请求页面时,它向server回送之前收到的cookies
来看看它是怎么工作的。
当你打开浏览器并訪问 google.com 。你的浏览器会给Google发送一个HTTP请求,起始部分就象这样:
GET / HTTP/1.1 Host: google.com ...
当 Google响应时。HTTP的响应是这种:
HTTP/1.1 200 OK Content-Type: text/html Set-Cookie: PREF=ID=5b14f22bdaf1e81c:TM=1167000671:LM=1167000671; expires=Sun, 17-Jan-2038 19:14:07 GMT; path=/; domain=.google.com Server: GWS/2.1 ...
注意 Set-Cookie 的头部。 你的浏览器会存储cookie值( PREF=ID=5b14f22bdaf1e81c:TM=1167000671:LM=1167000671 ) ,并且每次訪问google 网站都会回送这个cookie值。
因此当你下次訪问Google时。你的浏览器会发送像这种请求:
GET / HTTP/1.1 Host: google.com Cookie: PREF=ID=5b14f22bdaf1e81c:TM=1167000671:LM=1167000671 ...
于是 Cookies 的值会告诉Google,你就是早些时候訪问过Google站点的人。 这个值可能是数据库中存储用户信息的key。能够用它在页面上显示你的username。 Google会(以及眼下)使用它在网页上显示你账号的username。
存取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的存储是自愿的,一个client不一定要去接受或存储cookie。 其实,全部的浏览器都让用户自己控制 是否接受cookies。 假设你想知道cookies对于Web应用有多重要,你能够试着打开这个浏览器的 选项:
虽然cookies广为使用,但仍被觉得是不可靠的的。 这意味着。开发人员使用cookies之前必须 检查用户能否够接收cookie。
Cookie(特别是那些没通过HTTPS传输的)是很不安全的。 由于HTTP数据是以明文发送的。所以 特别easy受到嗅探攻击。 也就是说,嗅探攻击者能够在网络中拦截并读取cookies。因此你要 绝对避免在cookies中存储敏感信息。
这就意味着您不应该使用cookie来在存储不论什么敏感信息。
另一种被称为”中间人”的攻击更阴险,攻击者拦截一个cookie并将其用于另一个用户。
第19章将深入讨论这样的攻击的本质以及怎样避免。
即使从预想中的接收者返回的cookie也是不安全的。 在大多数浏览器中您能够很easy地改动cookies中的信息。有经验的用户甚至能够通过像mechanize(http://wwwsearch.sourceforge.net/mechanize/) 这种工具手工构造一个HTTP请求。
因此不能在cookies中存储可能会被篡改的敏感数据。 在cookies中存储 IsLoggedIn=1 ,以标识用户已经登录。 犯这类错误的站点数量多的令人难以置信。 绕过这些站点的安全系统也是易如反掌。