欧美激情网,国产欧美亚洲高清,欧美屁股xxxxx,欧美群妇大交群,欧美人与物ⅴideos另类,区二区三区在线 | 欧洲

知識學(xué)堂
  • ·聯(lián)系電話:+86.023-75585550
  • ·聯(lián)系傳真:+86.023-75585550
  • ·24小時手機:13896886023
  • ·QQ 咨 詢:361652718 513960520
當(dāng)前位置 > 首頁 > 知識學(xué)堂 > 網(wǎng)站建設(shè)知識
本站教您如何防止偽造跨站請求
更新時間:2011-09-03 | 發(fā)布人:本站 | 點擊率:544

偽造跨站請求介紹

  偽造跨站請求比較難以防范,而且危害巨大,攻擊者可以通過這種方式惡作劇,發(fā)spam信息,刪除數(shù)據(jù)等等。這種攻擊常見的表現(xiàn)形式有:

  偽造鏈接,引誘用戶點擊,或是讓用戶在不知情的情況下訪問

  偽造表單,引誘用戶提交。表單可以是隱藏的,用圖片或鏈接的形式偽裝。

  比較常見而且也很廉價的防范手段是在所有可能涉及用戶寫操作的表單中加入一個隨機且變換頻繁的字符串,然后在處理表單的時候?qū)@個字符串進行檢查。這個隨機字符串如果和當(dāng)前用戶身份相關(guān)聯(lián)的話,那么攻擊者偽造請求會比較麻煩。

  yahoo對付偽造跨站請求的辦法是在表單里加入一個叫.crumb的隨機串;而facebook也有類似的解決辦法,它的表單里常常會有post_form_id和fb_dtsg。

  隨機串代碼實現(xiàn)

  咱們按照這個思路,山寨一個crumb的實現(xiàn),代碼如下:

<?php class Crumb {                                                                                                        CONST SALT = "your-secret-salt";                                                               static $ttl = 7200;                                                                                                 static public function challenge($data) {         return hash_hmac('md5', $data, self::SALT);     }                                                                                                                   static public function issueCrumb($uid, $action = -1) {         $i = ceil(time() / self::$ttl);         return substr(self::challenge($i . $action . $uid), -12, 10);     }                                                                                                                   static public function verifyCrumb($uid, $crumb, $action = -1) {         $i = ceil(time() / self::$ttl);                                                                                     if(substr(self::challenge($i . $action . $uid), -12, 10) == $crumb ||             substr(self::challenge(($i - 1) . $action . $uid), -12, 10) == $crumb)             return true;                                                                                                    return false;     }                                                                                                               } 

  代碼中的$uid表示用戶唯一標(biāo)識,而$ttl表示這個隨機串的有效時間。

  應(yīng)用示例

  構(gòu)造表單

  在表單中插入一個隱藏的隨機串crumb

<form method="post" action="demo.php"> <input type="hidden" name="crumb" value="<?php echo Crumb::issueCrumb($uid)?>"> <input type="text" name="content"> <input type="submit"> </form> 

 

  處理表單 demo.php

  對crumb進行檢查

<?php if(Crumb::verifyCrumb($uid,    偽造跨站請求介紹
  偽造跨站請求比較難以防范,而且危害巨大,攻擊者可以通過這種方式惡作劇,發(fā)spam信息,刪除數(shù)據(jù)等等。這種攻擊常見的表現(xiàn)形式有:
  偽造鏈接,引誘用戶點擊,或是讓用戶在不知情的情況下訪問
  偽造表單,引誘用戶提交。表單可以是隱藏的,用圖片或鏈接的形式偽裝。
  比較常見而且也很廉價的防范手段是在所有可能涉及用戶寫操作的表單中加入一個隨機且變換頻繁的字符串,然后在處理表單的時候?qū)@個字符串進行檢查。這個隨機字符串如果和當(dāng)前用戶身份相關(guān)聯(lián)的話,那么攻擊者偽造請求會比較麻煩。
  yahoo對付偽造跨站請求的辦法是在表單里加入一個叫.crumb的隨機串;而facebook也有類似的解決辦法,它的表單里常常會有post_form_id和fb_dtsg。
  隨機串代碼實現(xiàn)
  咱們按照這個思路,山寨一個crumb的實現(xiàn),代碼如下:
<?php class Crumb {                                                                                                        CONST SALT = "your-secret-salt";                                                               static $ttl = 7200;                                                                                                 static public function challenge($data) {         return hash_hmac('md5', $data, self::SALT);     }                                                                                                                   static public function issueCrumb($uid, $action = -1) {         $i = ceil(time() / self::$ttl);         return substr(self::challenge($i . $action . $uid), -12, 10);     }                                                                                                                   static public function verifyCrumb($uid, $crumb, $action = -1) {         $i = ceil(time() / self::$ttl);                                                                                     if(substr(self::challenge($i . $action . $uid), -12, 10) == $crumb ||             substr(self::challenge(($i - 1) . $action . $uid), -12, 10) == $crumb)             return true;                                                                                                    return false;     }                                                                                                               }
 
  代碼中的$uid表示用戶唯一標(biāo)識,而$ttl表示這個隨機串的有效時間。
  應(yīng)用示例
  構(gòu)造表單
  在表單中插入一個隱藏的隨機串crumb
<form method="post" action="demo.php"> <input type="hidden" name="crumb" value="<?php echo Crumb::issueCrumb($uid)?>"> <input type="text" name="content"> <input type="submit"> </form>
 
 
  處理表單 demo.php
  對crumb進行檢查
___FCKpd___2
 
POST['crumb'])) {     //按照正常流程處理表單 } else {     //crumb校驗失敗,錯誤提示流程 }