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


相关推荐

  • 无效的token怎么解决_登录token

    无效的token怎么解决_登录token解决无效token的方法在调用API接口时遇到了无效token的问题,网上搜了一大圈还以为是token时效的问题,最后发现是给需要授权的API,必须在请求头中使用Authorization字段提供token令牌。需要在main.js文件里添加axios拦截器axios.interceptors.request.use(config=>{console.log(config);config.headers.Authorization=window.sessionSt

    2025年11月7日
    3
  • python动力学_用python学振动分析(一)

    python动力学_用python学振动分析(一)因为最近需要重新用到pytorch,而且在颤振分析时遇到一些不理解的问题,所以用python重新学习了振动分析(程序太长就不放这里了,回头整理下放github算了),准备自己手撸一个时域结构动力学仿真程序。结构动力学基础噪音来自部分振动能量在空气中发散,故噪音和振动问题的研究方向是一致的,而振动问题的研究基础是结构动力学。静力学研究在定力作用下的位移,基础是外驱力和静刚度引起的回弹力的平衡,动力学…

    2022年10月16日
    4
  • 01-全文检索

    01-全文检索

    2021年7月12日
    96
  • CAS认证失败「建议收藏」

    CAS认证失败「建议收藏」如果是配置域名的,CAS这个服务器要能够ping得通这个域名

    2022年6月18日
    49
  • 多线程(二)—-线程的启动方式(一)

    多线程(二)—-线程的启动方式(一)

    2020年11月12日
    192
  • Dataset之COCO数据集:COCO数据集的简介、下载、使用方法之详细攻略

    Dataset之COCO数据集:COCO数据集的简介、下载、使用方法之详细攻略Dataset之COCO数据集:COCO数据集的简介、安装、使用方法之详细攻略目录COCO数据集的简介0、COCO数据集的80个类别—YoloV3算法采用的数据集1、COCO数据集的意义2、COCO数据集的特点3、数据集的大小和版本COCO数据集的下载1、2014年数据集的下载2、2017的数据集的下载COCO数据集的使用方法1、基础用…

    2022年10月17日
    2

发表回复

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

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