日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

CSRF 1 (转)

發布時間:2024/9/21 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CSRF 1 (转) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一.CSRF是什么?

  CSRF(Cross-site request forgery),中文名稱:跨站請求偽造,也被稱為:one click attack/session riding,縮寫為:CSRF/XSRF。

二.CSRF可以做什么?

  你這可以這么理解CSRF攻擊:攻擊者盜用了你的身份,以你的名義發送惡意請求。CSRF能夠做的事情包括:以你名義發送郵件,發消息,盜取你的賬號,甚至于購買商品,虛擬貨幣轉賬......造成的問題包括:個人隱私泄露以及財產安全。

三.CSRF的原理

要完成一次CSRF攻擊,受害者必須依次完成兩個步驟:

  1.登錄受信任網站A,并在本地生成Cookie。

  2.在不登出A的情況下,訪問危險網站B。

示例1:

  銀行網站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請求更新資源。

示例2:

  為了杜絕上面的問題,銀行決定改用POST請求完成轉賬操作。

銀行網站A的WEB表單如下:

<form?action="Transfer.php"?method="POST">
    <p>ToBankId:?<input?type="text"?name="toBankId"?/></p>
    <p>Money:?<input?type="text"?name="money"?/></p>
    <p><input?type="submit"?value="Transfer"?/></p>
  </form>

后臺處理頁面Transfer.php如下:

<?php
    session_start();
    if?(isset($_REQUEST['toBankId']?&& isset($_REQUEST['money']))
    {
    ??? buy_stocks($_REQUEST['toBankId'], $_REQUEST['money']);
    }
  ?>

危險網站B,仍然只是包含那句HTML代碼:

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

,你首先登錄了銀行網站A,然后訪問危險網站B,結果.....和示例1一樣,你再次沒了1000塊~T_T,事故的原因是:銀行后臺使用了$_REQUEST去獲取請求的數據,而$_REQUEST既可以獲取GET請求的數據,也可以獲取POST請求的數據,這就造成了在后臺處理程序無法區分這到底是GET請求的數據還是POST請求的數據。在PHP中,可以使用$_GET和$_POST分別獲取GET請求和POST請求的數據。在JAVA中,用于獲取請求數據request一樣存在不能區分GET請求數據和POST數據的問題。;

示例3:

  經過前面2個慘痛的教訓,銀行決定把獲取請求數據的方法也改了,改用$_POST,只獲取POST請求的數據,后臺處理頁面Transfer.php代碼如下:

<?php
    session_start();
    if?(isset($_POST['toBankId']?&& isset($_POST['money']))
    {
    ????buy_stocks($_POST['toBankId'], $_POST['money']);
    }
  ?>

然而,危險網站B與時俱進,它改了一下代碼: <html>
  <head>
    <script?type="text/javascript">
      function?steal()
      {
??????????     iframe?=?document.frames["steal"];
  ?????  ????? iframe.document.Submit("transfer");
      }
    </script>
  </head>

  <body?οnlοad="steal()">
    <iframe?name="steal"?display="none">
      <form?method="POST"?name="transfer" action="http://www.myBank.com/Transfer.php">
        <input?type="hidden"?name="toBankId"?value="11">
        <input?type="hidden"?name="money"?value="1000">
      </form>
    </iframe>
  </body>
</html> 如果用戶仍是繼續上面的操作,很不幸,結果將會是再次不見1000塊......因為這里危險網站B暗地里發送了POST請求到銀行! 總結一下上面3個例子,CSRF主要的攻擊模式基本上是以上的3種,其中以第1,2種最為嚴重,因為觸發條件很簡單,一個<img>就可以了,而第3種比較麻煩,需要使用JavaScript,所以使用的機會會比前面的少很多,但無論是哪種情況,只要觸發了CSRF攻擊,后果都有可能很嚴重。 理解上面的3種攻擊模式,其實可以看出,CSRF攻擊是源于WEB的隱式身份驗證機制!WEB的身份驗證機制雖然可以保證一個請求是來自于某個用戶的瀏覽器,但卻無法保證該請求是用戶批準發送的!

四.CSRF的防御

  我總結了一下看到的資料,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%的杜絕,這個不是最好的方法。

?

轉載于:https://www.cnblogs.com/lhq8998/p/7295435.html

總結

以上是生活随笔為你收集整理的CSRF 1 (转)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。