安全相关的问题、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传输在建立连接时使用的是非对成加密,一旦连接建立完成,有后续的通讯则使用了对称加密,这样做的好处是有利于数据传输效率。

 

posted @ 2020-03-31 18:28  MrHH  阅读(...)  评论(...编辑  收藏