当前位置: 首页 > news >正文

避免CSRF攻击的方案

CSRF攻击的方式

恶意网站发送对感兴趣网站的请求(或者正常网站发送恶意请求,但一般正常网站不可能这么做),显然,这肯定属于跨域请求了。

解决思路

跨域角度

首先,对跨域行为进行限制:

  • 限制cookie
    • 禁止第三方网站的cookie被携带:跨域请求时,不允许携带cookie。通过SameSite属性为strict来设置。
    • 限制cookie的作用范围:避免造成更大范围的攻击。
  • ajax请求:严格限制ajax请求的跨域白名单,并且服务端严格区分HTTP请求的动词,因为浏览器并不会阻止ajax的GET请求发出,服务端是可以处理跨域ajax的GET请求(以及OPTIONS、HEAD等),所以如果允许跨域ajax,则最多允许OPTIONS、HEAD、GET方法
  • 检查referrer首部

针对CSRF的方式

表单使用脚本自动提交

使用表单让脚本自动提交的方式可以进行CSRF攻击

form method="POST" action="https://www.a.com/update" enctype="multipart/form-data"> <input type="hidden" name="hello" value="update state"/> .....<input type="hidden" name="attack" value="csrf attack"/> 
</form> 
<script> document.forms[0].submit();
</script>
  • 只使用JSON API:避免application/x-www-form-urlencoded的form提交
  • 避免使用POST请求:该form提交只能使用GET或者POST
  • 不要对form表单进行方法重写:不要将form的POST请求重写为PUT、DELETE等
使用CSRF token进行请求验证

服务端下发用于CSRF token用于请求验证,客户端使用脚本进行请求时,携带该token进行验证,而恶意网站是无法获取到该token的值。这种方式要求token值一定要是随机生成。

  • 在表单内植入该token值:<input type="hidden" name="csrf_token" value="{{ csrf_token_value }}" />
  • 在静态资源和a链接的URL内植入token:https://www.a.com/bbb/cc?a=b&csrf_token={{csrf_token_value}}
  • 跨域的脚本请求可以使用自定义首部携带该token

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 数据炼金术:用Python爬虫精炼信息
  • CSDN AI-WEB-1.0 攻略
  • C++基础语法:析构函数
  • 【现代操作系统】1. intro
  • Java中的主要设计模式
  • ubuntu18.04下安装nvidia3090显卡驱动
  • 数据结构----栈
  • C语言指针详解-上
  • (七)Activiti-modeler中文支持
  • 『Z-Workshop』 The Graph workshop mini hackathon活动
  • IBERT 眼图机制
  • 使用Poi-tl对word模板生成动态报告
  • 利用 Python 的包管理和动态属性获取(`__init__.py` 文件和 `getattr` 函数)特性来实现工厂方法模式
  • RHEL8 配置epel源
  • 深入探讨C语言中的高级指针操作
  • [deviceone开发]-do_Webview的基本示例
  • 【140天】尚学堂高淇Java300集视频精华笔记(86-87)
  • ES学习笔记(10)--ES6中的函数和数组补漏
  • JavaScript标准库系列——Math对象和Date对象(二)
  • JAVA并发编程--1.基础概念
  • Java程序员幽默爆笑锦集
  • Linux CTF 逆向入门
  • underscore源码剖析之整体架构
  • Webpack4 学习笔记 - 01:webpack的安装和简单配置
  • 深入浅出webpack学习(1)--核心概念
  • 世界编程语言排行榜2008年06月(ActionScript 挺进20强)
  • 我建了一个叫Hello World的项目
  • 移动端唤起键盘时取消position:fixed定位
  • ​学习笔记——动态路由——IS-IS中间系统到中间系统(报文/TLV)​
  • #NOIP 2014# day.2 T2 寻找道路
  • #如何使用 Qt 5.6 在 Android 上启用 NFC
  • #在 README.md 中生成项目目录结构
  • (¥1011)-(一千零一拾一元整)输出
  • (2024,RWKV-5/6,RNN,矩阵值注意力状态,数据依赖线性插值,LoRA,多语言分词器)Eagle 和 Finch
  • (33)STM32——485实验笔记
  • (分布式缓存)Redis分片集群
  • (附源码)php新闻发布平台 毕业设计 141646
  • (附源码)spring boot校园拼车微信小程序 毕业设计 091617
  • (附源码)ssm基于jsp高校选课系统 毕业设计 291627
  • (论文阅读11/100)Fast R-CNN
  • (十七)Flink 容错机制
  • (数据结构)顺序表的定义
  • (四) Graphivz 颜色选择
  • (一)Dubbo快速入门、介绍、使用
  • (转)winform之ListView
  • **PyTorch月学习计划 - 第一周;第6-7天: 自动梯度(Autograd)**
  • .Net CoreRabbitMQ消息存储可靠机制
  • .NET I/O 学习笔记:对文件和目录进行解压缩操作
  • .NET教程 - 字符串 编码 正则表达式(String Encoding Regular Express)
  • .NET开发不可不知、不可不用的辅助类(三)(报表导出---终结版)
  • /etc/shadow字段详解
  • ??如何把JavaScript脚本中的参数传到java代码段中
  • @converter 只能用mysql吗_python-MySQLConverter对象没有mysql-connector属性’...
  • @requestBody写与不写的情况
  • [012-1].第12节:Mysql的配置文件的使用