gpt4 book ai didi

python - 你如何将 csrf 验证添加到 Pyramid ?

转载 作者:太空狗 更新时间:2023-10-29 20:54:53 24 4
gpt4 key购买 nike

我正在为每个帖子和 xhr 请求传递一个 csrf_token,并希望根据 session csrf token 验证 token 。如果它们不匹配,我将抛出一个 401。

我使用 Pyramid 中的 NewResponse 订阅者来检查请求并根据 session 中的 token 验证请求参数中的 csrf token 。验证有效,但它仍然调用 View ,因此它无法正常工作。

关于正确执行此操作的任何建议?

@subscriber(NewResponse)
def new_response(event):
"""Check the csrf_token if the user is authenticated and the
request is a post or xhr req.
"""
request = event.request
response = event.response
user = getattr(request, 'user', None)
# For now all xhr request are csrf protected.
if (user and user.is_authenticated()) and \
(request.method == "POST" or request.is_xhr) and \
(not request.params.get('csrf_token') or \
request.params.get('csrf_token') != unicode(request.session.get_csrf_token())):
response.status = '401 Unauthorized'
response.app_iter = []

最佳答案

NewResponse 订阅者在您的 View 被调用后被调用。

您希望使用之前调用的事件,例如 NewRequestContextFound。在 Pyramid 1.0 中,您需要使用 ContextFound 来正确处理事情,因为您不能在 NewRequest 事件中引发异常(这在 1.1 中已修复)。

使用 ContextFound 事件的方法是为 HTTPException 对象注册一个异常 View ,如下所示:

config.add_view(lambda ctx, req: ctx, 'pyramid.httpexceptions.HTTPException')

基本上,当您引发异常时,这将返回异常作为响应对象,这对于有效的 Pyramid Response 对象的 HTTPException 对象是完全有效的。

然后您可以注册您的事件并处理 CSRF 验证:

@subscriber(ContextFound)
def csrf_validation_event(event):
request = event.request
user = getattr(request, 'user', None)
csrf = request.params.get('csrf_token')
if (request.method == 'POST' or request.is_xhr) and \
(user and user.is_authenticated()) and \
(csrf != unicode(request.session.get_csrf_token())):
raise HTTPUnauthorized

关于python - 你如何将 csrf 验证添加到 Pyramid ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6434550/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com