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文档。

Python解析巨型XML

久没有更新博客了吧,主要是最近比较忙,到了新的环境需要学习的东西还挺多的,像我这么好学的人当然就一心扑在学习进步的道路上了。不过既然我都登上来了,那就写写最近碰到的一个case吧。

事情是需要处理一个客户提供的数据源,格式是xml。要说处理xml,在Python的世界里首先还是会先想到lxml吧。不过这次的情况有点特殊,这个xml的大小比较bt,gzip压缩后大小1.9G,未压缩状态11G…… 所以,通常用lxml建立element tree的方法是不行了。这点本人已亲身尝试,本以为服务器16G的内存应该够用,结果从开始时内存就迅速飙升,最后悲剧,本人向System Administrator掩面表示很傻很天真。

继续阅读

能够检测质数的正则表达式

天看到一个有趣的正则表达式,是用来判断一个数是否为质数。说到这儿肯定有人犯迷糊了,正则是用来匹配字符串的呀,怎么可以用来验证数字呢? 别急嘛,首先我们得做一个转换,把数字转换成字符。假定需要验证的数字是N,转换的基本字符为1,那么转换出来的字符串就是N个1。这个用Python是挺容易实现的,只需要'1'*N就可以了。

继续阅读

开始使用Virtualenv

次重装完系统以后,我都得折腾好长时间,要更新配置文件,要用新版本的软件,要试用新的工具。毕竟这会儿捣鼓东西是最方便的,折腾得无法挽回时大不了再重装呗……

这次将系统升级到Snow Leopard,折腾了良久,终于轮到捣鼓Python环境了。这回要对Python包进行一下管理了。项目多了,难免会有某些包的依赖关系不一致的情况,如果还和以前那样全部安装到同一个site目录的话,问题还是满大的。最理想的情况是,在系统的site目录里,只装一些基本常用的包,然后各个项目使用定制的运行环境。这个需求其实挺好实现的,因为我们有Virtualenv!

继续阅读

用Python连接SQLServer

吧,虽然我目前是一个pg党,但是有的时候这个数据库的选择不是我说了算的,最近就碰到需要连接SQLServer的情况。

由于是linux的环境,网上搜刮了一下,找到了pymssql。安装甚是方便,前提是已经安装了freetds和Cython。另外提一下,freetds需要加上mssql的支持,在macport下就是:

%% sudo port install freetds +mssql

至于ArchLinux,默认就已经把这个选项加进去了:P

继续阅读

django 1.2 发布日程 Updated 7

续跟踪报道Django 1.2的发布情况。在官方blog最新博文中提到,现在RC在代码方面只剩下2个ticket。解决思路已经清晰,只差花时间来草割它们了。

所以,暂定五月三日发布RC,在RC之后,抓紧处理关于文档和翻译的48个ticket,五月十日左右应该能发布最终版本了。当然,发言人相当保守,声称可能会晚个一两天,不过咱都理解,是吧XD

自定义twistd plugin的log格式

近学习twisted,从最初的直接调用reactor,到twisted app,最后到twisted plugin,一路用下来感觉还是挺顺手的。不过有一个问题挺郁闷的,就是没弄清楚怎么自定义输出的log格式。

我的需求应该还是挺简单的:

  1. 输出如同 20|YY-DD-MM HH:mm:ss|Foo service starting 这样的log格式,前面的数值和 logging 里面的相应log level对应
  2. 可以根据运行时的设置忽略某些level的消息

由于咋一眼没在文档里找到自定义的方法,便Google了一阵子,可只找到在maillist里有人和我有同样的需求,解决办法却没有见到……

继续阅读