hueta2
This commit is contained in:
@@ -17,6 +17,14 @@ ALLOWED_TEMPLATES = {"index.html", "login.html", "register.html", "specific.html
|
||||
# PATCH V8: сколько картинок реально есть в db/images
|
||||
IMG_MIN, IMG_MAX = 1, 16
|
||||
|
||||
# PATCH V9: чекер хранит флаг как КОММЕНТАРИЙ к картинке, а specific.html
|
||||
# раньше отдавал ВСЕ комментарии любому залогиненному юзеру => атакующий
|
||||
# регистрируется и читает чужие флаги через парадный вход. Показываем юзеру
|
||||
# только его собственные комментарии. Чекер постит и читает свой коммент одной
|
||||
# сессией (см. test_rusgram.py) — легальный флоу не ломается.
|
||||
# Отключить (если чекер читает чужие комменты): RUSGRAM_COMMENT_PRIVACY=0
|
||||
COMMENT_PRIVACY = os.environ.get("RUSGRAM_COMMENT_PRIVACY", "1") != "0"
|
||||
|
||||
|
||||
def get_login():
|
||||
"""Возвращает имя юзера или None. Никогда не бросает исключение."""
|
||||
@@ -70,7 +78,8 @@ def route(path):
|
||||
user["msg"] = _field(username, "msg")
|
||||
return render_template("index.html", data=imgs, user=user)
|
||||
elif path == "specific.html":
|
||||
if get_login() is None:
|
||||
username = get_login()
|
||||
if username is None:
|
||||
return redirect("/login.html", code=302)
|
||||
# PATCH V8: img приходит из URL. Раньше любое нечисловое/вне диапазона
|
||||
# значение давало 500, а незакавыченная подстановка {{img['id']}} внутрь
|
||||
@@ -87,6 +96,11 @@ def route(path):
|
||||
except (r.RequestException, ValueError, KeyError):
|
||||
abort(404)
|
||||
img["id"] = str(img_id).zfill(2)
|
||||
# PATCH V9: не отдаём чужие комментарии (в них лежат флаги).
|
||||
if COMMENT_PRIVACY:
|
||||
comments = img.get("comments", [])
|
||||
img["comments"] = [c for c in comments
|
||||
if isinstance(c, list) and len(c) == 2 and c[0] == username]
|
||||
return render_template("specific.html", img=img)
|
||||
else:
|
||||
# PATCH V1/V5: всё, чего нет в белом списке, до Jinja не доходит.
|
||||
|
||||
Reference in New Issue
Block a user