我使用燒瓶燒瓶安全(特別是瓶,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'請求中顯示服務器返回的頁面時,提交表單效果很好。我只是喜歡用模態顯示這個註冊表格。
感謝您的幫助
只是爲了確認,你已經證實令牌實際上是以模態呈現的?如果是這種情況。你可以驗證序列化的表單數據有csrf_token嗎? – junnytony