跨站请求伪造(CSRF)-简述

跨站请求伪造(英语:Cross-site request forgery),也被称为 one-click attack 或者 session riding,通常缩写为 或者 XSRF, 是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。[1] 跟跨网站脚本(XSS)相比,XSS 利用的是用户对指定网站的信任,CSRF 利用的是网站对用户网页浏览器的信任。(维基百科)

当我们请求一个目标网站时,浏览器会发送该目标网站相关的cookie信息。当我们浏览其他的网站时,如果我们没有退出该目标网站,而其他的网站有一个向目标网站的操作链接,这时因为我们在线,且有cookie信息,那么目标网站就会认为这是一个合法的请求而执行。但是这个操作不是我们自己请求的,而是恶意者用我们自己被认证过的身份执行的操作。

这种恶意的网址并不需要一个特定的网站,它可以藏身在任何一个由用户生成内容的网站中,如论坛,博客等。

如果有账户名为Alice的用户访问了恶意站点,而她之前刚访问过在线交易网站,登录信息尚未过期,那么她就会损失1000资金。

Get方式攻击:

假设一个在线交易网站有一个转账的url:

http://www.examplebank.com/withdraw?account=AccoutName&amount=1000&for=PayeeName

一个恶意者在另一个网站添加了如下代码

<img src="http://www.examplebank.com/withdraw?account=Alice&amount=1000&for=Badman">

Post方式攻击:

//目标网站的form
<form id="form" action="withdraw/trans" method="post">
<input name="account" type="text"/>
<input name="amount" type="text"/>
<input name="forAccount" type="text"/>
</form>

恶意链接

//指向恶意Html的链接
<img src="http://other/maliciouspage.html"/>

恶意html:

<html>
<head>
<script type="text/javascript">
window.onload = function () {
document.myform.submit();
}
</script>
</head>
<body>
<form id="myform" name="myform" action="withdraw/trans" method="post"/>
<input name="account" type="hidden" value="Alice" />
<input name="amount" type="hidden" value="1000"/>
<input name="forAccount" type="hidden" value="Badman"/>
</form>
</body>
</html>

恶意Html部署在http://other/maliciouspage.html。恶意链接在任何一个可以由用户生成内容的网站,当有用户是Alice浏览到一个有恶意链接的网站时,就会加载恶意html,执行form方法。


@Html.AntiForgeryToken

如何避免这个恶意请求呢?

既然浏览器是不可信的,那么就用一个非浏览器的而是跟页面自身(用户唯一)才有的唯一随机值作为验证对象。

@Html.AntiForgeryToken的验证流程:

生成验证值:

  1. 当在View中调用AntiForgeryToken时会先生成一个cookie的名称,该名称的前缀为"_RequestVerificationToken"。

  2. 如果当前的请求中已有该cookie,则直接对该cookie的值进行序列化(包含加密解密操作)得到AntiForgeryData对象。如果没有该cookie则生成一个AntiForgeryData对象。

  3. 创建cookie,名称为1中生成的值,值为2中AntiForgeryData对象解析后的字符串(前后值会不一样,因为还有其他的随机值作为解析参数)。

  4. @Html.AntiForgeryToken会生成一个名为"_RequestVerificationToken"的隐藏控件,该控件的值是根据现有的AntiForgeryData对象再创建一个新的AntiForgeryData对象,序列化的字符串。

匹配验证值:

  1. 在form提交时,服务端会先根据之前生成cookie的逻辑再次获取到cookie名称,如果没有找到对应cookie就抛出异常,如果找到该cookie,就解析解密为AntiForgeryToken对象。

  2. 然后在表单中查找名称为"_RequestVerificationToken"的控件,没有找到抛出异常,找到的话该控件的值解析解密为AntiForgeryToken对象.

  3. 隐藏控件中的AntiForgeryToken和cookie解析解密的AntiForgeryToken对象匹配,一致为合法,不一致为非法。

因为@Html.AntiForgeryToken的值是随机且加密的,所以恶意html的表单里很难获取到正确的值。

Cookie:

    HTTP/1.1 200 OK
Cache-Control: private
Set-Cookie: __RequestVerificationToken_L012Y0FwcDEx=EYPOofprbB0og8vI+Pzr1unY0Ye5BihYJgoIYBqzvZDZ+hcT5QUu+fj2hvFUVTTCFAZdjgCPzxwIGsoNdEyD8nSUbgapk8Xp3+ZD8cxguUrgl0lAdFd4ZGWEYzz0IN58l5saPJpuaChVR4QaMNbilNG4y7xiN2/UCrBF80LmPO4=; path=/; HttpOnly

Form:

 <form action="..." method="post">
<input name="__RequestVerificationToken" type="hidden" value="yvLaFQ81JVgguKECyF/oQ+pc2/6q0MuLEaF73PvY7pvxaE68lO5qgXZWhfqIk721CBS0SJZjvOjbc7o7GL3SQ3RxIW90no7FcxzR6ohHUYEKdxyfTBuAVjAuoil5miwoY8+6HNoSPbztyhMVvtCsQDtvQfyW1GNa7qvlQSqYxQW7b6nAR2W0OxNi4NgrFEqbMFrD+4CwwAg4PUWpvcQxYA==" />
</form>

@Html.AntiForgeryToken的使用:

//Razor:
<form id="form" action="withdraw/trans" method="post">
@Html.AntiForgeryToken()
<input name="account" type="text"/>
<input name="amount" type="text"/>
<input name="forAccount" type="text"/>
</form> //Controller:添加特性[ValidateAntiForgeryToken]且必须是HttpPost
[HttpPost]
[ValidateAntiForgeryToken]
public ActinResult Trans(string account,double amount,string forAccount)
{
return View();
}

get请求最好是只读的,对于有操作的请求最好用post来实现。


参考:

跨站请求伪造(CSRF)-简述的更多相关文章

  1. PHP安全编程:跨站请求伪造CSRF的防御(转)

    跨站请求伪造(CSRF)是一种允许攻击者通过受害者发送任意HTTP请求的一类攻击方法.此处所指的受害者是一个不知情的同谋,所有的伪造请求都由他发起,而不是攻击者.这样,很你就很难确定哪些请求是属于跨站 ...

  2. 跨站请求伪造(CSRF)攻击原理解析:比你所想的更危险

    跨站请求伪造(CSRF)攻击原理解析:比你所想的更危险 跨站请求伪造(Cross-Site Request Forgery)或许是最令人难以理解的一种攻击方式了,但也正因如此,它的危险性也被人们所低估 ...

  3. django之跨站请求伪造csrf

    目录 跨站请求伪造 csrf 钓鱼网站 模拟实现 针对form表单 ajax请求 csrf相关的两个装饰器 跨站请求伪造 csrf 钓鱼网站 就类似于你搭建了一个跟银行一模一样的web页面 , 用户在 ...

  4. 跨站请求伪造 CSRF / XSRF<一:介绍>

    跨站请求伪造(英语:Cross-site request forgery),也被称为 one-click attack 或者 session riding,通常缩写为 CSRF 或者 XSRF, 是一 ...

  5. 跨站请求伪造CSRF(Cross-site request forgery)

    CSRF(Cross-site request forgery)跨站请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站 ...

  6. 跨站请求伪造(csrf)中间件整理

    一. CSRF中间件 字面意思跨站请求伪造; 即模仿个请求朝服务器发送,django中对跨站伪造的请求有相应的校验 from django.views.decorators.csrf import c ...

  7. 跨站请求伪造(csrf)的防护手段

    CSRF CSRF全拼为Cross Site Request Forgery,译为跨站请求伪造. CSRF指攻击者盗用了你的身份,以你的名义发送恶意请求. 造成的问题:个人隐私泄露以及财产安全. CS ...

  8. 跨站请求伪造CSRF:攻击与防御

    CSRF是什么         (Cross Site Request Forgery, 跨站域请求伪造)是一种网络的攻击方式,它在 2007 年曾被列为互联网 20 大安全隐患之一,也被称为&quo ...

  9. 跨站请求伪造CSRF

    CSRF是Cross Site Request Forgery的缩写,乍一看和XSS差不多的样子,但是其原理正好相反,XSS是利用合法用户获取其信息,而CSRF是伪造成合法用户发起请求. 在XSS危害 ...

随机推荐

  1. 201521123066 《Java程序设计》第十二周实验总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 书面作业 将Student对象(属性:int id, String name,int age,doubl ...

  2. Java:输入输出流 java.io包的层次结构

    1.什么是IO Java中I/O操作主要是指使用Java进行输入,输出操作. Java所有的I/O机制都是基于数据流进行输入输出,这些数据流表示了字符或者字节数据的流动序列.Java的I/O流提供了读 ...

  3. 如何实现Sublime Text3中vue文件高亮显示的最有效的方法

    今天第一次使用Sublime Text3软件,在实现vue文件高亮显示的过程中一直报错,经过了半天时间的不停尝试终于找到了最有效的一种解决方法!错误提示如下: 刚开始尝试了很多方法都不行,只要打开in ...

  4. 王者荣耀是怎样炼成的(二)《王者荣耀》unity安装及使用的小白零基础入门

    转载请注明出处:http://www.cnblogs.com/yuxiuyan/p/7535345.html 工欲善其事,必先利其器. 上回书说到,开发游戏用到unity和C#.本篇博客将从零开始做一 ...

  5. Struts2标签:checkboxlist

    参考自博文:http://www.blogjava.net/koradji/articles/307399.html 语法: <s:checkboxlist name="" ...

  6. 《Java从入门到放弃》JavaSE入门篇:网络编程(入门版)

    要进行网络编程,首先要搞清楚目的是什么. 网络编程说简单点就是在网络上的计算机进行数据的交互. 既然要进行数据交互,那就需要有一个发送方和一个接受方. 按网络上的说法,就是一个攻一个受· 当然,现阶段 ...

  7. 专用管理连接(DAC)和单用户模式

    数据库运维人员,在维护数据库时,有时会遇到一些特殊的情况,例如,SQL Server实例无法访问,此时需要用到管理员在紧急情况下专用的连接:有时,在做一些系统级别的配置修改时,当前数据库不能被其他用户 ...

  8. unity3D写一个hello world

    unity3D写一个hello world 打开unity并且在assets建立一个新的文件,新的文件命名为hello world.unity.接着创建一个新的C#Sript脚本文件,命名为hello ...

  9. angular学习笔记01

    angular.js路由功能 用于实现单页应用 //html 代码 <div ng-view></div> //js代码 angular.module('myM1',['ng' ...

  10. 《JavaScript闯关记》视频版硬广

    <JavaScript闯关记>视频版硬广 stone 在菜航工作时,兼任内部培训讲师,主要负责 JavaScript 基础培训,2016年整理的<JavaScript闯关记>课 ...