Django的CSRF原来形同虚设呀⋯⋯

在搞Django 1.3和Uploadify的整合时,被莫名其妙的302困扰,在苦思之后突然发现,原来Uploadify发送请求时是不会发送Cookie信息的。火急火燎地弄了个middleware来将POST中对应字段写到request.COOKIES去。这样一搞,302倒是ok了,但403倒跑了出来。使用抽插,哦不,抽查法找到是Csrf的验证问题,于是天真地把csrfmiddlewaretoken塞到POST里,可是403依旧。甚是火大。

只好乖乖地看源码,看看Django是如何做CSRF验证的。Django是在CsrfViewMiddleware中进行的相关验证,验证过程很简单,从Cookie中拿出token,然后从POST中拿出csrfmiddlewaretoken,然后块俩做一个字符匹配,就哦了。于是明白了,不就再传个cookie嘛,但突然一想,不对呀,csrfmiddlewaretoken的值就是从cookie里拿的,再传同一个值来做验证,这不是和没验证没啥区别么……

于是做了一个试验,结果确实如此,这下Django悲剧了……

实验项目可以在这个地址下载,运行runserver后,用curl来验证

直接GET,无障碍

curl http://127.0.0.1:8000

强制GET,无障碍

curl -G -d test=test http://127.0.0.1:8000

POST,403了,ms没问题?

curl -d test=test http://127.0.0.1:8000

POST,随便加上csrf,靠!!居然过了!!!

curl -d "test=test;csrfmiddlewaretoken=1" -b csrftoken=1  http://127.0.0.1:8000

归根结底,还是这个验证方法有问题,起码post中的token和cookie中的token是用secret_key做过变幻的,这样才能避免伪造,否则,神马都是浮云~~ 望天

P.S. 报bug去了,#15845。不知他们会采用我说的方法不⋯⋯

Updated: 呃,一般情况下大约是不会有问题的,因为这只是可以任意伪造csrf_token,但通常还有需要csrf保护的地方也会需要sessionid来作用户验证。这篇的问题就可以暂时忽略了。

Django 1.3新特性

阵子出去度假了,回来发现Django 1.3终于发布了。这次发布包含了少量新功能和大量的bugfix,具体的下文会说明。这次升级对Python版本的最低要求提高至2.4,另外这将是最后一个支持2.4的Django版本了,各位有能力有需求的同志请果断更新。

1.3带来了什么?

类视图 (Class-based views)

本次更新加入了一个新的框架来支持类视图,这将意味着更高的代码重用率和开发效率。新的Generic View基类在提供了易用性和扩展性的同时,还对原先的函数式generic view提供了完整的模拟支持。

扩展链接:
通用类视图
新旧Generic View迁移指南

继续阅读

Django 1.2.3 released

吧,上周临行前Django升级到1.2.2,当时立刻就作了更新,想着可以安份一阵子了,结果DSF居然趁着我们在青岛happy的时候,发布了1.2.3……

本次更新主要是给1.2.2擦屁股,解决如下问题:

  • 1.2.2更新的CSRF语句处理非ASCII响应存在问题。
  • 1.2.2更新后部分表单,特别是admin中的用户编辑表单出现问题。
  • 1.2.2打包时包依赖不正确(我汗= =|||)

好吧,下面是更新时间,更新Django请猛击这里,更新文档请猛击这里。更新完了的和不想更新的,洗洗睡吧。

Django 1.2.2 released

Django发布了一个新的安全更新。这次修改主要解决自1.2引入的CSRF防御系统的安全漏洞,新引入的{% csrf_token %}由于对cookie的依赖过于明显,攻击者可以比较容易的通过修改cookie内容达到XSS攻击的目的。

由于这部分功能是在Django 1.2引入的,所以只对trunk和1.2.X版本有影响。如果你正在使用的Django是你hack过的版本,你可以参考changeset13698(for trunk)或者changeset13699(for 1.2)来修改你正在使用的Django。当然,如果没做啥改动,那么还是直接更新成新的release版本1.2.2比较方便了 XD

另外,毕竟这是一次新的release,我把django-doc也更新了一下,有需要的童鞋可以去这个地址下载最新编译好的html文档。

快讯一则:postgresql站点平台将迁徙至Django

Open Source Bridge的PostgreSQL的session里,除了一些关于Postgres 9的消息外,还提到了,Postgres的主页在这一年内将从PHP平台转向Django。这是个好消息,在AMO宣布使用Django之后,又一个我常用的软件项目主页投奔Django怀抱。Django的怀抱雅克西!

另外还有一点,Postgres将对ORM生成的SQL查询进行优化,去掉一些无用的JOIN,这也算是对Django性能的一种提升吧:)

via 来源

在Google Code上建了个django离线文档的项目

,从大义上讲是为了方便群众,从出发点上讲纯粹是为了给自己省点流量…… 刚好看到google code上还没有相应的项目,2G的空间不用就是浪费,所以就建了这么一个项目:django-doc

由于只是纯粹的提供下载而已,我把wiki和source标签都关了,免得看上去空荡荡的…… 以后如果官方文档有更新的话就直接同步到这上面去了,需要的童鞋就直接订阅这个feed吧:)

在Twisted下用MySQL adbapi获取自增id

D jango的ORM有一个很便捷的功能,其实也应该说是一个很基本的功能吧。就是在对一个model调用 save() 插入到数据库后,会将创建的自增id同步到当前model上。SQL中调用 INSERT 默认的返回值是插入的行数,就目前的应用来说,其实是一个没啥意义的返回值,所以Django的ORM能够处理好自增id的同步是一件很让人愉悦的事。

不过没有使用Django,最近用的是Twisted提供的adbapi,如何获取自增id呢?

继续阅读

Django 1.2.1离线文档

上看ga时顺便看了看referring link,发现了一个哲思的link,问的是django 1.2的离线文档问题。怎么生成django的离线文档我在生成一份本地的Django文档一文里面已经说明过了,不过ms有人在生成时还是碰到问题了嘛……

所以热心的我还是立刻做了一份1.2.1的文档,需要的童鞋自取。

Django 1.2.1 released

在对于release后的短期内发布的修正版有着莫名的好感,是以前DM的工作性质致使的么 = =

废话不多说,反正就是1.2.1发布了,童鞋们可以到官方下载页面下载。主要就是一些bug fix,没有新功能,所以能生的赶快生,哦不对,是能升的快升级,还给傻逼织毛衣。

whoosh, django 1.2 released

呼万唤始出来,django 1.2终于发布了。各位心急众可速度前往官方下载页面下 载。至于不心急地,且往下看……

继续阅读