tornado利用check_xsrf_cookie()防止XSRF

tornado利用check_xsrf_cookie()防止XSRFtornado利用check_xsrf_cookie()防止XSRF

大家好,又见面了,我是你们的朋友全栈君。

跨站请求伪造:xsrf或csrf。
tornado开启xsrf_cookies验证。

xsrf_cookies=True

tornado的RequestHandler中的有一个check_xsrf_cookie()方法。它会从请求中获取_xsrf参数,并提供校验。
前端模板中添加{% raw xsrf_form_html() %}。

def xsrf_form_html(self):
    return '<input type="hidden" name="_xsrf" value="' + \
        escape.xhtml_escape(self.xsrf_token) + '"/>'

ajax post,从cookie中获取_xsrf。

function getCookie(name) { 
   
    var r = document.cookie.match("\\b" + name + "=([^;]*)\\b");
    return r ? r[1] : undefined;
}
function set_xsrf(data){ 
   
    var secure_key = getCookie("__xsrf") || "";
    if (isNotEmpty(secure_key)) {
        data["__xsrf"] = secure_key;
    }
    return data;
}
var data = {
  
  'name': 'JianW'};
set_xsrf(data);
$.ajax({
    url : url,
    data : data,
    dataType : "JSON",
    type : "POST",
    async : false,
    success : function(ret) { 
   
        code_list.push(ret.code);
    }
});

后台RequestHandler中check_xsrf_cookie方法。

def check_xsrf_cookie(self):
    token = (self.get_argument("_xsrf", None) or
             self.request.headers.get("X-Xsrftoken") or
             self.request.headers.get("X-Csrftoken"))
    if not token:
        raise HTTPError(403, "'_xsrf' argument missing from POST")
    _, token, _ = self._decode_xsrf_token(token)
    _, expected_token, _ = self._get_raw_xsrf_token()
    if not _time_independent_equals(utf8(token), utf8(expected_token)):
        raise HTTPError(403, "XSRF cookie does not match POST argument")

在__execute()方法中,有如下代码片段。若开启了xsrf_cookies则会来执行之前的check_xsrf_cookie()

# If XSRF cookies are turned on, reject form submissions without
# the proper cookie
if self.request.method not in ("GET", "HEAD", "OPTIONS") and \
        self.application.settings.get("xsrf_cookies"):
    self.check_xsrf_cookie()

可以通过继承Basehandler并重写check_xsrf_cookie(),来对部分请求去除xsrf_cookie防御,如去除/rest开头的请求的校验。

def check_xsrf_cookie(self):
    if not self.request.path.startswith('/rest'):
        ...
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/144374.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • JS数组合并(5种)

    JS数组合并(5种)前言项目过程中,经常会遇到JS数组合并的情况,时常为这个纠结。这里整理一下。简单而实用的for最容易想到的莫过于for了。会变更原数组,当然也可以写成生成新数组的形式。letarr=[1,2]letarr2=[3,4]for(letiinarr2){arr.push(arr2[i])}console.log(arr)//[1,2,3,4]arr.concat(arr2)会生成新的数组。letarr=[1,2]let

    2022年6月30日
    70
  • 深度神经网络总结

    深度神经网络总结深度神经网络(DeepNeuralNetworks,DNN)可以理解为有很多隐藏层的神经网络,又被称为深度前馈网络(DFN),多层感知机(Multi-Layerperceptron,MLP)。1前向传播算法1.1从感知机到神经网络感知机的模型是一个有若干输入和一个输出的模型,如下图:输出和输入之间学习到一个线性关系,得到中间输出结果:接着是一个神经元激活函数,…

    2022年6月15日
    42
  • 紧急求助!配置SMTP插件出错,SMTP connect() failed

    紧急求助!配置SMTP插件出错,SMTP connect() failed

    2021年9月25日
    67
  • c语言中malloc的作用,malloc函数-malloc函数,详解

    c语言中malloc的作用,malloc函数-malloc函数,详解本教程分享:《malloc函数》,c语言malloc函数是什么意义开辟内存。比如int*p;p=(int*)malloc(100*sizeof(int));它开辟100个int单元,即400字节。然后p指向第一个元素。之后也可以用p[0],p[1]malloc函数怎么使用malloc函数怎么使用,具体是什么含义啊,请详细讲解需要包含头文件:#include或#include函数声明(函…

    2022年5月29日
    65
  • CSDN Chrome插件来了。助开发者提升开发效率,远离996

    插件定位帮助开发者提升开发效率,远离996特点以搜索框为入口,集成开发者常用工具,提升开发效率主要功能如下:支持本地书签、tab页、历史记录搜索集成CSDN搜索结果,本地内容和远程结果无缝集成所有操作都支持快捷键,提升搜索效率他是一个时间转换工具他是一个计算器他是。。。,更多功能正在添加中安装下载安装包浏览器输入地址“chrome://extensions/”进入扩展程序页面,开启开发者模式以下操作任选其一:zip文件安装:点击“加载已解压的扩展程序”按钮,选择已解压

    2022年4月8日
    64
  • 北京2018积分落户名单[通俗易懂]

    北京2018积分落户名单[通俗易懂]北京2018积分落户名单已经公示出来了,地址在北京人力和社会保障局官网,共有6019人获得,恭喜他们,最低分为90.75分。Update:2019年的也出来了,详情请见https://blog.csdn.net/minstyrain/article/details/102642906.网站每页只能显示100页的内容,浏览起来很不方便,这里提供完整的excel表格形式的数据,详见百度网盘(…

    2022年10月6日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号