ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Web信息安全实践_3.4 CSRF防御

2020-01-27 11:53:36  阅读:237  来源: 互联网

标签:Web rs 3.4 Referer zoobars CSRF sql 攻击者 recipient


错误的CSRF防御方法

(1)只接受 POST 请求

攻击者不能基于链接简单地攻击( IMG ),但是可以使用脚本创建隐藏的 POST 请求

(2)转账需要多步

e.g. 第一个请求转多少个coin,第二个请求转给谁 CSRF 攻击可以按顺序执行每个步骤

(3)检查 Referer

Referer

Referer报文头是网页请求头的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器藉此可以获得一些信息用于处理。
  • 用户正常转账:请求从myzoo.com发出
Referer: http://www.myzoo.com/transfer.php
 
  • 攻击者强迫用户转账:请求从attacker.com发出
Referer: http://www.attacker.com/csrf/csrf1.html

防御思路:在服务器的transfer.php中增加对Referer的检查

法一:使用JavaScript代码
<script>
    if(document.referrer.indexOf('bank.com')<0)
    document.location.replace("https://www.ustc.edu.cn");
</script>

 

法二:使用PHP代码
$ref = ($_SERVER['HTTP_REFERER']);    
$tmp2 = substr($tmp1,0,strpos($tmp1,'/'));
if($tmp2 !='www.bank.com')
    die("Hotlinking not permitted!");
else
    echo($refData['host'])

 

 

Referer防御缺陷

  • 如果攻击者猜测出网站的防御方法,如在攻击页面url加上bank.com,就能通过Referer的验证
  • 用户发送过来的请求中不存在Referer
    • Referer会泄露用户的隐私?
    • 用户可能选择主动关闭Referer(浏览器提供关闭Referer的功能)

 

通用的CSRF防御方法:在表单中增加攻击者难以构造的项(随机串)

Anti-CSRF Token
  • CSRF原理:攻击者利用浏览器行为;攻击者伪造出表单所需要的数据
  • 随机串的内容:攻击者猜不出来;与用户相关;每个用户不相同;变化得足够快
sudo vim /var/www/myzoo/login.php
// 在头部处添加如下四行
<?php
session_start(); //启动session
if($_POST['login_username']!=NULL && $_POST['login_password']!=NULL)
 $_SESSION['csrf'] = md5(uniqid(mt_rand(),true)); //在session中产生一个随机数,并且通过MD5k进行散列
?>
//构造随机数,每次用户登录生成一个随机数.
//开发者控制粒度,譬如,用户登录页面,用户登录期间使用一个随机数,用户转账页面,每次转账更新一次数据......
sudo vim /var/www/myzoo/transfer.php
<!--将session中生成的值放在表单-->
<form method=POST name=transferform action="<?php echo $_SERVER['PHP_SELF']?>">
<p><input name=csrf type=hidden value="<?php echo $_SESSION['csrf']?>"></p> <!--将session中生成的值放在表单-->
<p>Send <input name=zoobars type=text value="<?php echo $_POST['zoobars'];?>" size=5> zoobars</p>
<p>to <input name=recipient type=text value="<?php echo $_POST['recipient'];?>"></p>
<input type=submit name=submission value="Send">
</form>
//检测如果csrf字段不正确就停止操作
sudo vim /var/www/myzoo/transfer.php
if($_POST['submission']) {

//    if(1){
    if($_POST['csrf'] == $_SESSION['csrf']) {//用户提交token值和生成的token值是否一样
    $recipient = $_POST['recipient'];
    $zoobars = (int) $_POST['zoobars'];
    $sql = "SELECT Zoobars FROM Person WHERE PersonID=$user->id";
    $rs = $db->executeQuery($sql);
    $rs = mysql_fetch_array($rs);
    $sender_balance = $rs["Zoobars"] - $zoobars;
    $sql = "SELECT PersonID FROM Person WHERE Username='$recipient'";
    $rs = $db->executeQuery($sql);
    $rs = mysql_fetch_array($rs);
    $recipient_exists = $rs["PersonID"];
    if($zoobars > 0 && $sender_balance >= 0 && $recipient_exists) {
      $sql = "UPDATE Person SET Zoobars = $sender_balance " .
             "WHERE PersonID=$user->id";
      $db->executeQuery($sql);
      $sql = "SELECT Zoobars FROM Person WHERE Username='$recipient'";
      $rs = $db->executeQuery($sql);
        $rs = mysql_fetch_array($rs);
      $recipient_balance = $rs["Zoobars"] + $zoobars;
      $sql = "UPDATE Person SET Zoobars = $recipient_balance " .
             "WHERE Username='$recipient'";
      $db->executeQuery($sql);
      $result = "Sent $zoobars zoobars";
    }
    else $result = "Transfer to $recipient failed.";
   }
   else return;//如果csrf字段不正确,停止操作
  }
?>
       

标签:Web,rs,3.4,Referer,zoobars,CSRF,sql,攻击者,recipient
来源: https://www.cnblogs.com/tianjiazhen/p/12235607.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有