web 安全一直是個(gè)話題,常見的包括防范crsf攻擊、sql注入,對(duì)存儲(chǔ)在服務(wù)器的敏感數(shù)據(jù)如用戶信息進(jìn)行加密處理;防止程序攻網(wǎng)絡(luò)資源,使用驗(yàn)證碼進(jìn)行識(shí)別;對(duì)于垃圾信息,敏感信息進(jìn)行過濾在存儲(chǔ)等。
csrf 防范
前段時(shí)間在laravel框架下寫了一個(gè)上傳excel的功能,請(qǐng)求被認(rèn)為是csrf攻擊被攔截了。于是就花時(shí)間了解什么是csrf(跨站請(qǐng)求偽造),對(duì)crsf不太清楚的同學(xué)可以戳這里。
laravel框架對(duì)前端的每一次請(qǐng)求都會(huì)返回一個(gè)cookie,key為XSRF-TOKEN,接下來的請(qǐng)求要在頭部攜帶前一次返回的cookie 才能通過csrf 驗(yàn)證。
# 前端實(shí)現(xiàn)
<el-upload
ref='upload'
action="/xx/addData"
:headers="headers"
:limit="1"
:show-file-list="false"
:on-progress="xx"
:on-success="xx"
:on-error="xx"
:accept="uploadAccept">
<el-tooltip class="item" effect="dark" content="只能上傳csv/xlsx且不超過2G" placement="top">
<el-button size="small" type="primary">上傳</el-button>
</el-tooltip>
</el-upload>
這個(gè)上傳excel文件應(yīng)用element ui組件,被認(rèn)為是csrf攻擊是未在請(qǐng)求頭部攜帶相應(yīng)的cookie,由于其他請(qǐng)求是通過axios發(fā)起的,內(nèi)部會(huì)自動(dòng)實(shí)現(xiàn),所以能通過安全認(rèn)證??梢赃@樣解決
headers: {'X-XSRF-TOKEN': this.getCookie('XSRF-TOKEN')}
# 獲取本地的cookie
getCookie(name) {
let cookiesList = document.cookie.split(';');
for (let cookie of cookiesList) {
let arr = cookie.split('=');
if (arr[0] === name) {
return decodeURIComponent(arr[1]);
}
}
return '';
}
因?yàn)殚_發(fā)者不能獲取其他域名下的cookie,這樣是可以防范csrf的
api 認(rèn)證
很多時(shí)候我們發(fā)送請(qǐng)求都是b2s,就是客戶端給服務(wù)端發(fā)送請(qǐng)求,但有時(shí)也需要在后端請(qǐng)求另外一個(gè)服即s2s。比如利用php guzzlehttp/guzzle http客戶端,這必定涉及api 驗(yàn)證。這里我用的方式是
- 雙方先約定加密key 值,請(qǐng)求方攜帶參數(shù)、對(duì)參數(shù)加密的sign
- 接收方對(duì)參數(shù)重新加密一次,再對(duì)比sign,檢查參數(shù)是否被篡改
在php 中是這樣實(shí)現(xiàn)的,
# 利用 hash_hmac sha256 算法,返回 params 加密后 的sign 字符串
private function makeSign($params = [])
{
ksort($params);
$str = '';
foreach ($params as $k => $v) {
if(!is_null($v)) {
$str .= '#' . $k . '|' . $v;
}
}
// appkey 是加密時(shí)用的key
return hash_hmac("sha256", $str, $this->appkey);
}
小程序開發(fā)請(qǐng)求微信服務(wù)端api,也是要先獲取請(qǐng)求的調(diào)用憑證 accessToken,獲取這個(gè)憑證需要提供該小程序的appid、appAppSecret,憑證也是有時(shí)限性的。微信也對(duì)用戶的信息進(jìn)行加密后返回,比如運(yùn)動(dòng)步數(shù),開發(fā)者必須請(qǐng)求加密密鑰才能把信息解密。
歡迎大家給我留言,提建議,指出錯(cuò)誤,一起討論學(xué)習(xí)技術(shù)的感受!