1. 程式人生 > >通過jquery讀cookie新增xsrf HTTP頭來避免請求偽造

通過jquery讀cookie新增xsrf HTTP頭來避免請求偽造

問題前因

如果使用者已經登入了我們的a.com網站,使用者又打開了一個惡意網站 evil.com,那麼evil.com可以向a.com傳送http請求,比如傳送ajax,並且在傳送時,可以通過設定ajax的屬性,讓這個請求帶上a.com的cookie。
這樣的話問題就來了,這個請求被a.com網站看來是合法的,並進行處理,但這個請求可能是偽造的並不是使用者的本意

如何破?

方法一:

對每一個http請求都加一個“隱藏”引數,伺服器處理請求時,校驗這個引數。這個方法要求我們開發人員都要改程式碼,給每一個請求(比如表單提交)填一個隱藏引數,耗人力。

方法二:

使用者登入時,給使用者session中生成一個隨機數,並把這個隨機數寫到瀏覽器的cookie中,

req.session.xsrfToken = req.session.xsrfToken || secret.getRandomToken();
res.cookie("XSRF-TOKEN", req.session.xsrfToken, { path: '/' });

以後的所有jquery ajax請求中,利用如下程式碼填上一個X-XSRF-TOKEN頭:

//全域性配置jquery ajax請求填上防止跨域請求偽造的http頭X-XSRF-TOKEN
if (window.$ && window.$.ajaxSetup) {
   $.ajaxSetup({
        beforeSend: function (xhr) {
        var match
= window.document.cookie.match(/(?:^|\s|;)XSRF-TOKEN\s*=\s*([^;]+)(?:;|$)/); xhr.setRequestHeader("X-XSRF-TOKEN", match && match[1]); } }); }

伺服器收到請求後,統一檢查此http頭和使用者session的隨機數是否一致

我們node伺服器的檢查程式碼如下:

if (req.session.xsrfToken && req.session.xsrfToken !== req.headers['x-xsrf-token'
]) { res.send(403, 'no x-xsrf-token'); //以後去掉這個錯誤提示 return; }