咨詢電(diàn)話(huà):023-88959644    24小(xiǎo)時(shí)服務熱線:400-023-8809
NEWS CENTER ·
新聞動态
關注中技(jì)互聯 關注前沿

如何防止僞造跨站(zhàn)請(qǐng)求!

發表日期:2011-09-05    文章編輯:王東    浏覽次數(shù):10    标簽:

僞造跨站(zhàn)懇求引見

  僞造跨站(zhàn)懇求比拟難以防備,而且危害宏大(dà),攻擊者能夠經過這種方式惡作(zuò)劇(jù),發spam信息,删除數(shù)據等等。這種攻擊常見的表現方式有(yǒu):

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

  僞造表單,誘惑用戶提交。表單能夠是躲藏的,用圖片或鏈接的方式假裝。

  比拟常見而且也很(hěn)低(dī)價的防備手腕是在一切可(kě)能觸及用戶寫操作(zuò)的表單中參加一個(gè)随機且變換頻繁的字符串,然後在處置表單的時(shí)分對這個(gè)字符串停止檢查。這個(gè)随機字符串假如和(hé)當前用戶身份相關聯的話(huà),那(nà)麽攻擊者僞造懇求會(huì)比拟費事。

  yahoo對付僞造跨站(zhàn)懇求的方法是在表單裏參加一個(gè)叫.crumb的随機串;而facebook也有(yǒu)相似的處理(lǐ)方法,它的表單裏常常會(huì)有(yǒu)post_form_id和(hé)fb_dtsg。

  随機串代碼完成

  我們依照這個(gè)思緒,山(shān)寨一個(gè)crumb的完成,代碼如下:

<?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表示用戶獨一标識,而$ttl表示這個(gè)随機串的有(yǒu)效時(shí)間(jiān)。

  應用示例

  結構表單

  在表單中插入一個(gè)躲藏的随機串crumb

<input type=\"hidden\" name=\"crumb\" value=\"<?php echo Crumb::issueCrumb($uid)?>\">  
 


  處置表單 demo.php

  對crumb停止檢查

<?php if(Crumb::verifyCrumb($uid,    僞造跨站(zhàn)懇求引見
  僞造跨站(zhàn)懇求比拟難以防備,而且危害宏大(dà),攻擊者能夠經過這種方式惡作(zuò)劇(jù),發spam信息,删除數(shù)據等等。這種攻擊常見的表現方式有(yǒu):
  僞造鏈接,誘惑用戶點擊,或是讓用戶在不知情的狀況下訪問
  僞造表單,誘惑用戶提交。表單能夠是躲藏的,用圖片或鏈接的方式假裝。
  比拟常見而且也很(hěn)低(dī)價的防備手腕是在一切可(kě)能觸及用戶寫操作(zuò)的表單中參加一個(gè)随機且變換頻繁的字符串,然後在處置表單的時(shí)分對這個(gè)字符串停止檢查。這個(gè)随機字符串假如和(hé)當前用戶身份相關聯的話(huà),那(nà)麽攻擊者僞造懇求會(huì)比拟費事。
  yahoo對付僞造跨站(zhàn)懇求的方法是在表單裏參加一個(gè)叫.crumb的随機串;而facebook也有(yǒu)相似的處理(lǐ)方法,它的表單裏常常會(huì)有(yǒu)post_form_id和(hé)fb_dtsg。
  随機串代碼完成
  我們依照這個(gè)思緒,山(shān)寨一個(gè)crumb的完成,代碼如下:
<?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表示用戶獨一标識,而$ttl表示這個(gè)随機串的有(yǒu)效時(shí)間(jiān)。
  應用示例
  結構表單
  在表單中插入一個(gè)躲藏的随機串crumb

<input type=\"hidden\" name=\"crumb\" value=\"<?php echo Crumb::issueCrumb($uid)?>\">  

 
 
  處置表單 demo.php
  對crumb停止檢查
___FCKpd___2
 
POST[\'crumb\'])) {     //依照正常流程處置表單 } else {     //crumb校(xiào)驗失敗,錯誤提示流程 }

 

如沒特殊注明(míng),文章均為(wèi)中技(jì)互聯原創,轉載請(qǐng)注明(míng)來(lái)自www.zjcoo.com
相關新聞

CopyrightZJCOO technology Co., LTD. All Rights Reserved.    

渝ICP 備11003429号

  • qq客服
  • 公衆号
  • 手機版
  • 新浪微博