在金字塔中与多名枪炮工人一起检查CSRF

时间:2016-11-17 07:15:52

标签: ajax csrf pyramid gunicorn pylons

我在我的网络应用中使用金字塔,这需要对每个请求进行csrf检查。在ajax调用期间,csrf-token被设置到每个请求的标头中。 1个帖子 1个工作人员一切正常,但是一旦我启用了多个工作人员,工作人员2就不知道来自工作人员1的令牌。他们怎么能分享 csrf代币?

问候

production.ini for gunicorn:

[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

在设置烧杯时我是否遗漏了什么?

2 个答案:

答案 0 :(得分:0)

beaker.cache.type=memory是会话数据的进程内存储(我猜)。您正在运行两个不同的进程,当然他们无法看到彼此的内存空间。

使用不同的Beaker后端或类似pyramid_redis_session的内容来跨进程(和服务器)共享会话数据。

答案 1 :(得分: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发布解决方案。