zoukankan      html  css  js  c++  java
  • 安全相关的问题、CSRF攻击、怎么确保数据传输中的安全性?

    CSRF攻击

      又叫“跨站请求伪造”。可以这么理解CSRF攻击:攻击者盗用了你的身份,以你的名义发送恶意请求。CSRF能够做的事情包括:以你的名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账......造成的问题包括:个人隐私泄露以及财产安全。

      下图简单阐述了CSRF攻击的思想:

                      

      1、用户C打开浏览器,访问受信任网站A,输入用户名和密码请求登陆网站A;

      2、在用户信息通过验证后,网站A产生Cookie信息并返回给浏览器,此时用户登陆网站A成功,可以正常发送请求到网站A;

      3、用户未退出网站A之前,在同一浏览器中,打开一个TAB页访问网站B;

      4、网站B接收到用户请求后,返回一些攻击性代码,并发出一个请求要求访问第三方站点A;

      5、浏览器在接收到这些攻击性代码后,根据网站B的请求,在用户不知情的情况下携带Cookie信息,向网站A发出请求。网站A并不知道该请求其实是由B发起的,所以会根据用户C的Cookie信息以C的权限处理该请求,导致来自网站B的恶意代码被执行。

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

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

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

    示例:

      银行网站A,它以GET请求来完成银行转账的操作。如:http://www.mybank.com/Transfer.php?toBankId=11&money=1000

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

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

      首先,你登陆了银行网站A,然后访问危险网站B,噢,这时你会发现你的银行账户少了1000块。

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

    防御方法

      1、CSRF攻击是有条件的,当用户访问恶意链接时,认证的cookie仍然有效,所以当用户关闭页面时要及时清除认证cookie。

      2、在客户端页面增加伪随机数。在所有POST方法提交的数据中提供一个不可预测的参数,比如一个随机数或者一个根据时间计算的HASH值,并且在cookie中也同样保存这个参数值(保证两者值一致)。把这个参数嵌入标签保存在FORM表单中,当浏览器提交POST请求到服务器端时,从POST数据中取出这个参数并且和Cookie中的值作比较, 如果两个值相等则认为请求有效,不相等则拒绝。根据同源策略和Cookie的安全策略,第三方网页是无法取得Cookie中的参数值的。所以它不能构造出相同随即参数的POST请求。

        <?php

          //构造加密的Cookie信息

          $value = "DefenseSCRF";

          setcookie("cookie",$value,time()+3600);

        ?>

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

     1 <?
     2     $hash = md5($_COOKIE['cookie']);
     3 ?>
     4 <form method="POST" action="transfer.php">
     5     <input type="text" name="toBankId">
     6     <input type="text" name="money">
     7     <input type="hidden" name="hash" value="<?=$hash;?>">
     8     <input type="submit" name="submit" value="Submit">
     9 </form>
    10 //然后在服务器端进行Hash值验证
    11 <?php
    12     if(isset($_POST['check'])){
    13         $hash=md5($_COOKIE['cookie']);
    14         if($_POST['check'] == $hash){
    15             doJob();
    16         }else{
    17             //...
    18         }
    19     }else{
    20         //...
    21     }
    22 ?>

      3、图片验证码

    怎么确保数据传输过程中的安全性?

    1、数据加密

      1.1、单向散列算法:MD5、SHA1

      MD5是单向散列算法,可用来校验数据的完整性。

      功能:

        输入任意长度的信息,经过处理,输出为128位的信息(数字指纹);

        不同的输入得到不同的结果(唯一性);

        根据128位的输出结果不可能反推出输入信息(不可逆);

      用途:

        1)防止被篡改,比如我提供文件下载,为了防止不法分子在安装程序中添加木马,我可以在网站上公布有安装文件得到的MD5输出结果。

        2)防止直接看到明文,现在很多网站在数据库存储用户的密码的时候都是存储用户密码的MD5值。这样就算不法分子得到数据库的用户密码的MD5值,也无法知道用户的密码。

        3)防止抵赖(数字签名),例如A写了一个文件,认证机构对此文件用MD5 算法产生摘要信息并做好记录。这样可以防止出现以后A不承认此事而带来的麻烦。

      1.2、对称加密算法:DES、AES、RC4。

        对称加密,就是加密和解密都使用同一个密钥,这种方式优点就是速度快,缺点就是在管理和分配密钥时不安全。

        AES:高级加密标准,是下一代的加密算法标准,速度快,安全级别高。

      1.3、非对称加密算法:RSA,DSA。

        非对成加密有一个密钥对,叫做公钥和私钥。私钥自己持有,公钥可以公开的发送给使用人。使用公钥进行加密的信息,只有和其配对的私钥可以解开。非对成加密的优点是安全,因为它不需要把私钥暴露出去。

    那在真正使用的时候,要怎样进行数据的传输?

      在正式的使用场景中一般都是对称加密和非对成加密结合使用,使用非对成加密完成密钥的传递,然后使用对称加密进行数据加密和解密,HTTP传输在建立连接时使用的是非对成加密,一旦连接建立完成,有后续的通讯则使用了对称加密,这样做的好处是有利于数据传输效率。

  • 相关阅读:
    kubernetes---Init-Container
    kubernetes---affinity--taint
    kubernetes---pod调度
    kubernetes---项目部署
    StatefulSet
    kubernetes---存储--PV--PVC
    pod-pod控制器-service-ingress
    jenkins
    django中的验证码
    django中的缓存
  • 原文地址:https://www.cnblogs.com/HuiH/p/12607030.html
Copyright © 2011-2022 走看看