Python的Django框架中的Cookie相关处理

时间:2022-01-11 13:02:11

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 ,以标识用户已经登录。 犯这类错误的站点数量多的令人难以置信。 绕过这些站点的安全系统也是易如反掌。