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)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章