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


Posted in Python onJuly 22, 2015

浏览器的开发者在很早的时候就已经意识到, HTTP's 的无状态会对Web开发者带来很大的问题,于是(cookies)应运而生。 cookies 是浏览器为 Web 服务器存储的一小段信息。 每次浏览器从某个服务器请求页面时,它向服务器回送之前收到的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,可以用它在页面上显示你的用户名。 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的例子:

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的行为

好坏参半的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 相关文章推荐
Python爬取读者并制作成PDF
Mar 10 Python
解决python3 urllib中urlopen报错的问题
Mar 25 Python
Python Xml文件添加字节属性的方法
Mar 31 Python
详解Python下Flask-ApScheduler快速指南
Nov 04 Python
Django Rest framework权限的详细用法
Jul 25 Python
django 使用 PIL 压缩图片的例子
Aug 16 Python
Python 中pandas索引切片读取数据缺失数据处理问题
Oct 09 Python
flask 框架操作MySQL数据库简单示例
Feb 02 Python
Python如何定义有可选参数的元类
Jul 31 Python
Django如何实现防止XSS攻击
Oct 13 Python
Python实现异步IO的示例
Nov 05 Python
Python爬虫之Selenium库的使用方法
Jan 03 Python
在Django中使用Sitemap的方法讲解
Jul 22 #Python
用Python的Django框架来制作一个RSS阅读器
Jul 22 #Python
利用Python的Django框架生成PDF文件的教程
Jul 22 #Python
在Python的Django框架中生成CSV文件的方法
Jul 22 #Python
在主机商的共享服务器上部署Django站点的方法
Jul 22 #Python
在Lighttpd服务器中运行Django应用的方法
Jul 22 #Python
简单的Apache+FastCGI+Django配置指南
Jul 22 #Python
You might like
php中将字符串转为HTML的实体引用的一个类
2013/02/03 PHP
thinkPHP查询方式小结
2016/01/09 PHP
PHP实现网页内容html标签补全和过滤的方法小结【2种方法】
2017/04/27 PHP
Yii2数据库操作常用方法小结
2017/05/04 PHP
jquery 模拟类搜索框自动完成搜索提示功能(改进)
2010/05/24 Javascript
使用javascript为网页增加夜间模式
2014/01/26 Javascript
自己用jQuery写了一个图片的马赛克消失效果
2014/05/04 Javascript
JS实现可点击展开与关闭的左侧广告代码
2015/09/02 Javascript
轻松学习jQuery插件EasyUI EasyUI创建树形网络(1)
2015/11/30 Javascript
解决AngualrJS页面刷新导致异常显示问题
2017/04/20 Javascript
JS实现的Unicode编码转换操作示例
2017/04/28 Javascript
详解React 16 中的异常处理
2017/07/28 Javascript
浅谈对Angular中的生命周期钩子的理解
2017/07/31 Javascript
vue页面使用阿里oss上传功能的实例(一)
2017/08/09 Javascript
详解如何用babel转换es6的class语法
2018/04/03 Javascript
基于vue-router 多级路由redirect 重定向的问题
2018/09/03 Javascript
微信小程序实现类似微信点击语音播放效果
2020/03/30 Javascript
简单了解前端渐进式框架VUE
2020/07/20 Javascript
[01:58]最残酷竞争 2016国际邀请赛中国区预选赛积分循环赛回顾
2016/06/28 DOTA
Python编程之多态用法实例详解
2015/05/19 Python
mac系统安装Python3初体验
2018/01/02 Python
python traceback捕获并打印异常的方法
2018/08/31 Python
详解【python】str与json类型转换
2019/04/29 Python
HTML5实现签到 功能
2018/10/09 HTML / CSS
美国第二大团购网站:LivingSocial
2016/07/24 全球购物
美国著名的品牌折扣店:Burlington
2017/06/08 全球购物
Needle & Thread官网:英国仙女品牌
2018/01/13 全球购物
全球500多个机场的接送服务:Suntransfers
2019/06/03 全球购物
应聘美工求职信
2013/11/07 职场文书
企业消防安全制度
2014/02/02 职场文书
乡镇创先争优活动总结
2014/08/28 职场文书
中学生的1000字检讨书
2014/10/11 职场文书
python xlwt模块的使用解析
2021/04/13 Python
企业版Windows 11有哪些新功能? Win11适用于企业的功能介绍
2021/11/21 数码科技
Mysql 8.x 创建用户以及授予权限的操作记录
2022/04/18 MySQL
vue ant design 封装弹窗表单的使用
2022/06/01 Vue.js