web 安全问题(一):CSRF 攻击
什么是CSRF
CSRF是怎么产生的
CSRF的攻击对象
CSRG的攻击手段
CSRF的防御措施
什么是CSRF
全称是(Cross Site Request Forgery)跨站请求伪造。也就是恶意网站伪装成用户向目标网站服务器发送请求,骗取服务器执行请求中的命令,直接在服务器改变数据值的一种攻击手段。
CSRF是怎么产生的
用户需要获取操作的权限,目标网站服务器会要求一次验证,通常都是一次账号密码登录。服务器验证通过之后,会在浏览器写一个会话ID,来标识用户的身份。这是一种隐式验证的方法,用户只要验证一次获取到会话ID之后,在会话ID未过期的一段时间内的请求操作是不需要再次验证的。但服务器只能判断请求是来源于这个授权过的浏览器,而不能判断请求是否是用户发起或者是用户授权的。所以当用户浏览了恶意网站之后,恶意网站就可以给服务器发起带有命令的请求,尝试改变服务器中的数据值。
CSRF的攻击对象
CSRF的攻击对象也就是我们要保护的对象。CSRF利用的是授权浏览器向目标网站服务器发送任何请求时,都会自动带上会话ID或者cookie进行身份验证。但是由于浏览器同源策略的限制,恶意网站无法看到目标网站的cookie或者回话ID,也没有办法解析返回的内容,所以恶意所能做的就是给服务器发送请求,以执行请求中所描述的命令,在服务器端直接改变数据的值,而非窃取服务器中的数据
CSRF的攻击手段
- 利用天生具有跨域能力的标签--
<script>,<a>,<img>等,发起get请求
<img src="http://www.target.com/order/pay?money=10000&to=34j34">
- 利用iframe和javascipt发起post请求
<iframe name="steal" style="display: none;"></iframe>
<form method="post" action="http:www.xxxx.com/trading/product/addCartProduct" name="transfer" target="steal">
<input type="hidden" name="id" value="b21a59eaa7e604b44fe8a3bf">
<input type="hidden" name="money" value="1000">
<input type="submit" value="提交">
</form>
window.onload=function(){
function steal()
{
var iframe = window.frames['steal'].document;
var form = document.getElementsByTagName('form')[0];
form.submit();
}
steal();
}
CSRF的防御措施
1. 涉及到数据更改的操作服务器严格使用post请求而不是get请求
2. 验证HTTP Referer 字段
根据 HTTP 协议,在 HTTP 头中有一个字段叫 Referer,它记录了该 HTTP 请求的来源地址。恶意网站只能在他自己的网站伪造请求,所以验证referer应该是可以过滤掉一部分CSRF攻击的。但是使用Rerferer值,就相当于把安全性交给了第三方,浏览器实现referer的方式不能保证没有漏洞。据说IE6是可以修改referer的值的。另外referer会记录下用户的访问来源,有些用户会觉得是侵犯了其隐私,而且用户是可以设置使用浏览器时不再提供referer的。(所以说这种方法虽然简单但是不可靠)
3. 在请求地址中添加token
CSRF 攻击之所以能够成功,是因为黑客可以完全伪造用户的请求。服务器验证地址中加密的token,可以比较有效地避免攻击
4. HTTP头自定义属性验证
这个是token验证的变种,可以利用 XMLHttpRequest 这个类,一次性给ajax请求加上 特定的 HTTP 头属性,并把 token 值放入其中。
5 显式验证,添加验证码验证,密码验证等。
CSRF 攻击之所以能够成功,也是由于隐式验证,服务器无法判断请求真实地由用户发起和用户授权的。
总的来说,CSRF防御没有十全十美的方法,只有适合的方法。
【TODO】
web安全,是一个很重要的技能,也是一个领域的知识。我打算吧这个领域的东西写成一个系列:
web安全二:XSS 攻击
web安全三:同源策略
web安全四:跨域请求
参考
web 安全问题(一):CSRF 攻击的更多相关文章
- Web安全之CSRF攻击的防御措施
Web安全之CSRF攻击的防御措施 CSRF是什么? Cross Site Request Forgery,中文是:跨站点请求伪造. CSRF攻击者在用户已经登录目标网站之后,诱使用户访问一个攻击 ...
- Web安全之CSRF攻击
CSRF是什么? CSRF(Cross Site Request Forgery),中文是跨站点请求伪造.CSRF攻击者在用户已经登录目标网站之后,诱使用户访问一个攻击页面,利用目标网站对用户的信任, ...
- Web安全之CSRF攻击(转载)
CSRF是什么? CSRF(Cross Site Request Forgery),中文是跨站点请求伪造.CSRF攻击者在用户已经登录目标网站之后,诱使用户访问一个攻击页面,利用目标网站对用户的信任, ...
- python web框架Flask——csrf攻击
CSRF是什么? (Cross Site Request Forgery, 跨站域请求伪造)是一种网络的攻击方式,它在 2007 年曾被列为互联网 20 大安全隐患之一,也被称为“One Click ...
- web安全问题-csrf
web安全问题 csrf <script> document.write(` <form name="commentForm" target="csrf ...
- web 安全问题(二):XSS攻击
上文说完了CSRF攻击,本文继续研究它的兄弟XSS攻击. 什么是XSS攻击 XSS攻击的原理 XSS攻击的方法 XSS攻击防御的手段 什么是XSS攻击 XSS攻击全名(Cross-Site-Scrip ...
- WEB攻击之 CSRF 攻击及防御策略
介绍 是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法. 释义: 跨站请求攻击,简单地说,是攻击者通过一些技术手段欺骗用户的浏览器去访问一个自己曾经认证过的网站并运行一些操作(如 ...
- Web前端安全之利用Flash进行csrf攻击
整理于<XSS跨站脚本攻击剖析与防御>—第6章 Flash在客户端提供了两个控制属性: allowScriptAccess属性和allowNetworking属性,其中AllowScrip ...
- 风炫安全web安全学习第二十八节课 CSRF攻击原理
风炫安全web安全学习第二十八节课 CSRF攻击原理 CSRF 简介 跨站请求伪造 (Cross-Site Request Forgery, CSRF),也被称为 One Click Attack 或 ...
随机推荐
- Linux文件类型(学习笔记六)
一.Linux下的文件类型 普通文件:在由 ls –al 所显示出来的属性方面,第一个属性为 [ - ] 目录文件:在由 ls –al 所显示出来的属性方面,第一个属性为 [ d ] 设备文件:一般都 ...
- java创建线程的三种方式及其对比
第一种方法:继承Thread类,重写run()方法,run()方法代表线程要执行的任务.第二种方法:实现Runnable接口,重写run()方法,run()方法代表线程要执行的任务.第三种方法:实现c ...
- 算法笔记_207:第五届蓝桥杯软件类决赛部分真题(Java语言C组)
目录 1 数字拆分 2 稍大的串 前言:以下代码仅供参考,若有错误欢迎指正哦~ 1 数字拆分 正整数可以表示为若干正整数的累加和. 如,对于正整数n=6,可以分划为: 6 5+1 4+2 4+1+ ...
- 虚拟机Linux下一直获取不到ip怎么办
虚拟机Linux下一直获取不到ip怎么办 Ifconfig -a 只显示了本地的ip127.0.0.1 和另一个eth1 但是找不到ip地址. 需要做的是: 申请ipdhclient eth1 另外释 ...
- java面试第十六天
国际化:让世界上每个人都能看懂. Locale类(java.util包下):包括所有国家.地区.语言 存在很多的静态属性,来表示国家.语言 三种构造方法: Locale(String language ...
- position sticky 定位
1.兼容性 https://caniuse.com/#search=sticky chrome.ios和firefox兼容性良好. 2.使用场景 sticky:粘性.粘性布局. 在屏幕范围内时,元素不 ...
- python之函数用法basestring
# -*- coding: utf-8 -*- #python 27 #xiaodeng #python之函数用法basestring #http://www.cnblogs.com/oneday/a ...
- cocos2dx 3.2 解决输入框(TextField,TextFieldTTF) 中文乱码问题
近期开发cocos2dx 项目,做一个小游戏.(个人喜欢用最新版本号) 没系统学习就是问题多多,遇到了非常多问题,比方全部的opengl api都必须在主线程中调用, 这让我在多线程载入方面吃了不少亏 ...
- LeetCode(35):Palindrome Number
Determine whether an integer is a palindrome. Do this without extra space. Some hints: Could negativ ...
- Android API之android.provider.ContactsContract.RawContacts
android.provider.ContactsContract.RawContacts Constants for the raw contacts table, which contains o ...