主页 > PHP教程 > 正文

CSRF的防护实例(PHP)

  CSRF的防护能够从服务端和客户端两方面着手,防护作用是从服务端着手作用比较好,现在一般的CSRF防护也都在服务端进行。

  1.服务端进行CSRF防护

  服务端的CSRF方式办法很多样,但总的思维都是共同的,便是在客户端页面添加伪随机数。

  (1).Cookie Hashing(一切表单都包括同一个伪随机值):

  这可能是最简略的处理计划了,由于进犯者不能取得第三方的Cookie(理论上),所以表单中的数据也就结构失利了:>

 

 <?php
    //结构加密的Cookie信息
    $value = “DefenseSCRF”;
    setcookie(”cookie”, $value, time()+3600);
  ?>

  在表单里添加Hash值,以认证这确实是用户发送的恳求。

  <?php
    $hash = md5($_COOKIE['cookie']);
  ?>
  <form method=”POST” action=”transfer.php”>
    <input type=”text” name=”toBankId”>
    <input type=”text” name=”money”>
    <input type=”hidden” name=”hash” value=”<?=$hash;?>”>
    <input type=”submit” name=”submit” value=”Submit”>
  </form>

  然后在服务器端进行Hash值验证

    <?php
        if(isset($_POST['check'])) {
             $hash = md5($_COOKIE['cookie']);
             if($_POST['check'] == $hash) {
                  doJob();
             } else {
        //...
             }
        } else {
      //...
        }
      ?>

  这个办法个人觉得现已能够根绝99%的CSRF进犯了,那还有1%呢....由于用户的Cookie很简单由于网站的XSS缝隙而被盗取,这就别的的1%。一般的进犯者看到有需求算Hash值,根本都会抛弃了,某些在外,所以假如需求100%的根绝,这个不是最好的办法。

  (2).验证码

  这个计划的思路是:每次的用户提交都需求用户在表单中填写一个图片上的随机字符串,厄....这个计划能够彻底处理CSRF,但个人觉得在易用性方面好像不是太好,还有听闻是验证码图片的运用触及了一个被称为MHTML的Bug,可能在某些版别的微软IE中受影响。

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

  在完成One-Time Tokens时,需求留意一点:便是“并行会话的兼容”。假如用户在一个站点上一起翻开了两个不同的表单,CSRF保护措施不应该影响到他对任何表单的提交。考虑一下假如每次表单被装入时站点生成一个伪随机值来掩盖曾经的伪随机值将会发作什么情况:用户只能成功地提交他最终翻开的表单,由于一切其他的表单都含有不合法的伪随机值。有必要当心操作以保证CSRF保护措施不会影响选项卡式的阅读或许运用多个阅读器窗口阅读一个站点。

  以下我的完成:

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

 <?php
     function gen_token() {
     //这儿我是贪便利,实际上单运用Rand()得出的随机数作为令牌,也是不安全的。
    //这个能够参阅我写的Findbugs笔记中的《Random object created and used only once》
          $token = md5(uniqid(rand(), true));
          return $token;
     }

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

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

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

     <?php
       function gen_input() {
            gen_stoken();
            echo “<input type=\”hidden\” name=\”" . FTOKEN_NAME . “\”
                 value=\”" . $_SESSION[STOKEN_NAME] . “\”> “;
       }
     ?>

  4).WEB表单结构:

     <?php
          session_start();
          include(”functions.php”);
     ?>
     <form method=”POST” action=”transfer.php”>
          <input type=”text” name=”toBankId”>
          <input type=”text” name=”money”>
          <? gen_input(); ?>
          <input type=”submit” name=”submit” value=”Submit”>
     </FORM>

  5).服务端核对令牌:

  这个很简略,这儿就不再烦琐了。

  上面这个其实不彻底契合“并行会话的兼容”的规矩,咱们能够在此根底上修正。


文章参阅自:http://www.cnblogs.com/hyddd/archive/2009/04/09/1432744.html

上一篇:跨站恳求假造CSRF攻防
下一篇:PHP中的traits运用详解

PythonTab微信大众号:

Python技能交流合作群 ( 请勿加多个群 ):

群1: 87464755

群2: 333646237

群3: 318130924

群4: 385100854