聊聊鉴权以及flask中的实现

1,671 阅读2分钟

一、什么是鉴权

    鉴权是指用户是否拥有访问系统的权利,这通常是通过用户登录来确定当前用户的权限。整体的流程如图所示,用户由前端输入登录密码到后台,后台通过验证后返回Cookie给前端,下次前端发送请求时会自动带上Cookie,后台通过Cookie来判断当前用户。 图标

二、鉴权的一些安全问题

    从上述的流程可以看出,为了保持登录态,后台判断用户权限是通过前端保存的Cookie。如果第三方获取到了当前用户的Cookie也就可以假装用户执行操作。下面以leetcode为例,演示一下第三方如何在获取Cookie之后直接进入登录态。
(1)在A计算机中登录leetcode,并找到当前网站的Cookie(F12 -> Application -> Cookies)
(2)找到LEETCODE_SESSION一栏,复制其value

2.png (3)在B计算机(这里更换了一个浏览器)中直接添加该Cookie

3.png     B计算机并没有输入用户的账号和密码,就直接进入了登录态。前端常常提到一些攻击方式,如XSS,CSRF都是获取(跳过)浏览器存储的信息,才达成的一种攻击方式。

三、flask框架的鉴权实现

    flask和django一样,是基于python的后台框架,它比django更加轻便,也是笔者当前项目所采用的框架。flask提供了@login_required装饰器,方便开发者快速构建鉴权系统。但在开发过程中遇到了一个有趣的问题,所以在此记录下来。

1、保存并重构Cookie

    正常流程情况,如果前端在请求时并携带满足条件的Cookie,flask后台接口会直接报出401错误。登录后,接口会正常返回。但是笔者项目中的一位测试发现,提前保存Cookie之后,退出登录,当前Cookie依旧可用,这可能会有安全隐患,需要笔者定位分析。

2、Cookie中的内容

    笔者之前一直认为Cookie本身并没有意义,它只是后端的一个映射,用以判断当前的请求状态。但在一些情况下并不是这样的,比如flask的@login_required的实现。通过阅读flask源码发现,flask通过“SECRET_KEY”构造密文,而返回给前端的Cookie就是该密文。请求时,flask通过“SECRET_KEY”对Cookie的解密,来判断是否可以通过验证。也就说,一旦生成了有意义的密文,该密文将永久有效,永远可以通过@login _required的验证。