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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • SCI期刊Cover Letter写法模板

    SCI期刊Cover Letter写法模板一、写法投稿信(CoverLetter)应该简述所投稿件的核心内容、主要发现和意义,拟投期刊,对稿件处理有无特殊要求等(如“nottoreview”list)。另外,请附上主要作者的中文姓名、通讯地址、电话、传真和e-mail地址。此外有的杂志要求推荐几位审稿人及其联系方式。以及谁已经阅读过该文(当然是牛人)。一般来说,杂志通常要求说明你论文研究的意义,以及与这个杂志的相关性,另外还…

    2022年4月28日
    51
  • 【自考】数据结构导论「建议收藏」

    【自考】数据结构导论「建议收藏」第一遍导图第一章第二.三章第四章第五章第六章第七章 

    2022年8月18日
    6
  • 全球单片机的主要厂商和主要型号介绍图_51单片机包括哪些型号

    全球单片机的主要厂商和主要型号介绍图_51单片机包括哪些型号
    全球单片机的主要厂商和主要型号介绍
    PIC单片机: 
      是MICROCHIP公司的产品,其突出的特点是体积小,功耗低,精简指令集,抗干扰性好,可靠性高,有较强的模拟接口,代码保密性好,大部分芯片有其兼容的FLASH程序存储器的芯片. 
    EMC单片机:
      是台湾义隆公司的产品,有很大一部分与PIC 8位单片机兼容,且相兼容产品的资源相对比PIC的多,价格便宜,有很多系列可选,但抗干扰较差. 
    ATMEL单片机(51单片机):
    ATME

    2022年10月19日
    2
  • c+ explicit_staticint与int的区别

    c+ explicit_staticint与int的区别C++ explicit关键字详解首先, C++中的explicit关键字只能用于修饰只有一个参数的类构造函数, 它的作用是表明该构造函数是显示的, 而非隐式的, 跟它相对应的另一个关键字是implicit, 意思是隐藏的,类构造函数默认情况下即声明为implicit(隐式).那么显示声明的构造函数和隐式声明的有什么区别呢? 我们来看下面的例子:class CxString // 没有使用…

    2022年8月18日
    5
  • 现场校时错乱分析,开启NTP校时延迟分析以及部署建议「建议收藏」

    现场校时错乱分析,开启NTP校时延迟分析以及部署建议「建议收藏」1.问题背景描述2021年7月23日宜春现场出现一台信号机在应该跑早高峰方案的时候,实际上跑了凌晨的方案,从而造成现场车辆拥堵的问题,客户进行了投诉并要求给出解释和解决方案。2.问题排查和分析排查过程中发现宜春现场的校时配置十分混乱。现场存在NTP,GPS,平台校时三种模式同时进行校时的情况。并且现场并不止有一个平台,也就是通过平台校时这个方式的校时源有多种。所以可以得知的是,现场的信号机在较多情况下同时会接受3-5种不同的校时源进行校时。3.同时有多种不同校时源下存在的风险信号机是一个时

    2022年6月18日
    29
  • java实现邮件发送功能_电子邮件是啥

    java实现邮件发送功能_电子邮件是啥我使用sendgrid发送电子邮件,使用以下代码工作正常但它没有附件.packagesendgrid;importcom.sendgrid.Content;importcom.sendgrid.Email;importcom.sendgrid.Mail;importcom.sendgrid.Method;importcom.sendgrid.Request;importcom.sen…

    2025年8月6日
    5

发表回复

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

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