• 为何get_argument不区分POST与GET?

    没有区分的必要
    服务器君一共花费 17.703 ms 进行了 4 次数据库查询,努力地为您提供了这个页面。
    广告很萌的

    Tornado的get_argument有点类似PHP的$_REQUEST,是不区分GET与POST的。而且Tornado好像是没有PHP里的$_GET,$_POST这样的区分获取get数据与post数据的方法。为什么会这样么?

    URL的query string还是x-www-form-encode的数据可以按key/value方式来解析,其实是一种约定俗成的规矩。甚至表单POST的编码格式都是和GET的query string编码是一样的。CGI的实现中也只用了一套代码来处理。就说两种方法实际上在做同一件事情。

    而同时提供key/value的query string和x-www-form-encode的POST数据,也不违反任何协议和标准。

    其次,通常当你要提交key/value数据的时候,目的是一致的。POST只不过允许你提交更多的数据而已。为什么要混用两套东西呢?

    tornado做的,只不过是提供接口提高最常见场景的编码效率。如果应用场景比较特殊,可以自行解析request.body, request.url,获取原始的数据进行处理。

    从安全角度来说,在Tornado中,一个RequestHandler中,处理GET和POST是两个不同的函数,这是一个很关键的因素。

    对于某些Framework(比如Zend Framework),Model不区分GET和POST方法,换句话说,一个URL Patten不管是通过POST还是GET来访问,处理函数都是同一个,所以Zend的getParam方法就向程序员提供了数据来源的选择。而且这对于Zend Framework程序的安全也是至关重要。

    • 对于GET请求,没什么好说的,因为GET请求的数据来源只有query string一条路,所以指定数据来源是没有意义的。
    • 对于POST请求,XSRF攻击者的确可以将本来应该写在x-www-form-encode里的数据转移到query string里,但是这么做毫无意义。因为这样做会使请求变为get函数来处理。攻击自然会失败。

    所以,Tornado的这种做法是有道理的,而不是简单的为了提高编码效率。毕竟,编码效率的提高也必须建立在保证安全的基础上。

更多 推荐条目

Welcome to NowaMagic Academy!

现代魔法 推荐于 2013-02-27 10:23   

本章最新发布
随机专题
  1. [软件工程与项目管理] 呈现器的布局与绘制 11 个条目
  2. [智力开发与知识管理] 整体性学习步骤 9 个条目
  3. [PHP程序设计] CodeIgniter与PHP框架设计 5 个条目
  4. [JavaScript程序设计] jQuery与表单操作 2 个条目
  5. [Python程序设计] Tornado表单处理 3 个条目
  6. [智力开发与知识管理] 信息的类型与结构 9 个条目
  7. [软件工程与项目管理] 开始使用Git 3 个条目
  8. [移动开发] Android Studio里的Gradle 3 个条目
  9. [移动开发] Android加载器Loaders 5 个条目
  10. [移动开发] Android与SQLite数据库 7 个条目
  11. [移动开发] 刷机与root相关 2 个条目
  12. [移动开发] Android View注入框架Butter Knife 3 个条目
窗口 -- [协会]