Funn fra sikkerhetsgjennomgang: - HØY: post_id ble ikke validert, så en gjest kunne nå andres innlegg via gjest/../../posts/<slug> (lese utkast, laste opp/slette bilder, publisere eierens utkast). Slug og gjestenavn valideres nå mot samme alfabet de lages med, og stien sjekkes etter oppslag. - Bilder: pikselantall sjekkes før dekoding (maks 40 MP), og DecompressionBombError håndteres. - Innlogging: CSRF-token kreves også på login (login-CSRF), og innloggingsbrems etter 5 feil per brukernavn. - Passordbytte ugyldiggjør alle andre sesjoner (stempel i cookien). - Content-Security-Policy og X-Frame-Options på alle sider; admin har ingen inline script lenger (admin.js). - Gjestenavn og eier-slugs kan ikke lenger kollidere på /navn/. - Healthcheck respekterer SOAPBOX_BASE_PATH; login-redirect beholder base path; run.sh dropper capabilities og setter minnegrense; uv pinnet til 0.11. Rettet også en reell feil: existing_slugs() listet feil katalog (Path / er identitet), så slug-unikhet virket ikke. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JcEy43fNYpwg6K6oTKakWR
38 lines
1.5 KiB
HTML
38 lines
1.5 KiB
HTML
<!doctype html>
|
||
<html lang="nb">
|
||
<head>
|
||
<meta charset="utf-8">
|
||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||
<title>{% block title %}Admin{% endblock %} – {{ site.title }}</title>
|
||
<link rel="stylesheet" href="{{ url_for('admin.static', filename='admin.css') }}">
|
||
<link rel="icon" type="image/svg+xml" href="{{ url_for('admin.static', filename='favicon.svg') }}">
|
||
</head>
|
||
<body>
|
||
<a class="skip" href="#main">Hopp til innhold</a>
|
||
<header class="topbar">
|
||
<a class="brand" href="{{ url_for('admin.index') }}">{{ site.title }}</a>
|
||
{% if user %}
|
||
<nav aria-label="Admin-meny">
|
||
<a href="{{ url_for('admin.index') }}">Innlegg</a>
|
||
{% if user.is_owner %}
|
||
<a href="{{ url_for('admin.users') }}">Brukere</a>
|
||
<a href="{{ url_for('admin.settings') }}">Innstillinger</a>
|
||
{% endif %}
|
||
<a href="{{ url_for('admin.password') }}">Passord</a>
|
||
<a href="{{ url_for('public') }}">Se bloggen</a>
|
||
<form method="post" action="{{ url_for('admin.logout') }}" class="inline">
|
||
<input type="hidden" name="csrf" value="{{ csrf }}">
|
||
<button type="submit" class="link">Logg ut ({{ user.username }})</button>
|
||
</form>
|
||
</nav>
|
||
{% endif %}
|
||
</header>
|
||
<main id="main">
|
||
{% with messages = get_flashed_messages(with_categories=true) %}
|
||
{% for cat, msg in messages %}<p class="flash {{ cat }}" role="status">{{ msg }}</p>{% endfor %}
|
||
{% endwith %}
|
||
{% block content %}{% endblock %}
|
||
</main>
|
||
<script src="{{ url_for('admin.static', filename='admin.js') }}"></script>
|
||
</body>
|
||
</html>
|