web 安全

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)證。這里我用的方式是

  1. 雙方先約定加密key 值,請(qǐng)求方攜帶參數(shù)、對(duì)參數(shù)加密的sign
  2. 接收方對(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ù)的感受!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容