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)
上一篇 2022年5月12日 上午10:20
下一篇 2022年5月12日 上午10:20


相关推荐

  • 三菱modbusRTU通讯实例_PLC编程入门梯形图实例讲解[通俗易懂]

    三菱modbusRTU通讯实例_PLC编程入门梯形图实例讲解[通俗易懂]点击箭头处“工业之家”,选择“关注公众号”!PLC编程入门梯形图实例讲解■上升沿下降沿梯形图解析上升沿:上升沿就是此点从不通到通的过程,在PLC里面表现就是只通一次。举例:如上图,当按钮1未按下的时候按钮1是断开的,此点不通,当按钮1被按下,按钮1导通,上面上升沿指令表示当按钮1按下去后,PLC只通一次,后面不管按钮1是否按下,整条线路都不通。下降沿:下降沿就是此点从通到不通的过程,在…

    2025年10月23日
    4
  • live555源代码概述「建议收藏」

    live555源代码概述「建议收藏」
    live555源代码概述2010年01月29日星期五13:03liveMedia项目(http://www.live555.com/)的源代码包括四个基本的库,各种测试代码以及MediaServer。四个基本的库分别是:UsageEnvironment&TaskScheduler,groupsock,liveMedia和BasicUsageEnvironment。 

    UsageEnvironment和TaskScheduler类用于事件的调度,实现异步读取事件的

    2022年7月16日
    23
  • DRM加密技术是怎么一回事

    DRM加密技术是怎么一回事有时我们在播放从网上下载的影视文件时会要求输入用户许可证 否则就不能正常播放 听说是用了一种 DRM 技术 请简单介绍一下 答 通常这是利用了多媒体 DRM 加密技术保护版权 DRM 是数字权限管理技术的缩写 例如 你将自己拍摄的某个视频文件上传到网上 但只想让获得了许可的朋友才能进行观看 DRM 加密原理 首先需要建立一个数字节目授权中心 相当于许可证发放服务器 例如在服务器上安装和配置中国数字版权

    2026年3月20日
    2
  • 导出文件提示rpc服务器不可用,rpc服务器不可用怎么办 RPC服务器不可用解决方法有哪些…

    导出文件提示rpc服务器不可用,rpc服务器不可用怎么办 RPC服务器不可用解决方法有哪些…rpc 服务器不可用 rpc 服务器不可用怎么办 RPC 服务器不可用解决方法汇集 A 简单方法 通过 控制面板 管理工具 服务 检查一下 RPC 的 RemoteProced RPC 和 RemoteProced RPC Locator 这两项服务的情况 将它们设置为自动启动 如果还不行 看看 DCOMServerPr 这个服务是否已经运行

    2026年3月19日
    2
  • [科普]DLL是什么

    [科普]DLL是什么什么是 DLL 运行某一程序时 该程序的很多功能可能是由 DLL 提供的 例如 某些程序可能包含很多不同的模块 而该程序的每个模块都包含在 DLL 中并从中分发 使用 DLL 有助于促进代码的模块化 代码重用 内存的有效使用和减少所占用的磁盘空间 因此 操作系统和程序能够更快地加载和运行 并且在计算机中占用较少的磁盘空间 DLL 是一个包含可由多个程序同时使用的代码和数据的库 例如 在 Windows 操作系统中 Comdlg32DLL 执行与对话框有关的常见函数 因此 每个程序都可以使用该

    2026年3月17日
    2
  • Claude code 集成到vscode中使用(无需AI中转站)windows系统

    Claude code 集成到vscode中使用(无需AI中转站)windows系统

    2026年3月15日
    2

发表回复

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

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