add by zhj: 我也同意作者的观点,JavaScript 操作 Cookie 是一种不正常的做法;可以用 JavaScript 操作 Cookie 完成的功能,一样可以在服务端来完成。

js操作cookie会带来的风险,比如xss,用户篡改cookie等。在django的csrf防御机制中,模板中的表单,如果是post请求,都要加上{%csrf_token%}标签,

这其实就是在服务端从cookie中取出csrftoken,然后给表单增加一个隐藏input,name="crsrmiddlewaretoken" value="{{ csrf_token }}",这个

变量csrf_token=request.COOKIES['csrftoken']。另外,在模板的js代码中,也支持渲染时传入的变量,所以django的csrf防御机制中,当发送ajax时,要

加x-csrftoken这个header,可以在渲染模板时传入request.COOKIES['csrftoken']给x-csrftoken,从而就不用在前端js获取cookie去赋值了。

正如作者所说,js在前端操作cookie能完成的事,通过request.COOKIES都可以在服务端完成。所以设置cookie时建议使用httponly=true

需要注意两点:

1. views.py中返回的函数中的值要用 json.dumps()处理

2. 在网页上要加一个 safe 过滤器。

views.py

# -*- coding: utf-8 -*-

from __future__ import unicode_literals

import json
from django.shortcuts import render def home(request):
List = ['自强学堂', '渲染Json到模板']
Dict = {'site': '自强学堂', 'author': '涂伟忠'}
return render(request, 'home.html', {
'List': json.dumps(List),
'Dict': json.dumps(Dict)
})

home.html 只给出了 js 核心部分:

//列表
var List = {{ List|safe }};
//字典
var Dict = {{ Dict|safe }};

当然,你也可以将 django的模板数据放在html代码里,比如你可以搞一个隐藏的字段

<input type="hidden"/> 把数据扔里面然后在 js文件去 $("#").val() 去拿数据进行操作,

这样可以做到 js代码与 django代码分离解耦,适合开发和扩展、调试。

原文:http://www.infoq.com/cn/articles/cookie-security

  在 Web 应用中,Cookie 很容易成为安全问题的一部分。从以往的经验来看,对 Cookie 在开发过程中的使用,很多开发团队并没有形成共识或者一定的规范,这也使得很多应用中的 Cookie 成为潜在的易受攻击点。在给 Web 应用做安全架构评审(Security architecture review)的时候,我通常会问设计人员以下几个问题:

  1. 你的应用中,有使用 JavaScript 来操作客户端 Cookie 吗?如果有,那么是否必须使用 JavaScript 才能完成此应用场景?如果没有,你的 Cookie 允许 JavaScript 来访问吗?
  2. 你的网站(可能包含多个 Web 应用)中,对于 Cookie 的域(Domain)和路径(Path)设置是如何制定策略的?为何这样划分?
  3. 在有 SSL 的应用中,你的 Cookie 是否可以在 HTTP 请求和 HTTPS 请求中通用?

  在实际的应用场景中,Cookie 被用来做得最多的一件事是保持身份认证的服务端状态。这种保持可能是基于会话(Session)的,也有可能是持久性的。不管哪一种,身份认证 Cookie 中包含的服务端票据(Ticket)一旦泄露,那么服务端将很难区分带有此票据的用户请求是来自于真实的用户,或者是来自恶意的攻击者。在实际案例中,造成 Cookie 泄露最多的途径,是通过跨站脚本(XSS, Cross Site Script)漏洞。攻击者可以通过一小段 JavaScript 代码,偷窃到代表用户身份的重要的 Cookie 标示。由于跨站脚本漏洞是如此的普遍(不要以为简单的 HTML Encode 就可以避免被跨站,跨站是一门很深的学问,以至于在业界衍生出一个专用的名词:跨站师),几乎每一个网站都无法避免,所以这种方式是实际攻防中被普遍使用的一种手段。

  避免出现这种问题的首要秘诀就是尽所有的可能,给你的 Cookie 加上 HttpOnly 的标签。HttpOnly 的具体使用不在本文的讨论范围内,否则作者略有骗 InfoQ 稿酬的嫌疑。一个大家所不太熟悉的事实是,HttpOnly 是由微软在 2000 年 IE6 Sp1 中率先发明并予以支持的。截止现在,HttpOnly 仍然只是一个厂商标准,但是在过去的十余年中,它得到了众多浏览器的广泛支持。

  下表是 OWASP 整理的关于主流浏览器对 HttpOnly 支持情况的一个总结。从表中可以看出,目前主流的浏览器,除了 Android 之外,几乎都无一例外对这一属性予以了支持。

  当然对于中国开发者来说,需要考虑的问题更加复杂一些:在这个神奇的地方,有大量的用户使用的浏览器并不在以下的列表中,他们使用的是以下面浏览器中的一种或者数种为内核的“精装版”浏览器。这些浏览器厂商对于同源策略、HttpOnly Cookie、证书管理等安全规范的支持情况,有待于进一步调查。

Browser

Version

Prevents Reads

Prevents Writes

Microsoft Internet Explorer

10

Yes

Yes

Microsoft Internet Explorer

9

Yes

Yes

Microsoft Internet Explorer

8

Yes

Yes

Microsoft Internet Explorer

7

Yes

Yes

Microsoft Internet Explorer

6 (SP1)

Yes

No

Microsoft Internet Explorer

6 (fully patched)

Yes

Unknown

Mozilla Firefox

3. 0.0.6+

Yes

Yes

Netscape Navigator

9. 0b3

Yes

Yes

Opera

9. 23

No

No

Opera

9. 5

Yes

No

Opera

11

Yes

Unknown

Safari

3

No

No

Safari

5

Yes

Yes

iPhone (Safari)

iOS 4

Yes

Yes

Google's Chrome

Beta (initial public release)

Yes

No

Google's Chrome

12

Yes

Yes

Android

Android 2.3

Unknown

Unknown

  在我看来,一个 Web 应用的每一个 Cookie 都应该带上 HttpOnly 的标签。我没有看到这个决定可能带来的负面作用,如果一定要说有的话,那么就是你的应用将不能再通过 JavaScript 来读写 Cookie 了。可是这真有必要吗?个人认为,JavaScript 操作 Cookie 是一种不正常的做法;可以用 JavaScript 操作 Cookie 完成的功能,一样可以用服务端响应 Http 头设置 Cookie 来完成。相反,设置所有的 Cookie 为 HttpOnly 带来的巨大好处则非常明显:尽管你需要继续修复 XSS 漏洞,但是这些漏洞至少暂时不会让你的用户遭受大规模的账户损失。

  关于 Cookie 的第二个话题是域设置。

  浏览器在选择发送哪些本地 Cookie 到本次请求的服务端时,有一系列的比较和甄别。这些甄别中最重要的部分是 Domain 和 Path 的吻合。Domain 形如 .abc.com 的 Cookie,会被发送给所有 abc.com 在 80 端口上的子域请求。但是反之则不行,这就是 Cookie 的域匹配(domain match)原则。

  在一个大型 Web 站点中,往往有多个应用,生存在不同的子域名或路径下。这些应用之间由于共享同一个域名,所以往往可能会彼此有操作对方应用 Cookie 的能力。这种情况下,设计好 Cookie 的 Domain 和 Path 尤为重要。在实际设计工作中,最重要的一个安全原则就是:最小化授权。这意味着,你需要将自己的 Cookie 可被访问到的范围降至最低。应用之间传递数据和共享信息的解决方案非常多,而通过 Cookie 这种用户输入(User input)来共享数据,是最不安全的解决方案之一。

  Cookie 另外一个不太常被使用的属性是 Secure. 这个属性启用时,浏览器仅仅会在 HTTPS 请求中向服务端发送 Cookie 内容。如果你的应用中有一处非常敏感的业务,比如登录或者付款,需要使用 HTTPS 来保证内容的传输安全;而在用户成功获得授权之后,获得的客户端身份 Cookie 如果没有设置为 Secure,那么很有可能会被非 HTTPS 页面中拿到,从而造成重要的身份泄露。所以,在你的 Web 站点中,如果使用了 SSL,那么你需要仔细检查在 SSL 的请求中返回的 Cookie 值,是否指定了 Secure 属性。

  除此之外还值得特别指出的是,一些 Web 应用除了自己的程序代码中生成的 Cookie,往往还会从其他途径生成一些 Cookie。例如由 Web Server 或者应用容器自动生成的会话 Cookie,由第三方库或者框架生成的 Cookie 等等。这些都需要进行有针对性的加固处理。

  几乎每个站点都难以离开 Cookie,但 Cookie 的使用因其貌似简单,而很容易被人轻视。重新审视应用中的 Cookie 代码,几乎只需要很小的代价就可以获得巨大的安全收益。

  参考文章

Cookie安全漫谈(转)的更多相关文章

  1. COOKIE之安全设置漫谈

    一.标题:COOKIE之安全设置漫谈 副标:httponly属性和secure属性解析 二.引言 经常有看到XSS跨站脚本攻击窃取cookie案例,修复方案是有httponly.今天写出来倒腾下... ...

  2. COOKIE漫谈

    cookie概述在上一节,曾经利用一个不变的框架来存储购物栏数据,而商品显示页面是不断变化的,尽管这样能达到一个模拟全局变量的功能,但并不严谨.例如在导航框架页面内右击,单击快捷菜单中的[刷新]命令, ...

  3. 漫谈客户端存储技术之Cookie篇

    Cookie 说到Cookie,不管作为前端开发人员还是后端开发人员并不陌生,作为一种最古老.最稳定的客户端存储形式,即便是在当下各种新的客户端存储技术层出不穷的时代,它仍旧有其一席之位.Cookie ...

  4. 关于Cookie的知识的总结

    Cookie的类型 会话cookie和持久cookie 会话cookie是一种临时cookie,它记录了用户访问站点时的设置和偏好,当用户退出浏览器时,会话cookie就会被删除. 持久cookie的 ...

  5. (转)HTTP协议漫谈

    HTTP协议漫谈   简介 园子里已经有不少介绍HTTP的的好文章.对HTTP的一些细节介绍的比较好,所以本篇文章不会对HTTP的细节进行深究,而是从够高和更结构化的角度将HTTP协议的元素进行分类讲 ...

  6. SpringMVC 请求全过程漫谈

    SpringMVC 请求全过程漫谈 SpringMVC 跟其他的mvc框架一样,如 struts,webwork, 本质上都是 将一个 http 请求(request)进行各种处理, 然后返回resp ...

  7. NGINX:漫谈优化

    优化那些事儿 生产环境下网站做前期的优化肯定是比不可少的,简单来说就是用同等条件的硬件资源,处理更多的网站业务,大程度提供网站业务处理能力:前辈留下的实战经验可都是财富,好多坑只有踩过才知道痛,下面就 ...

  8. HTTP协议漫谈 C#实现图(Graph) C#实现二叉查找树 浅谈进程同步和互斥的概念 C#实现平衡多路查找树(B树)

    HTTP协议漫谈   简介 园子里已经有不少介绍HTTP的的好文章.对HTTP的一些细节介绍的比较好,所以本篇文章不会对HTTP的细节进行深究,而是从够高和更结构化的角度将HTTP协议的元素进行分类讲 ...

  9. HTTP 协议漫谈

    转载出处:HTTP 协议漫谈 简介 网络上已经有不少介绍 HTTP 的好文章,对HTTP的一些细节介绍的比较好,所以本篇文章不会对 HTTP 的细节进行深究,而是从够高和更结构化的角度将 HTTP 协 ...

随机推荐

  1. 洛谷 P2607 [ZJOI2008]骑士 解题报告

    P2607 [ZJOI2008]骑士 题目描述 Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬. 最近发生了一件可怕的事情,邪恶的Y国发动了一 ...

  2. zabbix监控的基础概念、工作原理及架构(一)

    zabbix监控的基础概念.工作原理及架构 转载于网络 一.什么是zabbix及优缺点 Zabbix能监视各种网络参数,保证服务器系统的安全运营,并提供灵活的通知机制以让系统管理员快速定位/解决存在的 ...

  3. ElasticStack系列之十九 & bulk时 index 和 create 的区别

    区别: 两篇文章 id 都一样的情况下,index 是将第二篇文章覆盖第一篇:create 是在第二篇插入的时候抛出一个已经存在的异常 解释: 在批量请求的时候最好使用 create 方式进行导入.假 ...

  4. 浮动和margin-left负值的有趣现象

    我将第二个浮动的元素的margin-left的值不断减小: 被设置元素左移,后面的元素跟着动 当被设置元素的右边界超过了前面元素的左边界,后面边的元素被前面的元素挡在外面了

  5. Java基础-爬虫实战之爬去校花网网站内容

    Java基础-爬虫实战之爬去校花网网站内容 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 爬虫这个实现点我压根就没有把它当做重点,也没打算做网络爬虫工程师,说起爬虫我更喜欢用Pyt ...

  6. Object类型的怎么判断空值

    例如 Object result; 我直接这样是不行的 if(result==null) //这样是错的 ... 要这样判断 if(result == System.DBNull.Value) //这 ...

  7. 论攻击Web应用的常见技术

    攻击目标: 应用HTTP协议的服务器和客户端.以及运行在服务器上的Web应用等. 攻击基础: HTTP是一种通用的单纯协议机制.在Web应用中,从浏览器那接受到的HTTP请求的全部内容,都可以在客户端 ...

  8. Django 2.0.1 官方文档翻译: 编写你的第一个 Django app,第一部分(Page 6)

    编写你的第一个 Django app,第一部分(Page 6)转载请注明链接地址 Django 2.0.1 官方文档翻译: Django 2.0.1.dev20171223092829 documen ...

  9. 20155216 2016-2017-2 《Java程序设计》第八周学习总结

    20155216 2016-2017-2 <Java程序设计>第八周学习总结 教材学习内容总结 认识NIO Java NIO 由以下几个核心部分组成: Channels Buffers S ...

  10. expect 交互 模拟ssh 登陆

    模拟ssh登录 #!/bin/bash Ip='192.168.1.6' # 循环就行 RemoteUser='user' # 普通用户 RemotePasswd='userpasswd' # 普通用 ...