為你的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應用,但這樣做還是能起到一定的作用,視情況而用即可。
- 固定鏈接:http://www.pswuul.tw/add-csrf-protection-middleware-for-express
- 文章標簽:csrf,csurf,express,node,NodeJS,web,安全
- 掃二維碼:為你的Express應用增加CSRF防護
- 版權所有:除"轉載分享"分類外,未經注明,均為原創、整理,轉載請注明出處。
聽得我一頭霧水
2017.03.22,disqus匿名評論測試