('CSRF保护aiohttp.web网站',)
aiohttp-csrf的Python项目详细描述
库为aiohttp.web提供csrf(xsrf)保护。在
基本用途
该库允许您为请求实现csrf(xsrf)保护
基本用法示例:
importaiohttp_csrffromaiohttpimportwebFORM_FIELD_NAME='_csrf_token'COOKIE_NAME='csrf_token'defmake_app():csrf_policy=aiohttp_csrf.policy.FormPolicy(FORM_FIELD_NAME)csrf_storage=aiohttp_csrf.storage.CookieStorage(COOKIE_NAME)app=web.Application()aiohttp_csrf.setup(app,policy=csrf_policy,storage=csrf_storage)app.middlewares.append(aiohttp_csrf.csrf_middleware)asyncdefhandler_get_form_with_token(request):token=awaitaiohttp_csrf.generate_token(request)body=''' <html> <head><title>Form with csrf protection</title></head> <body> <form method="POST" action="/"> <input type="hidden" name="{field_name}" value="{token}" /> <input type="text" name="name" /> <input type="submit" value="Say hello"> </form> </body> </html> '''# noqabody=body.format(field_name=FORM_FIELD_NAME,token=token)returnweb.Response(body=body.encode('utf-8'),content_type='text/html',)asyncdefhandler_post_check(request):post=awaitrequest.post()body='Hello, {name}'.format(name=post['name'])returnweb.Response(body=body.encode('utf-8'),content_type='text/html',)app.router.add_route('GET','/',handler_get_form_with_token,)app.router.add_route('POST','/',handler_post_check,)returnappweb.run_app(make_app())
初始化
首先,您需要在应用程序中初始化aiohttp_csrf:
^{pr2}$中间件和装饰器
初始化后,您可以将@aiohttp_csrf.csrf_protect用于要保护的处理程序。 或者您可以初始化aiohttp_csrf.csrf_middleware,并且不要打扰使用装饰器(full middleware example here):
...app.middlewares.append(aiohttp_csrf.csrf_middleware)...
在这种情况下,您的所有处理程序都将受到保护。在
注意:我们强烈建议使用aiohttp_csrf.csrf_middleware和@aiohttp_csrf.csrf_exempt,而不是用@aiohttp_csrf.csrf_protect手动管理。 但是,如果您喜欢使用@aiohttp_csrf.csrf_protect,请不要忘记对两个方法使用@aiohttp_csrf.csrf_protect:GET和POST (manual protection example)
如果您想使用中间件,但是需要没有保护的处理程序,可以使用@aiohttp_csrf.csrf_exempt。 使用此修饰符标记处理程序,此处理程序将不检查令牌:
@aiohttp_csrf.csrf_exemptasyncdefhandler_post_not_check(request):...
生成令牌
对于generate token,您需要在处理程序中调用aiohttp_csrf.generate_token:
@aiohttp_csrf.csrf_protectasyncdefhandler_get(request):token=awaitaiohttp_csrf.generate_token(request)...
高级用法
政策
您可以对检查令牌使用不同的策略。库提供3种类型的策略:
- FormPolicy。此策略将在POST请求的正文中搜索令牌(通常用于表单)或作为同名的GET变量。您需要指定要检查的字段的名称。在
- ^{strong}1}。此策略将在POST请求的头中搜索token(通常用于AJAX请求)。您需要指定要检查的标头的名称。在
- FormAndHeaderPolicy。此策略组合了FormPolicy和HeaderPolicy的行为。在
如果需要,可以实现自定义策略。但请确保您的自定义策略实现aiohttp_csrf.policy.AbstractPolicy接口。在
存储
您可以使用不同类型的存储器来存储令牌。库提供两种类型的存储:
- CookieStorage。您的令牌将存储在cookie变量中。您需要指定cookie名称。在
- SessionStorage。您的令牌将存储在会话中。您需要指定会话变量名。在
Important:如果要使用会话存储,则需要在应用程序中设置aiohttp_会话 (session storage example)
如果需要,您可以实现自定义存储。但请确保您的自定义存储实现了aiohttp_csrf.storage.AbstractStorage接口。在
令牌生成器
您可以在应用程序中使用不同的令牌生成器。 默认情况下,存储使用aiohttp_csrf.token_generator.SimpleTokenGenerator
{14$但是你可以使用更多^安全令牌}
如果需要,您可以实现自定义令牌生成器。但请确保您的自定义令牌生成器实现了aiohttp_csrf.token_generator.AbstractTokenGenerator接口。在
无效的令牌行为
默认情况下,如果令牌无效,aiohttp_csrf将引发aiohttp.web.HTTPForbidden异常。在
您可以指定自定义错误处理程序。它可以是:
- 可调用实例。输入参数-aiohttp请求。
defcustom_error_handler(request):# do somethingreturnaiohttp.web.Response(status=403)# orasyncdefcustom_async_error_handler(request):# await do somethingreturnaiohttp.web.Response(status=403)
它将被调用,而不是受保护的处理程序。在
- 异常子类。在这种情况下,将引发此异常。在
classCustomException(Exception):pass
在应用程序中初始化aiohttp_csrf时,可以全局指定自定义错误处理程序:
...classCustomException(Exception):pass...aiohttp_csrf.setup(app,policy=csrf_policy,storage=csrf_storage,error_renderer=CustomException)...
在这种情况下,自定义错误处理程序将应用于所有受保护的处理程序。在
也可以在本地为特定处理程序指定自定义错误处理程序:
...classCustomException(Exception):pass...@aiohttp_csrf.csrf_protect(error_renderer=CustomException)defhandler_with_custom_csrf_error(request):...
在这种情况下,自定义错误处理程序将仅应用于此处理程序。 对于所有其他处理程序,将应用全局错误处理程序。在
- 项目
标签:
推荐PyPI第三方库
- 热门话题
- 我可以用C++代码使用java代码吗? java使用JSR303在派生类中提供更具体的约束 java在这个查找唯一路径数算法中我做错了什么? java如何为2个不同的服务提供商使用2个不同的SSL证书? java在Gridview上绘制文本 java使用连接for循环构建字符串名 java StringBuilder拆分无法处理某些文件 java事件关注EditText Java Web Start“找不到URL的缓存资源” java程序从命令行运行的速度比在Eclipse中慢 java为什么HttpServletRequest会截断#字符上的url输入? java自定义折叠工具栏平滑标题大小调整 使用Mockito对安卓 java中调用另一个静态函数的函数进行单元测试 http在java客户机中使用cachecontrol头 java如何使用。是否使用Delimiter从输入文件中排除标点符号和数字? 使用上下文作为参数/参数的java java更有效地从Jar中提取文件 java为多个JButton提供相同的actionListener