热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

前端能力模型CSRF漏洞

一、CSRF概念: CSRF(Cross-Site Request Forgery):中文名称:跨站请求伪造,也
一、CSRF概念:




CSRF(Cross-Site Request Forgery):中文名称:跨站请求伪造,也被称为:one click attack/ session riding,缩写为CSRF/XSRF。




XSS是实现CSRF的诸多途径中的一条,但绝对不是唯一的一条。一般习惯上把通过XSS来实现的CSRF称为XSRF。

CSRF是伪造请求,,冒充用户在站点正常操作。我们知道,绝大多数网站是通过COOKIE等方式辨识用户身份(包括使用服务器端Session的网站,因为Session ID也是大多保存在COOKIE里面的),再予以授权的。所以要伪造用户的正常操作,最好的方法是通过XSS活链接欺骗等途径,让用户在本机(即拥有身份COOKIE的浏览器端)发起用户所不知道的请求。




二、CSRF可以做什么




要完成一次CSRF攻击,受害者必须依次完成两个步骤:

1、登录受信任网站A,并在本地生成COOKIE。

2、在不登出A的情况下,访问危险网站B。

可以这么理解CSRF攻击:攻击者盗用了你的身份,以你的名义发送恶意请求。CSRF能够做的事情包括:以你的名义发送恶意请求




三、CSRF漏洞现状




不能保证如下情况不会发生:

1、登录一个网站,不再打开新的一个tab页面访问另外网站;

2、不能保证关闭浏览器,本地的COOKIE就立刻过期;

3、攻击的网站,可能是一个存在漏洞的可信任的经常被人访问的网站。




四、CSRF原理

示例流程图:













示例1:

银行网站A,它以GET请求来完成银行转账的操作,如:

http://www.mybank.com/Transfer.php?toBankId=11&money=1000




危险网站B,它里面有一段html代码如下:






登录网站A,未退出,然后访问网站B,银行帐号少了钞票

原因:银行网站A违反http规范,使用GET请求更新资源。在访问危险网站B之前,你已经登录银行网站A,而B中的以GET方式请求第三方资源(这里第三方是指银行网站,被不法分子利用了),所以你的浏览器会带上你的银行网站A的COOKIE发出get请求,去获取资源"http://www.mybank.com/Transfer.php?toBankId=11&money=1000",结果银行网站服务器收到请求后,认为这是一个更新资源操作(转账操作),所以就立刻进行转账操作




第二次改进版:

为了杜绝上面的问题,银行决定改用POST请求完成转账操作。

银行网站A的WEB表单如下:



ToBankId:


     

Money:










后台处理页面Transfer.php如下:


seesion_start();

if (isset($_REQUEST['toBankId']) && isset($_REQUEST['money'])) {
          buy_stocks($_REQUEST['toBankId'], $_REQUEST['money']);
     }

?>

危险网站B,仍然只是包含那句话html代码



执行一次,再次没了xx块人民币,原因是$_REQUEST既能获取post请求数据,也能获取get请求数据,java获取请求数据request一样存在不能区分get和post数据问题。




第三次优化版:

经过前面惨痛的教训,银行决定把获取请求数据的方法改了,改用$_POST,只获取post请求数据,后台处理页面Transfer.php代码如下:


session_start();

if (isset($_POST['toBankId']) && isset($_POST['money'])) {
          buy_stocks($_POST['toBankId'], $_POST['money']);
     }

?>

危险网站B与时俱进,将img换成post方法




















用户继续操作危险网站B,再一次不见xx块。

理解上面3种攻击模式,其实可以看出,CSRF攻击是源于WEB的隐式身份验证机制,WEB的身份验证机制虽然可以保证一个请求是来自于某个用户浏览器,但却无法保证该请求是用户批准发送的。




五、CSRF的防御




CSRF防御可以从服务端和客户端两方面着手,防御效果是从服务端着手效果比较好。




1、服务端进行CSRF防御

服务端的CSRF就是在客户端页面增加伪随机数




a) COOKIE Hashing(所有表单都包含同一个伪随机值):


// 构造加密的COOKIE信息

$value = "DefenseSCRF";

setCOOKIE("COOKIE", $value, time()+3600);

?>

在表单里增加hash值,以认证这确实是用户发送的请求


$hash = md5($_COOKIE['COOKIE']);

?>







" />








然后在服务器端进行Hash值验证


if (isset($_POST['check'])) {

$hash = md5($_COOKIE['COOKIE']);

if ($_POST['check'] == $hash) {

doJob();

} else {

//...

}

} else {

// ...

}

?>

这个方法基本可以杜绝大部分csrf攻击,少量由于用户的COOKIE很容易由于网站XSS漏洞而被盗取。一般攻击者看到有需要算Hash值,基本都放弃




2、验证码

这个方案的思路是:每次的用户提交都需要用户在表单中填写一个图片上的随机字符串,这个方案貌似可以完全解决CSRF。易用性稍微差一些




3、One-Time Tokens(不同的表单包含一个不同的伪随机值)

在实现One-Time Tokens时,需要注意一点:就是“并行会话的兼容”。如果用户在一个站点同时打开两个不同的表单,CSRF保护措施不应该影响它对任何表单的提交。




a) 令牌生成函数(gen_token):


function gen_token() {

$token = md5(uniqid(rand(), true));

return $token;
     }

?>

b)Session令牌生成函数(gen_stoken()):


function gen_stoken() {

$pToken = "";

if ($_SESSION[STOKEN_NAME] == $pToken) {

// 没有值,赋新值

$_SESSION[STOKEN_NAME] = gen_token();

} else {

// 继续使用旧的值

}

}

?>

c)Web表单生成隐藏输入域的函数:


function gen_input() {

gen_stoken();

echo " ";

}

?>

4)Web表单结构


session_start();

include("functions.php");

?>
















5)服务端核对令牌


gen_stoken();

if ($_POST['FTOKEN_NAME'] == $_SESSION[STOKEN_NAME]) {

doJob();

} else {

//...

}

?>










转载地址:http://www.cnblogs.com/hyddd/archive/2009/04/09/1432744.html





















推荐阅读
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • springmvc学习笔记(十):控制器业务方法中通过注解实现封装Javabean接收表单提交的数据
    本文介绍了在springmvc学习笔记系列的第十篇中,控制器的业务方法中如何通过注解实现封装Javabean来接收表单提交的数据。同时还讨论了当有多个注册表单且字段完全相同时,如何将其交给同一个控制器处理。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 开发笔记:Java是如何读取和写入浏览器Cookies的
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Java是如何读取和写入浏览器Cookies的相关的知识,希望对你有一定的参考价值。首先我 ... [详细]
  • 本文介绍了django中视图函数的使用方法,包括如何接收Web请求并返回Web响应,以及如何处理GET请求和POST请求。同时还介绍了urls.py和views.py文件的配置方式。 ... [详细]
  • 在springmvc框架中,前台ajax调用方法,对图片批量下载,如何弹出提示保存位置选框?Controller方法 ... [详细]
  • PDO MySQL
    PDOMySQL如果文章有成千上万篇,该怎样保存?数据保存有多种方式,比如单机文件、单机数据库(SQLite)、网络数据库(MySQL、MariaDB)等等。根据项目来选择,做We ... [详细]
  • 网络请求模块选择——axios框架的基本使用和封装
    本文介绍了选择网络请求模块axios的原因,以及axios框架的基本使用和封装方法。包括发送并发请求的演示,全局配置的设置,创建axios实例的方法,拦截器的使用,以及如何封装和请求响应劫持等内容。 ... [详细]
author-avatar
我的小角落5
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有