為你的Express應用增加CSRF防護打賞

CSRF(Cross-site request forgery)跨站請求偽造,也被稱為"One Click Attack"或者Session Riding,通常縮寫為CSRF或者XSRF,是一種對網站的惡意利用。盡管聽起來像跨站腳本(XSS),但它與XSS非常不同,XSS利用站點內的信任用戶,而CSRF則通過偽裝來自受信任用戶的請求來利用受信任的網站。與XSS攻擊相比,CSRF攻擊往往不大流行(因此對其進行防范的資源也相當稀少)和難以防范,所以被認為比XSS更具危險性。

眾所周知,Web系統并沒有絕對的安全,就比如我們公司年前遇到的情況,有些惡心網站通過網絡抓包等手段,截取驗證碼發送接口,通過偽造請求實現了傳入任意手機號并發送驗證碼的功能,雖然這看起來并沒有什么用,但當這些不法分子拔了成百上千個接口后,就形成了一個瘋狂的短信轟炸機,對于服務提供者,這些地下網站只要有人使用,就會不斷得消耗短信費用,給企業帶來不必要的損失。

當然,這只是個例中的一個,其他種種安全隱患,不在一一舉例,這里也是因為公司接口被這些不法分子惡意利用,才想到增加CSRF防護。

因為網站采用中途島模式,后端Java,前端后端之間架設一層NodeJS的橋梁,為了避免跨域,所有api通過NodeJS層中轉,而NodeJS層使用了Express作為Web服務器,所以這里可以采用中間件(csurf)很簡單的實現CSRF防護,下面簡單的集成步驟:

1、安裝csurf

npm install csurf --save

2、在全局范圍或特定需要做控制的頁面輸出csrf token

//全局路由
router.all('*', csrf({
    cookie: true
}), function (req, res, next) {
    next();
});

3、在表單提交或異步接口請求發出時攜帶第二步輸出的csrf token,用于后端校驗,校驗通過,走正常業務邏輯,反之返回403

//server api
router.all('/api/*', csrf({
    cookie: true,
    //攔截所有method,默認忽略['GET', 'HEAD', 'OPTIONS']
    ignoreMethods: []
}), function (req, res, next) {
    next();
});

如此配置后,不攜帶csrf token的請求都會呈現403或自己自定義錯誤信息頁面等。

但這樣還是免不了別人通過抓取頁面等形式獲取csrf token并在偽造請求時一同發出,考慮到什么短信轟炸機之類的作者都是大量接口使用,不會在意個別接口的單獨校驗,這里就沒進一步處理。如果有類似需求,可以考慮,csrf token輸出時加密,回傳時解密后回傳,也可以實現多種加密方案,每次配對動態輸出到頁面,另外最好額外增加圖片驗證碼、SSL等。

最后在補充一句,沒有絕對安全的Web應用,但這樣做還是能起到一定的作用,視情況而用即可。

為你的Express應用增加CSRF防護
文章《為你的Express應用增加CSRF防護》二維碼
  • 微信打賞
  • 支付寶打賞

已有2條評論

  1. 游客 343

    聽得我一頭霧水

    2017-07-18 11:33 回復
  2. 窮小子

    2017.03.22,disqus匿名評論測試

    2017-03-22 14:44 回復

(必填)

(必填)

(可選)

黑龙江22选5开奖