Flask笔记-session安全问题(避免任务重复提交)

防止同一个session多次提交某任务

此处的url提交后,会处理30s。 

 

当第一次提交session时,会延迟30s然后返回数据:

当在30s内,同样的session输入了此url:

302重定向,将其重定向到sessionsafetest中。

 

此例子原理是这样的:

在session存入一条user_info的数据

Flask会默认把session数据放到客户端的cookie中:

新增RequestManager类,将这个数据记录下来。在服务器处理结束后,移除这个数据。

在请求之前,如果发现RequestManager类中有这个session数据了,就让其重定向到其他页面。

相关代码如下:

class RequestManager:

    currentUser = set()

    @staticmethod
    def add(user):
        RequestManager.currentUser.add(user)

    @staticmethod
    def remove(user):
        RequestManager.currentUser.remove(user)

    @staticmethod
    def isSessionExist(user):
        for item in RequestManager.currentUser:
            if item == user:
                return True

        return False

    @staticmethod
    def printAll():
        print(RequestManager.currentUser)

拦截器相关的:

@app.after_request
def after_request(response):

    if request.path == "/sessionsafetest":
        return response

    user = session.get('user_info')

    try:
        RequestManager.remove(user)
    except Exception as e:
        traceback.print_exc()

    print(RequestManager.printAll())
    return response

#做个实验,某个任务要处理30s
@app.route("/task30s", methods=['GET'])
def goTask():
    time.sleep(30)
    result = {
        "msg" : "success"
    }
    return jsonify(result)

@app.route("/sessionsafetest", methods=['GET'])
def getSeesionSafePage():
    result = {
        "msg" : "session is running"
    }
    return jsonify(result)
发布了1312 篇原创文章 · 获赞 2429 · 访问量 185万+

猜你喜欢

转载自blog.csdn.net/qq78442761/article/details/104758167