From 796c3ae318eea183fc88c87ec5a27355b0f6a99d Mon Sep 17 00:00:00 2001 From: Uzay-G Date: Fri, 24 Dec 2021 12:16:44 +0100 Subject: [PATCH] better CSRF protection; change delete route to POST --- archivy/__init__.py | 2 ++ archivy/click_web/resources/cmd_exec.py | 6 ++---- archivy/routes.py | 2 +- archivy/templates/click_web/command_form.html | 1 + archivy/templates/dataobjs/show.html | 2 +- tests/functional/test_routes.py | 4 ++-- 6 files changed, 9 insertions(+), 8 deletions(-) diff --git a/archivy/__init__.py b/archivy/__init__.py index b3aa3e7c..a4eaeee9 100644 --- a/archivy/__init__.py +++ b/archivy/__init__.py @@ -6,6 +6,7 @@ from flask import Flask from flask_compress import Compress from flask_login import LoginManager +from flask_wtf.csrf import CSRFProtect from archivy import helpers from archivy.api import api_bp @@ -77,6 +78,7 @@ login_manager.login_view = "login" login_manager.init_app(app) app.register_blueprint(api_bp, url_prefix="/api") +csrf = CSRFProtect(app) # compress files Compress(app) diff --git a/archivy/click_web/resources/cmd_exec.py b/archivy/click_web/resources/cmd_exec.py index 3e31f89c..c92e9d07 100644 --- a/archivy/click_web/resources/cmd_exec.py +++ b/archivy/click_web/resources/cmd_exec.py @@ -137,10 +137,8 @@ def _get_download_link(field_info): class RequestToCommandArgs: def __init__(self): - field_infos = [ - FieldInfo.factory(key) - for key in list(request.form.keys()) + list(request.files.keys()) - ] + keys = [key for key in list(request.form.keys()) + list(request.files.keys())] + field_infos = [FieldInfo.factory(key) for key in keys if key != "csrf_token"] # important to sort them so they will be in expected order on command line self.field_infos = list(sorted(field_infos)) diff --git a/archivy/routes.py b/archivy/routes.py index 1c623a5b..dc7a368a 100644 --- a/archivy/routes.py +++ b/archivy/routes.py @@ -232,7 +232,7 @@ def move_item(dataobj_id): return redirect(f"/dataobj/{dataobj_id}") -@app.route("/dataobj/delete/", methods=["DELETE", "GET"]) +@app.route("/dataobj/delete/", methods=["POST"]) def delete_data(dataobj_id): try: data.delete_item(dataobj_id) diff --git a/archivy/templates/click_web/command_form.html b/archivy/templates/click_web/command_form.html index cdffd0cf..3c68052a 100644 --- a/archivy/templates/click_web/command_form.html +++ b/archivy/templates/click_web/command_form.html @@ -29,6 +29,7 @@

{{ command.name|title }}

{% endfor %} {% endfor %} + diff --git a/archivy/templates/dataobjs/show.html b/archivy/templates/dataobjs/show.html index aad86636..83781921 100644 --- a/archivy/templates/dataobjs/show.html +++ b/archivy/templates/dataobjs/show.html @@ -71,7 +71,7 @@

Edit -
+ {{ form.hidden_tag() }}