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