學(xué)習(xí)筆記之CSRF初級(jí)篇

什么是CSRF

成都創(chuàng)新互聯(lián)公司一直秉承“誠(chéng)信做人,踏實(shí)做事”的原則,不欺瞞客戶(hù),是我們最起碼的底線! 以服務(wù)為基礎(chǔ),以質(zhì)量求生存,以技術(shù)求發(fā)展,成交一個(gè)客戶(hù)多一個(gè)朋友!為您提供成都網(wǎng)站建設(shè)、成都網(wǎng)站制作、成都網(wǎng)頁(yè)設(shè)計(jì)、微信小程序定制開(kāi)發(fā)、成都網(wǎng)站開(kāi)發(fā)、成都網(wǎng)站制作、成都軟件開(kāi)發(fā)、重慶App定制開(kāi)發(fā)是成都本地專(zhuān)業(yè)的網(wǎng)站建設(shè)和網(wǎng)站設(shè)計(jì)公司,等你一起來(lái)見(jiàn)證!

CSRF(Cross-siterequestforgery跨站請(qǐng)求偽造,也被稱(chēng)為“oneclickattack”或者sessionriding,通??s寫(xiě)為CSRF或者XSRF,是一種對(duì)網(wǎng)站的惡意利用。盡管聽(tīng)起來(lái)像跨站腳本(XSS),但它與XSS非常不同,并且***方式幾乎相左。XSS利用站點(diǎn)內(nèi)的信任用戶(hù),而CSRF則通過(guò)偽裝來(lái)自受信任用戶(hù)的請(qǐng)求來(lái)利用受信任的網(wǎng)站。與XSS***相比,CSRF***往往不大流行(因此對(duì)其進(jìn)行防范的資源也相當(dāng)稀少)和難以防范,所以被認(rèn)為比XSS更具危險(xiǎn)性。

 

Xss與CSRF異同

CSRF與XSS在***手段上有點(diǎn)類(lèi)似,都是在客戶(hù)端執(zhí)行惡意代碼,有些文章中認(rèn)為CSRF與XSS的區(qū)別在于CSRF不注重于獲取用戶(hù)Cookie,筆者認(rèn)為可能還有區(qū)別在于CSRF不僅可以在源站發(fā)起***,還可以引導(dǎo)用戶(hù)訪問(wèn)其他危險(xiǎn)網(wǎng)站的同時(shí)發(fā)起***。

XSS全程是跨站腳本***,即***者向某個(gè)Web頁(yè)面中插入惡意的JavaScript腳本。而當(dāng)普通用戶(hù)訪問(wèn)時(shí),該惡意腳本自動(dòng)執(zhí)行而從盜取用戶(hù)的Cookie等信息。對(duì)于XSS的防御手段主要就是輸入檢查與輸出檢查,譬如對(duì)用戶(hù)輸入的文本框內(nèi)容進(jìn)行<、>這樣的特殊字符檢查。而輸出檢查則是指對(duì)于輸出到網(wǎng)頁(yè)的內(nèi)容進(jìn)行過(guò)濾或者編解碼,譬如使用HTML編碼將<轉(zhuǎn)義。

CSRF為跨站請(qǐng)求偽造,其與XSS有點(diǎn)類(lèi)似,不過(guò)區(qū)別在于CSRF不一定依賴(lài)于JavaScript,并且不僅可以在源站發(fā)起***,還有可能當(dāng)用戶(hù)訪問(wèn)惡意網(wǎng)站時(shí)引導(dǎo)其訪問(wèn)原網(wǎng)站。CSRF***是源于WEB的隱式身份驗(yàn)證機(jī)制,WEB的身份驗(yàn)證機(jī)制雖然可以保證一個(gè)請(qǐng)求是來(lái)自于某個(gè)用戶(hù)的瀏覽器,但卻無(wú)法保證該請(qǐng)求是用戶(hù)批準(zhǔn)發(fā)送的。對(duì)于CSRF的防御也分為服務(wù)端防御與客戶(hù)端防御兩種,服務(wù)端防御典型的譬如給某個(gè)頁(yè)面添加隨機(jī)數(shù),使得無(wú)法從第三方頁(yè)面直接提交。在客戶(hù)端防御的話可以利用譬如Firefox提供的一些檢查工具。注意,CSRF并沒(méi)有打破同源策略。

 

CSRF的危害

你這可以這么理解CSRF***:***者盜用了你的身份,以你的名義發(fā)送惡意請(qǐng)求。CSRF能夠做的事情包括:以你名義發(fā)送郵件,發(fā)消息,盜取你的賬號(hào),甚至于購(gòu)買(mǎi)商品,

虛擬貨幣轉(zhuǎn)賬等等造成的問(wèn)題包括:個(gè)人隱私泄露以及財(cái)產(chǎn)安全。

 

 

 下圖簡(jiǎn)單闡述了CSRF***的思想:

學(xué)習(xí)筆記之CSRF初級(jí)篇

從上圖可以看出,要完成一次CSRF***,受害者必須依次完成兩個(gè)步驟:

 1.登錄受信任網(wǎng)站A,并在本地生成Cookie。

 2.在不登出A的情況下,訪問(wèn)危險(xiǎn)網(wǎng)站B。

 看到這里,你也許會(huì)說(shuō):“如果我不滿足以上兩個(gè)條件中的一個(gè),我就不會(huì)受到CSRF的***”。是的,確實(shí)如此,但你不能保證以下情況不會(huì)發(fā)生:

1.你不能保證你登錄了一個(gè)網(wǎng)站后,不再打開(kāi)一個(gè)tab頁(yè)面并訪問(wèn)另外的網(wǎng)站。

2.你不能保證你關(guān)閉瀏覽器了后,你本地的Cookie立刻過(guò)期,你上次的會(huì)話已經(jīng)結(jié)束。(事實(shí)上,關(guān)閉瀏覽器不能結(jié)束一個(gè)會(huì)話,但大多數(shù)人都會(huì)錯(cuò)誤的認(rèn)為關(guān)閉瀏覽器就等于退出登錄/結(jié)束會(huì)話了......)

3.上圖中所謂的***網(wǎng)站,可能是一個(gè)存在其他漏洞的可信任的經(jīng)常被人訪問(wèn)的網(wǎng)站。同樣也可以是一個(gè)惡意的url。

 

SCRF觸發(fā)條件

1、被***者的用戶(hù)cookies

2、惡意的url或表單

 

CSRF的防御

CSRF的防御可以從服務(wù)端和客戶(hù)端兩方面著手,防御效果是從服務(wù)端著手效果比較好,現(xiàn)在一般的CSRF防御也都在服務(wù)端進(jìn)行。

 

 1.服務(wù)端進(jìn)行CSRF防御

 服務(wù)端的CSRF方式方法很多樣,但總的思想都是一致的,就是在客戶(hù)端頁(yè)面增加偽隨機(jī)數(shù)。

 (1).Cookie Hashing(所有表單都包含同一個(gè)偽隨機(jī)值):

 這可能是最簡(jiǎn)單的解決方案了,因?yàn)?**者不能獲得第三方的Cookie(理論上),所以表單中的數(shù)據(jù)也就構(gòu)造失敗了

<?php
    //構(gòu)造加密的Cookie信息
    $value = “DefenseSCRF”;
    setcookie(”cookie”, $value,time()+3600);
  ?>

   在表單里增加Hash值,以認(rèn)證這確實(shí)是用戶(hù)發(fā)送的請(qǐng)求。

  <?php
    $hash = md5($_COOKIE['cookie']);
  ?>
  <form method=”P(pán)OST”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>

 然后在服務(wù)器端進(jìn)行Hash值驗(yàn)證

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

 這個(gè)方法目前覺(jué)得已經(jīng)可以杜絕大多數(shù)***了,那還有少數(shù)由于用戶(hù)的Cookie很容易由于網(wǎng)站的XSS漏洞而被盜取,一般的***者看到有需要算Hash值,基本都會(huì)放棄了,當(dāng)然也有些人除外,所以如果需要100%的杜絕,這并不是最好的方法。

 (2).驗(yàn)證碼

 這個(gè)方案的思路是:每次的用戶(hù)提交都需要用戶(hù)在表單中填寫(xiě)一個(gè)圖片上的隨機(jī)字符串,厄....這個(gè)方案可以完全解決CSRF,但個(gè)人覺(jué)得在易用性方面似乎不是太好,還有聽(tīng)聞是驗(yàn)證碼圖片的使用涉及了一個(gè)被稱(chēng)為MHTML的Bug,可能在某些版本的微軟IE中受影響。

 (3).One-Time Tokens(不同的表單包含一個(gè)不同的偽隨機(jī)值)

 在實(shí)現(xiàn)One-Time Tokens時(shí),需要注意一點(diǎn):就是“并行會(huì)話的兼容”。如果用戶(hù)在一個(gè)站點(diǎn)上同時(shí)打開(kāi)了兩個(gè)不同的表單,CSRF保護(hù)措施不應(yīng)該影響到他對(duì)任何表單的提交。考慮一下如果每次表單被裝入時(shí)站點(diǎn)生成一個(gè)偽隨機(jī)值來(lái)覆蓋以前的偽隨機(jī)值將會(huì)發(fā)生什么情況:用戶(hù)只能成功地提交他最后打開(kāi)的表單,因?yàn)樗衅渌谋韱味己蟹欠ǖ膫坞S機(jī)值。必須小心操作以確保CSRF保護(hù)措施不會(huì)影響選項(xiàng)卡式的瀏覽或者利用多個(gè)瀏覽器窗口瀏覽一個(gè)站點(diǎn)。

 以下我的實(shí)現(xiàn):

 1).先是令牌生成函數(shù)(gen_token()):

  <?php
    function gen_token() {
              $token = md5(uniqid(rand(), true));
         return $token;
    }

   

 2).然后是Session令牌生成函數(shù)(gen_stoken()):  

  <?php
       function gen_stoken() {
      $pToken = "";
      if($_SESSION[STOKEN_NAME]  == $pToken){
        //沒(méi)有值,賦新值
        $_SESSION[STOKEN_NAME] =gen_token();
      }   
      else{
        //繼續(xù)使用舊的值
      }
       }
    ?>

 3).WEB表單生成隱藏輸入域的函數(shù):  

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

 

   4).WEB表單結(jié)構(gòu): 

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

 5).服務(wù)端核對(duì)令牌

網(wǎng)站標(biāo)題:學(xué)習(xí)筆記之CSRF初級(jí)篇
轉(zhuǎn)載注明:http://bm7419.com/article24/jccpje.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供用戶(hù)體驗(yàn)、營(yíng)銷(xiāo)型網(wǎng)站建設(shè)面包屑導(dǎo)航、靜態(tài)網(wǎng)站網(wǎng)站維護(hù)、動(dòng)態(tài)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都做網(wǎng)站