zoukankan      html  css  js  c++  java
  • tornado下的跨站请求伪造(防护)

    跨站请求伪造(防护)

      任何Web应用所面临的一个主要安全漏洞是跨站请求伪造,通常被简写为CSRF或XSRF,发音为"sea surf"。这个漏洞利用了浏览器的一个允许恶意攻击者在受害者网站注入脚本使未授权请求代表一个已登录用户的安全漏洞。

      为了防范伪造POST请求,我们会要求每个请求包括一个参数值作为令牌来匹配存储在cookie中的对应值。我们的应用将通过一个cookie头和一个隐藏的HTML表单元素向页面提供令牌。当一个合法页面的表单被提交时,它将包括表单值和已存储的cookie。如果两者匹配,我们的应用认定请求有效。

      由于第三方站点没有访问cookie数据的权限,他们将不能在请求中包含令牌cookie。这有效地防止了不可信网站发送未授权的请求。正如我们看到的,Tornado同样会让这个实现变得简单。

    Tornado中的xsrf

      Tornado内置XSRF保护. 你需要在你的应用设置中使用 xsrf_cookies 便可 以在你的网站上使用:

    settings = {
        "cookie_secret": "__TODO:_GENERATE_YOUR_OWN_RANDOM_VALUE_HERE__",
        "login_url": "/login",
        "xsrf_cookies": True,
    }
    application = tornado.web.Application([
        (r"/", MainHandler),
        (r"/login", LoginHandler),
    ], **settings)
    View Code

      当这个应用标识被设置时,Tornado将拒绝请求参数中不包含正确的_xsrf值的POSTPUTDELETE请求。Tornado将会在幕后处理_xsrf cookies,但你必须在你的HTML表单中包含XSRF令牌以确保授权合法请求。要做到这一点,只需要在你的模板中包含一个xsrf_form_html调用即可:

    <form action="/purchase" method="POST">
        {% raw xsrf_form_html() %}
        <input type="text" name="title" />
        <input type="text" name="quantity" />
        <input type="submit" value="Check Out" />
    </form>
    View Code

    XSRF令牌和AJAX请求

      AJAX请求也需要一个_xsrf参数,但不是必须显式地在渲染页面时包含一个_xsrf值,而是通过脚本在客户端查询浏览器获得cookie值。下面的两个函数透明地添加令牌值给AJAX POST请求。第一个函数通过名字获取cookie,而第二个函数是一个添加_xsrf参数到传递给postJSON函数数据对象的便捷函数。

    function getCookie(name) {
        var c = document.cookie.match("\b" + name + "=([^;]*)\b");
        return c ? c[1] : undefined;
    }
    
    jQuery.postJSON = function(url, data, callback) {
        data._xsrf = getCookie("_xsrf");
        jQuery.ajax({
            url: url,
            data: jQuery.param(data),
            dataType: "json",
            type: "POST",
            success: callback
        });
    }
    View Code

    参考;http://www.cnblogs.com/wupeiqi/articles/5702910.html

    参考:http://docs.pythontab.com/tornado/introduction-to-tornado/ch6.html#ch6-2

    tornado源码分析:http://www.nowamagic.net/academy/detail/13321013

  • 相关阅读:
    微信小程序----map组件实现检索【定位位置】周边的POI
    nginx负载均衡和inotify+rsync文件同步
    mysql主从同步配置和读写分离实现(中间件Amoeba)
    微信小程序----Uncaught ReferenceError: ret is not defined
    微信小程序----wx:key(Now you can provide attr "wx:key" for a "wx:for" to improve performance.)
    回档|NOIP2012 同余方程
    回档|欧几里得算法和扩展欧几里得算法
    回档|Splay tree应用之郁闷的出纳员
    回档|史观小结
    回档|乘积最大
  • 原文地址:https://www.cnblogs.com/freely/p/6759736.html
Copyright © 2011-2022 走看看