如何有效防范偽造跨站請求
什么是偽造跨站請求偽造跨站請求是一種難以防范的攻擊方式,攻擊者可以通過偽造請求進行惡作劇、發(fā)垃圾信息、刪除數(shù)據(jù)等危害。通常表現(xiàn)為偽造鏈接引誘用戶點擊或在用戶不知情的情況下訪問,以及偽造表單引誘用戶提
什么是偽造跨站請求
偽造跨站請求是一種難以防范的攻擊方式,攻擊者可以通過偽造請求進行惡作劇、發(fā)垃圾信息、刪除數(shù)據(jù)等危害。通常表現(xiàn)為偽造鏈接引誘用戶點擊或在用戶不知情的情況下訪問,以及偽造表單引誘用戶提交,表單可能隱藏、用圖片或鏈接偽裝。
常見防范手段
一種常見且廉價的防范手段是在所有涉及用戶寫操作的表單中加入一個隨機且頻繁變換的字符串,在處理表單時對該字符串進行檢查。如果隨機字符串與當前用戶身份相關(guān)聯(lián),那么攻擊者要偽造請求就會變得更加困難。Facebook等平臺也采取類似措施,在表單中常添加像`.crumb`、`post_form_id`和`fb_dtsg`等字段來防范偽造跨站請求。
實現(xiàn)隨機串代碼
按照上述思路,實現(xiàn)一個名為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;
}
}
```
構(gòu)造包含隨機串的表單
在表單中插入一個隱藏的隨機串crumb:
```html
```
對隨機串進行檢查
在處理表單時,需要對隨機串crumb進行驗證:
```php
if(Crumb::verifyCrumb($uid, $_POST['crumb'])) {
// 處理表單
} else {
// 錯誤提示
}
```
通過上述方法,可以有效防范偽造跨站請求的攻擊,保護用戶數(shù)據(jù)安全和系統(tǒng)正常運行。在網(wǎng)站開發(fā)中,務(wù)必重視安全性,避免因漏洞而導(dǎo)致信息泄露或損害。