网站首页学无止境PYTHON

python框架Tornado之二Tornado 攻略(5) 跨站伪造请求的防范

发布时间:2014-07-25 17:20:50编辑:songlin阅读(97)

    跨站伪造请求的防范

    跨站伪造请求(Cross-site request forgery), 简称为 XSRF,是个性化 Web 应用中常见的一个安全问题。前面的链接也详细讲述了 XSRF 攻击的实现方式。

    当前防范 XSRF 的一种通用的方法,是对每一个用户都记录一个无法预知的 cookie 数据,然后要求所有提交的请求中都必须带有这个 cookie 数据。如果此数据不匹配 ,那么这个请求就可能是被伪造的。

    Tornado 有内建的 XSRF 的防范机制,要使用此机制,你需要在应用配置中加上 xsrf_cookies 设定:
     

    1. settings = { 
    2.     "cookie_secret""61oETzKXQAGaYdkL5gEmGeJJFuYh7EQnp2XdTP1o/Vo="
    3.     "login_url""/login"
    4.     "xsrf_cookies"True
    5. application = tornado.web.Application([ 
    6.     (r"/", MainHandler), 
    7.     (r"/login", LoginHandler), 
    8. ], **settings) 

    如果设置了 xsrf_cookies,那么 Tornado 的 Web 应用将对所有用户设置一个 _xsrf 的 cookie 值,如果 POST PUTDELET 请求中没有这 个 cookie 值,那么这个请求会被直接拒绝。如果你开启了这个机制,那么在所有 被提交的表单中,你都需要加上一个域来提供这个值。你可以通过在模板中使用 专门的函数 xsrf_form_html() 来做到这一点:
     

    1. <form action="/new_message" method="post">
    2.   {{ xsrf_form_html() }} 
    3.   <input type="text" name="message"/>
    4.   <input type="submit" value="Post"/>
    5. </form>

    如果你提交的是 AJAX 的 POST 请求,你还是需要在每一个请求中通过脚本添加上 _xsrf 这个值。下面是在 FriendFeed 中的 AJAX 的 POST 请求,使用了 jQuery 函数来为所有请求组东添加 _xsrf 值:
     

    1. function getCookie(name) { 
    2.     var r = document.cookie.match("\\b" + name + "=([^;]*)\\b"); 
    3.     return r ? r[1] : undefined; 
    4.  
    5. jQuery.postJSON = function(url, args, callback) { 
    6.     args._xsrf = getCookie("_xsrf"); 
    7.     $.ajax({url: url, data: $.param(args), dataType: "text", type: "POST"
    8.         success: function(response) { 
    9.         callback(eval("(" + response + ")")); 
    10.     }}); 
    11. }; 

    对于 PUT 和 DELETE 请求(以及不使用将 form 内容作为参数的 POST 请求) 来说,你也可以在 HTTP 头中以 X-XSRFToken 这个参数传递 XSRF token。

    如果你需要针对每一个请求处理器定制 XSRF 行为,你可以重写 RequestHandler.check_xsrf_cookie()。例如你需要使用一个不支持 cookie 的 API, 你可以通过将 check_xsrf_cookie() 函数设空来禁用 XSRF 保护机制。然而如果 你需要同时支持 cookie 和非 cookie 认证方式,那么只要当前请求是通过 cookie 进行认证的,你就应该对其使用 XSRF 保护机制,这一点至关重要。

本文来源地址:http://sebug.net/paper/books/tornado/