web安全之跨站请求伪造
CSRF(Cross-site request forgery),中文名称:跨站请求伪造.
因为这个不是用户真正想发出的请求,这就是所谓的请求伪造;因为这些请求也是可以从第三方网站提交的,所以前缀跨站二字。
CSRF发生的场景如下图所示:
用户登录访问了一个受信任的站点,
在用户还没有退出登录的时候,打开另外一个tab页,访问了网站B。
在B网站中,有CSRF攻击代码访问网站A。
发生的原因是,网站是通过cookie来识别用户的,当用户成功进行身份验证之后浏览器就会得到一个
标识其身份的cookie,只要不关闭浏览器或者退出登录,以后访问这个网站会带上这个cookie。
1.登录受信任网站A,并在本地生成Cookie。
2.在不登出A的情况下,访问危险网站B。
你也许会说:“如果我不满足以上两个条件中的一个,我就不会受到CSRF的攻击”。
是的,确实如此,但你不能保证以下情况不会发生:
1.你不能保证你登录了一个网站后,不再打开一个tab页面并访问另外的网站。
2.你不能保证你关闭浏览器了后,你本地的Cookie立刻过期,你上次的会话已经结束。
(事实上,关闭浏览器不能结束一个会话,但大多数人都会错误的认为关闭浏览器就等于
退出登录/结束会话了)如记住密码功能等。
3.上图中所谓的攻击网站,可能是一个存在其他漏洞的可信任的经常被人访问的网站。
下面来看一个代码实例,在网站A发布了下面的代码
用户login,然后可以在input.jsp提交数据,提交的数据被dataupdate.jsp更新到后台。
dataupdate.jsp会检查用户是否登录,如果没有登录会跳到login.jsp要求用户登录。
login.jsp
<body>
<form action="input.jsp" method="post">
name<input type="text" name="name" size="50"><br>
pwd<input type="password" name="password" size="50"><br>
<input type="submit" value="submit">
</form>
<br>
</body>
</html> input.jsp
<body>
<%
//Session session = request.getSession();
String username = (String)session.getValue("username");
System.out.println("username " + username);
if(null==username){
String uname = request.getParameter("name");
session.putValue("username", uname);
} %>
<form action="dataupdate.jsp" method="post">
<input type="text" name="comment" size="50"><br>
<input type="submit" value="submit">
</form>
<br>
</body> dataupdate.jsp
<body>
<%
String username = (String)session.getValue("username");
System.out.println("username " + username);
if(null==username){
System.out.println("has not logged in");
response.sendRedirect("login.jsp");
}else{
String comment = request.getParameter("comment"); System.out.println("add a comment: " + comment); out.write("comment is : " + comment);
}
%>
</body>
</html>
表面上看起来好像没有问题。
假设我们有另外一个网站B,它有一个网页文件如下
如果在用户登录访问网站A的同时访问了网站B,访问者在网站A的数据就会被假冒更新。
可以在后台看到有如下的输出:add a comment: fromcsrf
<body>
use a img element to send a get request <br>
<img src="http://www.a.com/prjWebSec/csrf/dataupdate.jsp?comment=fromcsrf">
</body>
</html>
这里网站A违反了HTTP规范,使用GET请求更新资源。那是不是用post请求就不会发生CSRF呢?
结果是同样会发生。可以通过构造javascript构造form提交,如下面的代码
<body >
</body>
<script type="text/javascript"> var frm= document.getElementById("viframe");
function sendcsrf()
{
var form1 = document.createElement("form");
form1.id = "form1";
form1.name = "form1";
document.body.appendChild(form1); var input = document.createElement("input");
input.type = "text";
input.name = "comment";
input.value = "from csrf post"; form1.appendChild(input);
form1.method = "POST";
form1.action = "http://www.a.com/prjWebSec/csrf/dataupdate.jsp";
form1.submit();
document.body.removeChild(form1);
}
sendcsrf();
</script>
</html>
防止方法:
1、利用referer判断,
但是用户有可能设置浏览器使其在发送请求时不提供 Referer,这样的用户也将不能访问网站。
2、在请求中添加 token 并验证
关键在于在请求中放入黑客所不能伪造的信息,并且该信息不存在于 cookie 之中,
可以在服务器端生成一个随机码,然后放在form的hidden元素中,form提交的时候在服务器端检查。
web安全之跨站请求伪造的更多相关文章
- Web安全测试之跨站请求伪造(CSRF)篇
跨站请求伪造(即CSRF)被Web安全界称为诸多漏洞中“沉睡的巨人”,其威胁程度由此“美誉”便可见一斑.本文将简单介绍该漏洞,并详细说明造成这种漏洞的原因所在,以及针对该漏洞的黑盒测试与灰盒子测试具体 ...
- CSRF(跨站请求伪造)攻击方式
一.CSRF是什么? CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSR ...
- 浅谈CSRF(跨站请求伪造)攻击方式
一.CSRF是什么? CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSR ...
- web前端安全 XSS跨站脚本 CSRF跨站请求伪造 SQL注入
web安全,从前端做起,总结下web前端安全的几种技术: 1,XSS XSS的全称是Cross Site Scripting,意思是跨站脚本,XSS的原理也就是往HTML中注入脚本,HTML指定了脚本 ...
- Web框架之Django_09 重要组件(Django中间件、csrf跨站请求伪造)
摘要 Django中间件 csrf跨站请求伪造 一.Django中间件: 什么是中间件? 官方的说法:中间件是一个用来处理Django的请求和响应的框架级别的钩子.它是一个轻量.低级别的插件系统,用于 ...
- Web框架之Django重要组件(Django中间件、csrf跨站请求伪造)
Web框架之Django_09 重要组件(Django中间件.csrf跨站请求伪造) 摘要 Django中间件 csrf跨站请求伪造 一.Django中间件: 什么是中间件? 官方的说法:中间件是 ...
- Web安全相关(一):CSRF/XSRF(跨站请求伪造)和XSS(跨站脚本)
XSS(Cross Site Script):跨站脚本,也就是javascript脚本注入,一般在站点中的富文本框,里面发表文章,留言等表单,这种表单一般是写入数据库,然后再某个页面打开. 防御: 1 ...
- Web安全之CSRF(跨站请求伪造)
CSRF(跨站请求伪造)概述 Cross-site request forgery 简称为"CSRF",在CSRF的攻击场景中攻击者会伪造一个请求(这个请求一般是一个链接),然后欺 ...
- web 安全 & web 攻防: XSS(跨站脚本攻击)和 CSRF(跨站请求伪造)
web 安全 & web 攻防: XSS(跨站脚本攻击)和 CSRF(跨站请求伪造) XSS(跨站脚本攻击)和CSRF(跨站请求伪造) Cross-site Scripting (XSS) h ...
随机推荐
- Crypto另外两段加密解密的代码
第一段代码风格-平铺直叙: import sys from Crypto.Cipher import AES from binascii import b2a_hex, a2b_hex class p ...
- 中国剩余定理 & 欧拉函数 & 莫比乌斯反演 & 狄利克雷卷积 & 杜教筛
ssplaysecond的博客(请使用VPN访问): 中国剩余定理: https://ssplaysecond.blogspot.jp/2017/04/blog-post_6.html 欧拉函数: h ...
- Linux下使用vi新建文件保存文件时遇到错误:E212: Can't open file for writing
出现E212: Can't open file for writing的问题是由于权限问题导致的,解决方法有以下思路: 1.使用root进行登录,然后再操作. 2.在使用命令时,前面加sudo. 3. ...
- 生活娱乐 Wifi机器人的制作流程
思路简单,但是创意无限~~ 动手能力超强 牛人教你做Wifi机器人(图) 一.前言 Wifi机器人(Wifi Robot):其实是一辆能通过互联网,或500米以外的笔记本无线设施来远程控制的遥控汽车. ...
- SolidEdge 如何由装配图快速进行标注和零件序号编写 制作BOM表
点击"零件明细表",然后点击要生成序号的视图,然后点击前面两项(自动标号和放置清单),点击完成后效果如下图所示. 在点击完成之前,先点击他前面的一个按钮,取消勾选"项 ...
- weex 项目开发(一) weex create project 与 weex init project 的区别
开发环境配置:http://www.cnblogs.com/crazycode2/p/7822961.html 1. weex create project 与 weex init project ...
- C#语法复习1
一.C#与.net框架 .net是语言无关的. 程序的执行流程: .net兼容语言的源代码文件 .net兼容编译器 程序集(公共中间语言(CIL)common intermediate languag ...
- 协议的注冊与维护——ndpi源代码分析
在前面的文章中,我们对ndpi中的example做了源代码分析.这一次我们将尽可能深入的了解ndpi内部的结构和运作.我们将带着以下三个目的(问题)去阅读ndpi的源代码. 1.ndpi内部是怎么样注 ...
- docker (2)---存储、网络(利用docker容器上线静态网站)
一.docker底层依赖的核心技术 1.命名空间 (Namespaces) 2.控制组 (Control Groups) 3.联合文件系统 (Union File System) 4.Linux 虚拟 ...
- 记录:50多行程序中找出多写的一个字母e
小霍同学调程序,做的是第11周的项目1 - 存储班长信息的学生类,可是她写的程序(就在以下),呃,请读者自己执行一下吧.(下午在机房调试时用的是Code::Blocks10.05.输出的是非常长的莫名 ...