2015-05-29 36 views
3

我使用燒瓶燒瓶安全(特別是瓶,WTF對我的CSRF問題)來「緩和」註冊/洛用戶的過程(不容易到目前爲止)。我在前端使用BackboneJS,因此我有種黑客使用Flask-WTF的原始方式。事實上,我在/ register上創建了一個AJAX GET請求來獲取註冊頁面(由Flask-Security生成),並且將生成的HTML放入一個模式中。燒瓶跆拳道:csrf_token從會話中刪除之前,我可以發表我的形式

render: function() { 
      var self = this; 
      $.ajax({ 
       type: 'GET', 
       url: Config.constants.serverGateway + "/register" 
      }).done(function(result){ 
       console.log("get register done", result); 
       var html = self.template({ config: Config, form: result }); 
       self.$el.html(html); 
      }).fail(function(error){ 
       console.log("Could not get register token", error); 
       var html = this.errorTemplate({ config: Config }); 
       self.$el.html(html); 
      }); 

      return this; 
     } 

這樣,我有產生CSRF,當我張貼的登記資料,我沿着發送用戶數據(電子郵件地址和密碼)CSRF的權利。

submit: function() { 
      console.log("submit"); 
      var self = this; 
      var formData = this.$el.find('form').serialize(); 
      $.ajax({ 
       type: 'POST', 
       url: Config.constants.serverGateway + "/register", 
       data: formData, 
       dataType: 'json' 
      }).done(function(result){ 
       self.trigger('close'); 
      }).fail(function(error){ 
       console.log("Could not submit register data", error); 
      }); 
     } 

在服務器端,我可以調試我的Python代碼來看看,當我要求的註冊頁面已經從會話對象消失,因此導致了新的一代已經產生csrf_token ,這當然不符合我用表格發送的內容。雖然會話仍然相同,因爲在GET和POST期間_id是相同的。

您可以看到在flask_wtf/csrf.py :: generate_csrf()中的代碼,在從flask_security的::寄存器功能/ views.py

if 'csrf_token' not in session: 
    session['csrf_token'] = hashlib.sha1(os.urandom(64)).hexdigest() 

它導致創建形式對象時其被稱爲在CSRF TOKEN MISSING錯誤中。

另一個信息是,我的前端和後端由同一臺服務器提供,因爲它們具有不同的端口號。

最後,當我在前端使用href並在'GET'請求中顯示服務器返回的頁面時,提交表單效果很好。我只是喜歡用模態顯示這個註冊表格。

感謝您的幫助

+0

只是爲了確認,你已經證實令牌實際上是以模態呈現的?如果是這種情況。你可以驗證序列化的表單數據有csrf_token嗎? – junnytony

回答

1

好吧,我終於想出瞭解決我的問題。我感覺像一個noob(我是)。

問題出在會話證書中,這些證書沒有通過請求發送到服務器,因此服務器不能訪問會話cookie。 我發現下面的教程的解決方案:http://backbonetutorials.com/cross-domain-sessions/ 發送它,我添加了以下幾行我的骨幹路由器初始化函數:

// Use withCredentials to send the server cookies 
// The server must allow this through response headers 
$.ajaxPrefilter(function(options, originalOptions, jqXHR) { 
    options.xhrFields = { 
     withCredentials: true 
    }; 
}); 

這使得所有的AJAX請求包括withCredentials = true。在服務器端,我必須設置Access-Control-Allow-Credentials:true。由於我使用的是燒瓶,因此在創建CORS對象時使用[supports_credentials=True][2]完成。

0

(我回答在這裏,因爲我不能評論) @junnytony是的,我有我的模式單詞和我在POST請求發送。當我調試Flask應用程序時,我可以看到我通過POST請求發送的toekn,問題是應該將它與會話中要驗證的那個進行比較,但是會話中的一個已經消失了, wtf lib生成一個新的,與我發送的比較時導致失敗。

相關問題