千家信息网

学习笔记之CSRF初级篇

发表于:2025-12-02 作者:千家信息网编辑
千家信息网最后更新 2025年12月02日,什么是CSRFCSRF(Cross-siterequestforgery跨站请求伪造,也被称为"oneclickattack"或者sessionriding,通常缩写为CSRF或者XSRF,是一种对网
千家信息网最后更新 2025年12月02日学习笔记之CSRF初级篇

什么是CSRF

CSRF(Cross-siterequestforgery跨站请求伪造,也被称为"oneclickattack"或者sessionriding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。尽管听起来像跨站脚本(XSS),但它与XSS非常不同,并且***方式几乎相左。XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。与XSS***相比,CSRF***往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性。

XssCSRF异同

CSRF与XSS在***手段上有点类似,都是在客户端执行恶意代码,有些文章中认为CSRF与XSS的区别在于CSRF不注重于获取用户Cookie,笔者认为可能还有区别在于CSRF不仅可以在源站发起***,还可以引导用户访问其他危险网站的同时发起***。

XSS全程是跨站脚本***,即***者向某个Web页面中插入恶意的JavaScript脚本。而当普通用户访问时,该恶意脚本自动执行而从盗取用户的Cookie等信息。对于XSS的防御手段主要就是输入检查与输出检查,譬如对用户输入的文本框内容进行<、>这样的特殊字符检查。而输出检查则是指对于输出到网页的内容进行过滤或者编解码,譬如使用HTML编码将<转义。

CSRF为跨站请求伪造,其与XSS有点类似,不过区别在于CSRF不一定依赖于JavaScript,并且不仅可以在源站发起***,还有可能当用户访问恶意网站时引导其访问原网站。CSRF***是源于WEB的隐式身份验证机制,WEB的身份验证机制虽然可以保证一个请求是来自于某个用户的浏览器,但却无法保证该请求是用户批准发送的。对于CSRF的防御也分为服务端防御与客户端防御两种,服务端防御典型的譬如给某个页面添加随机数,使得无法从第三方页面直接提交。在客户端防御的话可以利用譬如Firefox提供的一些检查工具。注意,CSRF并没有打破同源策略。

CSRF的危害

你这可以这么理解CSRF***:***者盗用了你的身份,以你的名义发送恶意请求。CSRF能够做的事情包括:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,

虚拟货币转账等等造成的问题包括:个人隐私泄露以及财产安全。

  下图简单阐述了CSRF***的思想

从上图可以看出,要完成一次CSRF***,受害者必须依次完成两个步骤:

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

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

  看到这里,你也许会说:"如果我不满足以上两个条件中的一个,我就不会受到CSRF的***"。是的,确实如此,但你不能保证以下情况不会发生:

1.你不能保证你登录了一个网站后,不再打开一个tab页面并访问另外的网站。

2.你不能保证你关闭浏览器了后,你本地的Cookie立刻过期,你上次的会话已经结束。(事实上,关闭浏览器不能结束一个会话,但大多数人都会错误的认为关闭浏览器就等于退出登录/结束会话了......)

3.上图中所谓的***网站,可能是一个存在其他漏洞的可信任的经常被人访问的网站。同样也可以是一个恶意的url。

SCRF触发条件

1、被***者的用户cookies

2、恶意的url或表单

CSRF的防御

CSRF的防御可以从服务端和客户端两方面着手,防御效果是从服务端着手效果比较好,现在一般的CSRF防御也都在服务端进行。

  1.服务端进行CSRF防御

  服务端的CSRF方式方法很多样,但总的思想都是一致的,就是在客户端页面增加伪随机数。

  (1).Cookie Hashing(所有表单都包含同一个伪随机值):

  这可能是最简单的解决方案了,因为***者不能获得第三方的Cookie(理论上),所以表单中的数据也就构造失败了

    //构造加密的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 {
      //...
   }
?>


  这个方法目前觉得已经可以杜绝大多数***了,那还有少数由于用户的Cookie很容易由于网站的XSS漏洞而被盗取,一般的***者看到有需要算Hash值,基本都会放弃了,当然也有些人除外,所以如果需要100%的杜绝,这并不是最好的方法。

  (2).验证码

  这个方案的思路是:每次的用户提交都需要用户在表单中填写一个图片上的随机字符串,厄....这个方案可以完全解决CSRF,但个人觉得在易用性方面似乎不是太好,还有听闻是验证码图片的使用涉及了一个被称为MHTML的Bug,可能在某些版本的微软IE中受影响。

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

  在实现One-Time Tokens时,需要注意一点:就是"并行会话的兼容"。如果用户在一个站点上同时打开了两个不同的表单,CSRF保护措施不应该影响到他对任何表单的提交。考虑一下如果每次表单被装入时站点生成一个伪随机值来覆盖以前的伪随机值将会发生什么情况:用户只能成功地提交他最后打开的表单,因为所有其他的表单都含有非法的伪随机值。必须小心操作以确保CSRF保护措施不会影响选项卡式的浏览或者利用多个浏览器窗口浏览一个站点。

  以下我的实现:

  1).先是令牌生成函数(gen_token()):

function gen_token() {
     $token = md5(uniqid(rand(), true));
return $token;
}

  2).然后是Session令牌生成函数(gen_stoken()):

  function gen_stoken() {
      $pToken = "";
      if($_SESSION[STOKEN_NAME] == $pToken){
        //没有值,赋新值
        $_SESSION[STOKEN_NAME] =gen_token();
      }
      else{
        //继续使用旧的值
      }
  }
?>


  3).WEB表单生成隐藏输入域的函数:  

   function gen_input() {
   gen_stoken();
   echo "   value=\"". $_SESSION[STOKEN_NAME] . "\"> ";
  }
?>

  

4).WEB表单结构:

session_start();
include("functions.php");
?>






  5).服务端核对令牌


用户 表单 网站 防御 服务 恶意 浏览 客户 客户端 浏览器 页面 保证 检查 生成 验证 不同 站点 脚本 危险 两个 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 山大青岛网络安全考研 数据库通用接口实现 上海应用软件开发有用吗 网络安全与运维主要内容 计算机考研需要学数据库吗 金蝶软件开发票怎么添加收款人 食物绘画软件开发 游戏服务器租用费用 怎么登陆网站数据库 江西有哪些软件开发公司吗 怀旧服服务器经验值多少 东南电脑网络安全 服务器当前时间怎么删除 启动和退出数据库有几种方法 中专网络技术考什么证书 第六届网络安全等级保护技术大会 浙江科研审批管控软件开发平台 2020网络安全教育总结 提高网络技术app排行榜 国家基因组数据库中心上传步骤 网络安全网络探测实验室 明亮超互联网科技 免费idc服务器 软件开发公司如何推广自己 北京真好生活互联网科技 北京大学网络安全专业考哪几科 红黑人口数据库2010 网络安全有必要出国读研吗 浏览器被设置为使用代理服务器 数据库系统的备份和恢复试验
0