('CSRF保护aiohttp.web网站',)

aiohttp-csrf的Python项目详细描述


库为aiohttp.web提供csrf(xsrf)保护。在

https://img.shields.io/travis/wikibusiness/aiohttp-csrf.svg

基本用途

该库允许您为请求实现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。此策略组合了FormPolicyHeaderPolicy的行为。在

如果需要,可以实现自定义策略。但请确保您的自定义策略实现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):...

在这种情况下,自定义错误处理程序将仅应用于此处理程序。 对于所有其他处理程序,将应用全局错误处理程序。在

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐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