2016-11-17 90 views
2

我爲我的web應用程序使用金字塔,這需要對每個請求進行csrf檢查。在ajax調用期間,csrf令牌被設置爲每個請求的頭部。一切正常的1線程1工人,但只要我允許多個工人,工人2開不知道,從工人1,他們如何份額的CSRF令牌,令牌?在Pyramid中用多個gunicorn工人檢查CSRF

問候

爲gunicorn production.ini:

[server:main] # GUNICORN 
use = egg:gunicorn#main 
bind = unix:/tmp/gunicorn.sock 
workers = 2 
threads = 1 
preload = true 
reload = true 
accesslog = gunicorn_access.log 
loglevel = info 

在金字塔我只設置:

config.set_default_csrf_options(require_csrf=True) 

我的HTML-skeletion有:

<input type="hidden" id="hidden_csrf_token" name="csrf_token" value="${request.session.get_csrf_token()}"> 

而且每AJAX請求:

var csrf_token = $('#' + hiddenCSRFTokenId).val(); 
... 
headers: {'X-CSRF-Token': csrf_token} 

編輯:我使用的是像

session_factory = session_factory_from_settings(settings) 
... 
config.set_session_factory(session_factory) 

默認會話工廠一息尚存,我想用燒杯:

# Beaker cache 
beaker.cache.regions = short_term, long_term 
beaker.cache.type = memory 
beaker.cache.short_term.expire = 3600 
beaker.cache.long_term.expire = 86400 

# Beaker sessions 
beaker.session.type = redis 
beaker.session.data_dir = %(here)s/data/sessions/data 
beaker.session.lock_dir = %(here)s/data/sessions/lock 
beaker.session.autor = true 
#beaker.session.type = memory 
beaker.session.key = dbas_prototyp 
beaker.session.secret = ... 
beaker.session.cookie_max_age = 3600 
beaker.session.timeout = 3600 
beaker.session.cookie_expires = true 
beaker.session.url:127.0.0.1:4284 

難道我錯過了一些東西,同時設立燒杯?

+0

CSRF令牌是由會話給出的。你如何設置你的會議?工作人員如何分享會話數據? –

+0

進行編輯並添加了代碼thx。 –

回答

0

我認爲我找到了第一個解決方案。我使用的燒杯中的簡單和外部數據庫,如:

session.url = postgresql+psycopg2://user:password&@localhost:port/database?client_encoding=utf8 

# Beaker cache 
beaker.cache.regions = short_term, long_term 
beaker.cache.type = ext:database 
beaker.cache.short_term.expire = 3600 
beaker.cache.long_term.expire = 86400 
beaker.cache.extend_existing = True 
beaker.cache.table_name = beaker_cache 

beaker.session.type = ext:database 
beaker.session.key = yyy 
beaker.session.secret = xxx 
beaker.session.cookie_max_age = 3600 
beaker.session.timeout = 3600 
beaker.session.cookie_expires = true 
beaker.session.table_name = beaker_session 

我會後與Redis的一個解決方案,其他的一些問題,在修復後。

0

beaker.cache.type=memory是會話數據(我的猜測)的進程內存儲。你正在運行兩個不同的進程,當然他們看不到對方的內存空間。

使用不同的Beaker後端或類似pyramid_redis_session的東西來跨進程(和服務器)共享會話數據。

+0

聲音在邏輯上正確。如果我嘗試一個修補程序,其中緩存類型設置爲文件,它將無法工作。我會給Redis一個更仔細的看看,並在這裏給予反饋。 –