CSRF令牌解析:保护web应用免受攻击

背景介绍

跨站请求伪造(CSRF)是一种广泛存在的网站攻击手段。与另一常见的攻击手段XSS(跨站脚本攻击)相比,CSRF并不试图窃取用户的数据,而是欺骗用户执行未授权的操作。这种攻击方式利用了Web应用中用户会话的一个漏洞,让攻击者可以伪装成信任的用户来执行某些操作。考虑一下,如果你不小心点击了一个恶意链接,那么你可能会在不知情的情况下执行了一些不应该执行的操作,例如转账、更改密码等。

简单解释

CSRF令牌(Token)是一种防御CSRF攻击的一种策略。令牌是一个随机生成的字符串,通常用户会话中与用户关联。当用户执行敏感操作时,服务器将检查请求中的令牌是否与会话中的令牌匹配。只有当令牌匹配时,服务器才会处理该请求。

想象一下,这就像一个特别的密码或印章,每次执行敏感操作时都需要提供。由于攻击者无法访问或预测这个令牌,因此他们无法伪装成用户来执行未授权的操作。

这里,CSRF令牌和门禁卡的作用有些相似。你可以进入大楼,因为你有正确的门禁卡,而没有门禁卡的人则无法进入。同样,服务器也可以通过检查CSRF令牌来设别和允许合法的请求,而拒绝非法请求。

详细示例

让我们通过一个具体的编程示例来深入了解CSRF令牌的工作原理。在这个示例中,我们将使用一个基本的Web应用,用户可以通过表单更改其个人信息。我们将使用CSRF令牌来确保只有合法用户可以更改信息。

示例:个人信息更新表单

1、生成和存储CSRF令牌

当用户登录后,服务器将生成一个随机的CSRF令牌,并将其存储在用户的会话中。

import secretsdef generate_csrf_token(session):token = secrets.token_hex(16)session['csrf_token'] = tokenreturn token

2、嵌入CSRF令牌到表单中

在渲染表单的HTML时,将CSRF令牌作为隐藏字段嵌入。

<form action="/update-profile" method="post"><input type="hidden" name="csrf_token" value="{{ csrf_token }}"><!-- 其他表单字段 --><input type="text" name="email" placeholder="Email"><input type="submit" value="Update">
</form>

3、验证CSRF令牌

当用户提交表单时,服务器将验证请求中的CSRF令牌与会话中存储的令牌是否匹配。

from flask import request, session, abort@app.route('/update-profile', methods=['POST'])
def update_profile():submitted_token = request.form['csrf_token']stored_token = session.get('csrf_token')if submitted_token != stored_token:abort(403)  # 拒绝请求# 更新用户个人信息# ...

对比:使用和不使用CSRF令牌

在没有CSRF令牌的情况下,攻击者可能会创建一个伪造的表单,诱导用户提交,从而更改用户信息。但是,有了CSRF令牌,攻击者无法知道正确的令牌值,因此无法创建有效的伪造请求。

总结

在这个具体示例中,我们通过生成、嵌入和验证CSRF令牌,确保了只有合法用户才能更改个人信息。这个机制为Web应用提供了一层额外的安全保护,就像一位严肃的保安拦截了没有邀请函的不速之客一样。

CSRF攻击不是诱导用户点击链接吗,这个链接不能获取令牌值吗

确实CSRF攻击通常是通过诱导用户点击链接来执行。但是,即使攻击者能够诱使用户点击链接,他们仍然无法获取CSRF令牌值。下面是原因:

1、令牌的用户特异性:CSRF令牌是针对特定用户会话生成的。攻击者可以创建一个伪造的请求链接,但他们无法获取目标用户的会话中的令牌值。

2、令牌嵌入在表单中:令牌通常嵌入在HTML表单的隐藏字段中。即使攻击者能在用户的浏览器中运行代码,他们也无法从其他站点读取数据,包括隐藏的CSRF令牌。

4、攻击者无法控制请求体:在典型的CSRF攻击中,攻击者可以诱导用户发起请求,但他们无法控制或访问请求体的内容。由于CSRF令牌通常作为POST请求的一部分发送,攻击者无法通过修改URL来影响它。

示例

考虑一个攻击者尝试伪造银行转账的情况。他们可以创建一个链接,看起来像是银行的转账URL,并尝试诱导用户点击。但是,除非该链接包括正确的CSRF令牌,否则银行的服务器将拒绝请求。

攻击者无法从银行网站获取令牌,因为他们无法访问目标用户的会话或浏览器中的表单内容。因此,尽管他们可以创建看似合法的链接,他们无法创建一个包含有效CSRF令牌的有效请求。

总结

CSRF令牌是一种有效的防御机制,因为它确保了只有合法的、与用户会话关联的请求才会被接受。攻击者虽然可以尝试伪造请求,但他们无法访问或使用目标用户的令牌,因此无法成功执行攻击。

python的secrets库是什么?

Python的 secrets库是用于生成密码强度高的随机数,特别适用于密码、令牌、验证码等安全场景。与 random库相比,secrets库更适合安全敏感的应用,因为它使用了更强的随机数生成器,更难以预测。

secrets.token_hex 是什么?

secrets.token_hex 是Python的 secrets 库中的一个函数,用于生成随机的十六进制令牌。该函数的主要用途是创建安全敏感的随机值,例如在CSRF保护或其他安全机制中使用的令牌。

示例:

import secretstoken = secrets.token_hex(16)  # 生成32个字符的十六进制字符串

 

flask 中的 abort 是什么?

在Flask中,abort 函数用于立即停止视图函数的执行,并可以抛出一个HTTP异常。通常用于当发现错误或非法请求时立即中止处理。

示例:

from flask import abort@app.route('/restricted')
def restricted_view():if not user_is_authenticated:abort(403)  # 发送一个403 Forbidden响应return 'Welcome to the restricted page!'

flask 中的 @app.route 是什么?

在Flask中,@app.route 是一个装饰器,用于将URL路由绑定到特定的视图函数。这意味着当用户访问与该路由匹配的URL时,将调用相应的视图函数。

@app.route('/hello')
def hello_world():return 'Hello, World!'

当用户访问 /hello URL时,将调用 hello_world 函数,并显示 "Hello, World!"。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】进程间通信1——管道概念,匿名管道

1.进程间通信介绍 进程是计算机系统分配资源的最小单位&#xff08;严格说来是线程&#xff09;。每个进程都有自己的一部分独立的系统资源&#xff0c;彼此是隔离的。为了能使不同的进程互相访问资源并进行协调工作&#xff0c;才有了进程间通信。 进程间通信&#xff0c;顾名…

如何利用 TypeScript 的判别联合类型提升错误处理与代码安全性

欢迎回到 TypeScript 高级技巧系列文章。我们之前已经讨论了Extract、Exclude和Indexed Access Types&#xff0c;接下来我们将深入探讨我最喜欢的TypeScript特性之一&#xff1a;判别联合类型&#xff08;Discriminated Unions&#xff09;。为什么我如此钟爱它呢&#xff1f;…

毛胚房需要验收吗

雅静说毛环房验收避坑指南,毛胚房需要验收吗?      那要不以后出了问题,你都签了字了,谁还管你      所以咱们毛胚房拿到手,先别签字,急着装修,      一定要先验房,收藏着,不然后续容易吃亏      1,先看看门窗,看入户门推拉是否顺滑      有无划痕,有没有…

【ROS里程计】中部分代码解释

bool OdomNodePub::Odom_Reset(ubt_odom::odomreset::Request& req, ubt_odom::odomreset::Response& res) {if(req.cmd "reset"){OdomResetFlag true;}else{OdomResetFlag false;}res.state "success";return true; } 该函数是一个ROS节点中…

【Mybatis-Plus】根据自定义注解实现自动加解密

背景 我们把数据存到数据库的时候&#xff0c;有些敏感字段是需要加密的&#xff0c;从数据库查出来再进行解密。如果存在多张表或者多个地方需要对部分字段进行加解密操作&#xff0c;每个地方都手写一次加解密的动作&#xff0c;显然不是最好的选择。如果我们使用的是Mybati…

学习vite的核心原理

Vite主要由两个部分组成 开发服务器 基于原生ES模块&#xff08;ESM&#xff09;提供开发环境支持。提供了丰富的内建功能&#xff0c;如速度快到惊人的模块热更新&#xff08;HMR&#xff09;。这意味着开发者在修改代码时&#xff0c;可以实时地看到更新效果&#xff0c;而…

边缘微型AI的宿主?—— RISC-V芯片

一、RISC-V技术 RISC-V&#xff08;发音为 "risk-five"&#xff09;是一种基于精简指令集计算&#xff08;RISC&#xff09;原则的开放源代码指令集架构&#xff08;ISA&#xff09;。它由加州大学伯克利分校在2010年首次发布&#xff0c;并迅速获得了全球学术界和工…

嵌入式门槛高不高,工资怎么样?

一般来说&#xff0c;嵌入式岗位的准入门槛其实并不是特别高。通常情况下&#xff0c;只要能够熟练掌握 C 语言编程以及单片机相关知识&#xff0c;就能够去制作一些较为简单的电子产品&#xff0c;由此可见其门槛相对而言是比较低的&#xff0c;相应的薪水可能也不会特别高。 …

数据库-数据定义和操纵-初始MySQL数据库

连接数据库&#xff1a; mysql -u用户名 -p密码 创建数据库&#xff1a; create database 数据库名; 命令查看MySQL中已存在的数据库 show database; 数据库中创建表的规则&#xff1a; CREATE TABLE 表名 (字段名,数据类型,字段名,数据类型,..... ) eg: 首先创建数据库&am…

速盾:cdn影响seo吗?

CDN (Content Delivery Network) 是一个分布式网络架构&#xff0c;用于在全球范围内加速网站内容的传输和分发。它通过将网站的静态资源&#xff08;例如图片、CSS、JavaScript 文件等&#xff09;存储在多个服务器上&#xff0c;使用户可以从最接近他们位置的服务器上获取这些…

计算机专业:黄金时代是否依旧?

计算机专业&#xff1a;黄金时代是否依旧&#xff1f; 随着2024年高考落幕&#xff0c;数百万高三学生将面临人生中的重要抉择&#xff1a;选择大学专业。在这个关键节点&#xff0c;计算机相关专业是否仍是“万金油”的选择&#xff1f;在过去的几十年里&#xff0c;计算机科…

LC1091:二进制矩阵中的最短路径

1091 二进制矩阵中的最短路径 这道题做起来还挺顺利的&#xff0c;挺常见的套路求最短路径&#xff0c;因为做的时候没有卡住就做完了&#xff0c;不过要注意特殊用例的判断&#xff0c;以下是AC代码&#xff1a; class Solution {// Dimensions of the gridint n, m; ​// I…

资治通鉴(二)

今天是6月15日&#xff0c;大约两个月的时间里我看完了《资治通鉴&#xff08;二&#xff09;》&#xff0c;回顾一下这本书主要讲了哪些帝王的故事。 汉武帝刘彻&#xff0c;公元前141年至前87年在位54年&#xff0c;他加强了中央集权&#xff0c;尊崇儒术&#xff0c;开创了丝…

AI Agents 的五个级别

原文地址:https://cobusgreyling.medium.com/five-levels-of-ai-agents-5ac39a7b07ed AI Agents 被定义为能够感知环境、做出决策并根据可用工具采取行动的人工实体。 2024 年 5 月 16 日 介绍 这是我非常喜欢研究的一个主题,我很期待写这篇文章。主要是因为我想揭开代理的概…

fetch_lfw_people()报错urllib.error.HTTPError: HTTP Error 403: Forbidden的解决方案

零、实验报告地址 计算机视觉实验二:基于支持向量机和随机森林的分类(Part one: 编程实现基于支持向量机的人脸识别分类 )-CSDN博客 一、代码报错 fetch_lfw_people()报错urllib.error.HTTPError: HTTP Error 403: Forbidden 二、报错原因 通常是由于访问权限不足导致的…

Mysql中索引详解

1、什么是索引 在日常学习中&#xff0c;最常见使用索引的例子就是词典&#xff0c;通过对字母进行排序&#xff0c;并设置对应的页数&#xff0c;从而循序定位某个单词&#xff0c;除了词典&#xff0c;如火车站的车次表、图书的目录等都是使用了索引。它们的原理都是一样的&…

C++11参数包...Args

以list中的包装器做介绍 包装器是由一个类模板接收后存储在统一的...Args中 标准格式 说明&#xff1a;...Args就是参数包的类型 实例&#xff1a; //参数包 void Show() {cout <<"结束" << endl; }template<class T,class ...Args> void Show(T…

RocketMq多环境自动隔离

一、多环境隔离场景 当多个环境使用同一套rocketmq的服务的时候&#xff0c;如果不对环境进行隔离&#xff0c;将会导致消息被错误的环境消费&#xff0c;因此可以采用两种方式进行隔离。 方式1 通过$Value注入&#xff0c;但是这个需要每个环境都维护自己的topic等信…

LabVIEW与C#的区别及重新开发自动测试程序的可行性分析

LabVIEW和C#是两种广泛使用的编程语言&#xff0c;各自有不同的应用领域和特点。本文将详细比较LabVIEW与C#在自动测试程序开发中的区别&#xff0c;并分析将已完成的LabVIEW自动测试程序重新用C#开发的合理性。本文帮助评估这种转换的必要性和潜在影响。 LabVIEW与C#的区别 开…

C++编程:vector容器的简单模拟实现

前言&#xff1a; 在C标准库&#xff08;STL&#xff09;中&#xff0c;vector容器是最常见使用的动态数组。它结合了链表与数组的优点&#xff0c;提供了灵活的大小调整与高效的随机访问。本文将简单的对vector容器进行介绍并且对vector容器简单的模拟实现。 一、vector的文…