2013-07-08 21 views
5

私はDjango(1.5)でシンプルなマルチプレイヤーゲームアプリを開発中です。例のhereに続いて、私はクライアント接続を管理するために別々のNode.jsサーバとSocket.ioを使用しています。上記のチュートリアルでは、APIのビューの@csrf_exemptを使用していますNode.jsからDjangoにCSRFトークンを渡す

  1. 私の質問は二つの部分に分解します。 POSTはクライアントから来たものではなく、localhost経由のNode.jsサーバーから来ているので、このビューにCSRF保護を使用しないことで、私はどのようなことに晒されていますか?

  2. 私は上記のことがわからないので、私はCSRF保護を使用したいと思います。 Djangoが提供するクッキー(the docsのように)からCSRFトークンを抽出し、それをPOSTとともに送信しようとしましたが、まだ403の応答があります。

game_server.js:

io.configure(function() { 
    io.set('authorization', function (data, accept) { 
     if (data.headers.cookie) { 
      data.cookie = cookie_reader.parse(data.headers.cookie); 
      return accept(null, true); 
     } 
     return accept('error', false); 
    }); 
    io.set('log level', 1); 
}); 

io.sockets.on('connection', function (socket) { 

    socket.on('check_word', function (data) { 
     values = querystring.stringify({ 
      word: data, 
      sessionid: socket.handshake.cookie['sessionid'] 
     }); 

     var options = { 
      host: 'localhost', 
      port: 8000, 
      path: '/node/check_word', 
      method: 'POST', 
      headers: { 
       'X-CSRFToken': socket.handshake.cookie['csrftoken'], 
       'Content-Type': 'application/x-www-form-urlencoded', 
       'Content-Length': values.length 
      } 
     }; 

     var req = http.request(options, function (res) { 
      res.setEncoding('utf8'); 

      res.on('data', function (message) { 
       if (message) { 
        console.log(message); 
       } 
      }); 
     }); 

     req.write(values); 
     req.end(); 
    }); 
}); 

はgame.html(のみスクリプト部分):任意の洞察力が大きくなり

@ensure_csrf_cookie 
def check_word(request): 
    return HttpResponse("MATCH:" + request.POST.get('word')) 

(function ($) { 
    var socket = io.connect('localhost', { port: 4000 }); 

    socket.on('connect', function() { 
    console.log("connected"); 
    }); 

    word_el = $('#word-input'); 

    word_el.keypress(function (event) { 
    if (event.keyCode === 13) { 
     // Enter key pressed 
     var word = word_el.attr('value'); 
     if (word) { 
     socket.emit('check_word', word, function (data) { 
      console.log(data); 
     }); 
     } 

     word_el.attr('value', ''); 
    } 
    }); 
})(jQuery); 

views.py感謝!

答えて

2

かなりの研究と実験の後、私はこの問題を解決しました。

私の調査結果:この特定場合

  1. 、CSRFは、意味のある攻撃に私を公開しません。理論的には、ゲームで不正行為のルートを開くが、それはゼロ報酬のために多くの難しさ(セッションIDの作成と現在進行中のゲームのターゲット設定を必要とする)です。ただし、チャットなどの他のアプリケーションでは、CSRFの脆弱性により、他のユーザーを偽装することが可能になります。これはより重要な問題です。そして、私たちはもっと深く掘り下げていきます...

  2. 私はAJAXヘッダーで問題を解決しようとしていましたが、間違いでした。 1つは、リクエストが実際にAJAXを経由するのではないということです。 (request.is_ajax()はビュー内でFalseを返します).2番目に、Djangoから受け取ったエラーページには、エラーの原因としてCSRF cookie not setが挙げられます。溶液に蓄積すべてが

var options = { 
    // snip... 
    headers: { 
     'Cookie': 'csrftoken=' + socket.handshake.cookie['csrftoken'], 
     'Content-Type': 'application/x-www-form-urlencoded', 
     'Content-Length': values.length 
    } 
}; 

適切'Cookie'ヘッダを追加し、その要求が成功します。

関連する問題