Web 框架与 CSRF 防御

关于 CSRF 的攻击原理和防御方案,在本书“跨站点请求伪造”一章中有所阐述。在 Web 框架中可以使用 security token 解决 CSRF 攻击的问题。

CSRF 攻击的目标,一般都会产生“写数据”操作的 URL,比如“增”、“删”、“改”;而 “读数据”操作并不是 CSRF 攻击的目标,因为在 CSRF 的攻击过程中攻击者无法获取到服务 器端返回的数据,攻击者只是借用户之手触发服务器动作,所以读数据对于 CSRF 来说并无直 接的意义(但是如果同时存在 XSS 漏洞或者其他的跨域漏洞,则可能会引起别的问题,在这 里,仅仅就 CSRF 对抗本身进行讨论)。

因此,在 Web 应用开发中,有必要对“读操作”和“写操作”予以区分,比如要求所有的 “写操作”都使用 HTTP POST。

在很多讲述 CSRF 防御的文章中,都要求使用 HTTP POST 进行防御,但实际上 POST 本 身并不足以对抗 CSRF,因为 POST 也是可以自动提交的。但是 POST 的使用,对于保护 token 有着积极的意义,而 security token 的私密性(不可预测性原则),是防御 CSRF 攻击的基础。

对于 Web 框架来说,可以自动地在所有涉及 POST 的代码中添加 token,这些地方包括所 有的 form 表单、所有的 Ajax POST 请求等。

完整的 CSRF 防御方案,对于 Web 框架来说有以下几处地方需要改动。

(1)在 Session 中绑定 token。如果不能保存到服务器端 Session 中,则可以替代为保存到 Cookie 里。

(2)在 form 表单中自动填入 token 字段,比如 。

(3)在 Ajax 请求中自动添加 token,这可能需要已有的 Ajax 封装实现的支持。

(4)在服务器端对比 POST 提交参数的 token 与 Session 中绑定的 token 是否一致,以验证 CSRF 攻击。

在 Rails 中,要做到这一切非常简单,只需要在 Application Controller 中增加一行即可:

protect_from_forgery :secret => "123456789012345678901234567890..."

它将根据 secret 和服务器端的随机因子自动生成 token,并自动添加到所有 form 和由 Rails 生成的 Ajax 请求中。通过框架实现的这一功能大大简化了程序员的开发工作。

在 Django 中也有类似的功能,但是配置稍微要复杂点。

首先,将 django.middleware.csrf.CsrfViewMiddleware 添加到 MIDDLEWARE_CLASSES 中。

('django.middleware.common.CommonMiddleware', 
 'django.contrib.sessions.middleware.SessionMiddleware', 
 'django.middleware.csrf.CsrfViewMiddleware', 
 'django.contrib.auth.middleware.AuthenticationMiddleware', 
 'django.contrib.messages.middleware.MessageMiddleware',) 

然后,在 form 表单的模板中添加 token。

<form action="." method="post">{% csrf_token %} 

接下来,确认在 View 层的函数中使用了 django.core.context_processors.csrf,如果使用的是 RequestContext,则默认已经使用了,否则需要手动添加。

from django.core.context_processors import csrf 
from django.shortcuts import render_to_response 
 
def my_view(request): 
 c = {} 
 c.update(csrf(request)) 
 # ... view code here 
 return render_to_response("a_template.html", c) 

这样就配置成功了,可以享受 CSRF 防御的效果了。

在 Ajax 请求中,一般是插入一个包含了 token 的 HTTP 头,使用 HTTP 头是为了防止 token 泄密,因为一般的 JavaScript 无法获取到 HTTP 头的信息,但是在存在一些跨域漏洞时可能会 出现例外。

下面是一个在 Ajax 中添加自定义 token 的例子。

$(document).ajaxSend(function(event, xhr, settings) { 
 function getCookie(name) { 
 var cookieValue = null; 
 if (document.cookie && document.cookie != '') { 
 var cookies = document.cookie.split(';'); 
 for (var i = 0; i < cookies.length; i++) { 
 var cookie = jQuery.trim(cookies[i]); 
 // Does this cookie string begin with the name we want? 
 if (cookie.substring(0, name.length + 1) == (name + '=')) { 
 cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); 
 break; 
 } 
 } 
 } 
 return cookieValue; 
 } 
 function sameOrigin(url) { 
 // url could be relative or scheme relative or absolute 
 var host = document.location.host; // host + port 
 var protocol = document.location.protocol; 
 var sr_origin = '//' + host; 
 var origin = protocol + sr_origin; 
 // Allow absolute or scheme relative URLs to same origin 
 return (url == origin || url.slice(0, origin.length + 1) == origin + '/') || 
 (url == sr_origin || url.slice(0, sr_origin.length + 1) == sr_origin + '/') || 
 // or any other URL that isn't scheme relative or absolute i.e relative. 
 !(/^(\/\/|http:|https:).*/.test(url)); 
 }
function safeMethod(method) { 
 return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method)); 
 } 
 
 if (!safeMethod(settings.type) && sameOrigin(settings.url)) { 
 xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken')); 
 } 
}); 

在 Spring MVC 以及一些其他的流行 Web 框架中,并没有直接提供针对 CSRF 的保护,因 此这些功能需要自己实现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/736931.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SQL找出所有员工当前薪水salary情况

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文章男女通用&#xff0c;看懂了就去分享给你的码吧。 描述 有一个薪水表…

康奈尔大学之论文审稿模型Reviewer2及我司七月对其的实现(含PeerRead)

前言 自从我司于23年7月开始涉足论文审稿领域之后「截止到24年6月份&#xff0c;我司的七月论文审稿GPT已经迭代到了第五版&#xff0c;详见此文的8.1 七月论文审稿GPT(从第1版到第5版)」&#xff0c;在业界的影响力越来越大&#xff0c;所以身边朋友如发现业界有相似的工作&a…

示例:推荐一个应用Adorner做的通知和提示消息对话框

一、目的&#xff1a;在开发过程中&#xff0c;增加一些提示消息可以很好的提高用户体验&#xff0c;下面介绍一个用于增加提示消息的库 二、效果如下 可以看到右侧顶端弹出提示消息&#xff0c;消息间隔3s自动退出 三、环境 VS2022 Net7 四、使用方式 安装nuget包&#xff…

SLAM Paper Reading和代码解析

最近对VINS、LIO-SAM等重新进行了Paper Reading和代码解析。这两篇paper和代码大约在三年前就读过&#xff0c;如今重新读起来&#xff0c;仍觉得十分经典&#xff0c;对SLAM算法研发具有十分重要的借鉴和指导意义。重新来读&#xff0c;对其中的一些关键计算过程也获得了更新清…

【QT】

通信服务端实现 widget.h文件 #ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include <QTcpServer>//服务器类 #include <QMessageBox>//消息 #include <QTcpServer> #include <QList> #include <QTcpSocket> QT_BEGIN_NAMESPAC…

一、企业级架构设计-archimate基础概念

目录 一、标准 二、实现工具 1、Archimate 1、Archimate 基本概念 1、通用元模型 2、结构关系 3、依赖关系 1、服务关系 2、访问关系 3、影响关系 1、影响方式 2、概念 3、关系线 4、案例 4、关联关系 4、动态、节点和其他关系 1、时间或因果关系 2、信息流 …

JavaScript的学习之旅之初始JS

目录 一、认识三个常见的js代码 二、js写入的第二种方式 三、js里内外部文件 一、认识三个常见的js代码 <script>//写入js位置的第一个地方// 控制浏览器弹出一个警告框alert("这是一个警告");// 在计算机页面输入一个内容&#xff08;写入body中&#xff…

运算放大器(运放)低通滤波反相放大器电路和积分器电路

低通滤波反相放大器电路 运放积分器电路请访问下行链接 运算放大器(运放)积分器电路 设计目标 输入ViMin输入ViMax输出VoMin输出VoMaxBW&#xff1a;fp电源Vee电源Vcc–0.1V0.1V–2V2V2kHz–2.5V2.5V 设计说明 这款可调式低通反相放大器电路可将信号电平放大 26dB 或 20V/…

关于电机PWM到达50%以后才会启动的问题解决

问题描述&#xff1a; 基于野火电机F407骄阳开发板&#xff0c; 利用例程&#xff0c;有刷直流电机按键控制 电驱&#xff1a;TB6612模块 电机&#xff1a;某直流减速有刷电机 发现PWM 到达50%之后 电机 才会开始旋转 。前50%电机不旋转 问题解决分析与过程&#xf…

Ocam:高效录屏,屏幕录制最佳?

名人说&#xff1a;&#xff1a;一点浩然气&#xff0c;千里快哉风。 ——苏轼 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 一、软件介绍1、Ocam2、核心特点 二、下载安装1、下载2、安装 三、使用方法 很高兴你…

Node.js 系列之 Express 框架入门实战教程

目录 1 Node.js是什么2 Express初体验3 Express 路由3.1 什么是路由3.2 路由的使用3.3 获取路由参数 4 常见响应设置4.1 express 响应方法4.2 原生响应方法 5 express 中间件5.1 中间件作用5.2 中间件类型5.3 全局中间件5.4 路由中间件 6 获取请求体数据7 路由模块化 1 Node.js…

【LocalAI】(13):LocalAI最新版本支持Stable diffusion 3,20亿参数图像更加细腻了,可以继续研究下

最新版本v2.17.1 https://github.com/mudler/LocalAI/releases Stable diffusion 3 You can use Stable diffusion 3 by installing the model in the gallery (stable-diffusion-3-medium) or by placing this YAML file in the model folder: Stable Diffusion 3 Medium 正…

Android AOSP 6(1)

mkdir android-6.0.1_r72 cd android-6.0.1_r72 2.下载相应版本的源码 先查询设备支持的版本&#xff0c;你要下载那个版本的源码&#xff0c;科学上网查看source.android.com/source/buil…。表格如下格式&#xff0c;查询对应设备的相应分支。 BuildBranchVersionSupporte…

Python与Java实现SM2互调

文章目录 一、项目背景二、环境极其依赖三、具体功能1.Python生成密钥对2.java生成密钥对3.Python加签验签4.java加签验签 四、遇到的问题五、解决方案 一、项目背景 Python对接Java接口互相SM2加签验签 二、环境极其依赖 python环境 pip3 install gmssljava环境 <depen…

字符串根据给定关键词进行高亮显示

问题 一般使用搜索引擎的时候我们会发现,搜索出来的内容都对我们搜索的关键词进行了高亮显示, 这样我们能很直观的看出是不是我们想要的结果, 最近我也遇到了类似的功能, 因为关于舆情的系统使用到了ES, 一开始心想ES本身就有支持的API实现起来不难, 但我这里的需求还不太一样…

2023-2024 学年第二学期小学数学六年级期末质量检测模拟(制作:王胤皓)(90分钟)

word效果预览&#xff1a; 一、我会填 1. 1.\hspace{0.5em} 1. 一个多位数&#xff0c;亿位上是次小的素数&#xff0c;千位上是最小的质数的立方&#xff0c;十万位是 10 10 10 和 15 15 15 的最大公约数&#xff0c;万位是最小的合数&#xff0c;十位上的数既不是质数也…

【Kubernetes】集群学习

常见的 Kubernetes 集群类型 Kubernetes 集群可以根据不同的标准进行分类&#xff0c;但通常我们根据其部署环境和用途来区分集群类型。以下是几种常见的 Kubernetes 集群类型&#xff1a; 开发集群&#xff08;Development Cluster&#xff09;&#xff1a; 用于开发和测试环…

Linux 特殊变量 $?

一. 说明 在 Linux 和其他类 Unix 系统中&#xff0c;$? 是一个特殊的变量&#xff0c;用于获取上一个命令的退出状态码。 退出状态码是一个整数值&#xff0c;通常用来表示命令的执行结果。 ⏹退出状态码的含义 0&#xff1a;命令成功执行。0以外的数字&#xff1a;命令执…

上市公司澄清公告数据库(2001-2023)

数据来源&#xff1a;中国上市公司澄清公告数据来自深交所上市公司公告板块https://www.szse.cn/disclosure/listed/notice/index.html、上交所上市公司公告板块https://www.sse.com.cn/disclosure/listedinfo/announcement/和部分受上市公司委托发布的财经媒体如新浪财经、东方…

一小时搞定Git(含盖IDEA使用)

文章目录 1. git基本概念1.1版本控制1.1.1 版本控制软件 2. 命令的使用2.1 Linux命令2.2 git基础指令2.2.1 设置用户2.2.2 初始化本地仓库2.2.3 查看本地仓库状态2.2.4 添加暂存区域2.2.5 提交本地库2.2.6 切换版本 2.3 分支操作2.3.1 分支基本操作2.3.2 合并操作2.3.4 分支开发…