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

错误的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字段不正确,停止操作
  }
?>

原文地址:https://www.cnblogs.com/tianjiazhen/p/12235607.html

时间: 2024-08-29 14:40:07

Web信息安全实践_3.4 CSRF防御的相关文章

Web信息安全实践_3.3 CSRF原理

什么是 CSRF Cross-site request forgery( 跨站请求伪造 ) CSRF 利用服务器对用户浏览器的信任 被攻击网站依赖用户的身份认证 攻击者使得用户的浏览器发送 HTTP 请求到目标网站 CSRF 的步骤(用户浏览器主动完成) 攻击者确定目标网站(存在CSRF漏洞的网站:目标网站基于cookie的身份认证) 在目标站点找到表单,或者可以提交请求的 URL ,并构造攻击页面或URL 使用get方式提交表单:所有的参数直接显示在URL中,只要构造相关URL就可以了, 为所

Web信息安全实践_3.2 Cookie

HTTP 持久性 (1)HTTP 是一个无状态的协议:服务器不记录请求之间的关系 e.g. 购物,提交购物车.付钱两次请求之间,http协议不记录这两个请求之间的关系 (2HTTP 如何实现会话的持久性的呢? Cookie HTTP Cookie Cookie 的用途 (1)Cookie 用户浏览器访问网站时,在用户本地存储信息 服务器设置cookie的值,本地保存 (2)Authentication cookie 存储关于用户登录状况的信息 使用 Authentication Cookie 可

Web信息安全实践_4.1 XSS防御

XSS 存在的三个条件 网站应用程序必须接受用户的输入信息 用户的输入会被网站用来创建动态内容 用户的输入验证不充分 输入过滤,输出转义:检查用户输入含有攻击信息,尽可能过滤攻击信息:如果不能判断哪些是攻击信息,那么要使得显示的时候不能发送攻击 输入过滤 使用黑名单,从用户的输入中删除 <script> 缺点:很难保证完全:限制了用户展示代码 <scr<script>ipt> //若仅过滤一个script,其他不检查 some<<b>script>

Web信息安全实践_4.0 XSS_知乎1

XSS攻击即为(Cross Site Scripting), 中文为跨站脚本. 之所以它的名字不是CSS而是XSS,是为了区分CSS. XSS攻击是发生在目标用户的浏览器上的,当渲染DOM树的过程中执行了不该执行的JS代码时,就发生了XSS攻击.跨站脚本的重点不是“跨站”,而是“脚本” 页面执行不该执行的JS 我们首先来看一下,页面执行不该执行的JS是什么意思.譬如我们来看这个代码: // 假设有一个自动回答网站:在框内输入一个问题,这个问题是通过$_GET['q']获取的:网站后台接收用户输入

Web信息安全实践_6 SQL注入

www.myzoo.com 输入示例 Login a'# 用户a登录 a' or 1# a' or 1=1# a' and 1;# d' or 1# a' or '1  思考:为什么无密码可以登录?为什么最终登录的都是a? b' or 0;#  用户b登录 profile a', Coins=100 where Username='a' ;# User c' union select 1,1,1,1,1,1,if(substring(database(),1,1)=char(119),bench

Web信息安全实践_2.6 JavaScript DOM_2.7 JavaScript 攻击

DOM (Document Object Model,文档对象模型) HTML DOM 定义了访问和操作 HTML 文档的标准方法 DOM 以树结构表达 HTML 文档 通过 HTML DOM,JavaScript 能够访问和改变 HTML 文档的所有元素 通过这个对象模型,JavaScript 获得创建动态 HTML 的所有力量: JavaScript 能改变页面中的所有 HTML 元素 JavaScript 能改变页面中的所有 HTML 属性 JavaScript 能改变页面中的所有 CSS

Web信息安全实践_1.3 HTTP

HHTP HTTPs:HTTP/ssl,安全的http Apache:HTTP服务器 SSL:安全的套接进程,应用层和tcp层中间,提供数据加密.身份认证 OpenSSL 浏览器/服务器交互 URL+HTML+HTTP→www URL(Uniform Resource Location,全局资源定位符) ∈ URI(Uniform Resource Identifiers) URL URL可定位到物理位置一台主机上一份文件的具体位置. e.g. HTTP请求 HTTP请求 方法:Get.Post

Web信息安全实践_1.7 OpenSSL

OpenSSL 用于实现SSL协议,能实现证书生成.证书签名.密钥生成.加解密等各种操作 命令行举例 openssl version openssl prime echo "encode me" |openssl | enc -base64 /*对字符串encode me进行base64编码*/ echo "ZW5jb2RIIG1lCg==" | openssl enc -base64 -d /*对经过base64进行编码的字符串进行解码*/ 自建HTTPS(使用O

Web信息安全实践_1.6 RSA

非对称加密示例 (SSL.SSL工作过程.非对称加密) Alice和Bob进行加密传输 Bob公开自己的公钥91 Alice把三位数123乘以91,将乘积的末三位发给Bob 如123×91=11193:将193发送给Bob Bob将收到的数乘11,取后三位,得到原始信息 如:193×11=2123,:得到123,解密成功 原理:91×11=1001 RSA算法示例 挑选两个质数,如 p=61和 q=53(在实际应用中,RSA要求是大质数) 计算N = p×q = 3233 计算(p-1)× (q