flask中的session存在的问题
客户端session
在Web中,session是认证用户身份的凭证,它具备如下几个特点:
用户不可以任意篡改
A用户的session无法被B用户获取
也就是说,session的设计目的是为了做用户身份认证。但是,很多情况下,session被用作了别的用途,将产生一些安全问题,我们今天就来谈谈“客户端session”(client session)导致的安全问题。
在传统开发中,SESSION变量的内容默认会被保存在服务端的一个文件中,通过一个叫session_id的Cookie来区分用户。这类session是“服务端session”,用户看到的只是session的名称(一个随机字符串),其内容保存在服务端。
然而,并不是所有语言都有默认的session存储机制,也不是任何情况下我们都可以向服务器写入文件。所以,很多Web框架都会另辟蹊径,比如Django默认将session存储在数据库中,而对于flask这里并不包含数据库操作的框架,就只能将session存储在cookie中。
因为cookie实际上是存储在客户端(浏览器)中的,所以称之为“客户端session”。
flask中的session
flask仅仅对数据进行了签名。众所周知的是,签名的作用是防篡改,而无法防止被读取。而flask并没有提供加密操作,所以其session的全部内容都是可以在客户端读取的,这就可能造成一些安全问题。
session存储的内容可以通过以下脚本来破译:
1 | #!/usr/bin/env python3 |
这样就会造成一些安全性的问题。
解决方案
最好的方式当然是不要把session存在Cookie中,这里我们就把session内容放到Redis中,这样session就成为了服务端Session。
1 | import pickle |
使用方法如下:
1 | app = Flask(__name__) |