Files
adminandClaude Opus 5 37270acb23 .htaccess: Git-Verzeichnis auch ohne mod_rewrite und mod_alias sperren
Die Regel gegen Punkt-Pfade stand ausschliesslich in IfModule-Bloecken fuer
mod_rewrite und mod_alias. Ist keines der beiden geladen, entfaellt sie
ersatzlos und ohne Fehlermeldung, und .git waere wieder abrufbar - genau das
Fail-Open, das derselbe Commit-Satz bei restricted/.htaccess beseitigen
sollte.

Ergaenzt um eine Notbremse aus Kern-Direktiven, die immer verfuegbar sind:
FilesMatch auf die Einstiegsdateien eines Git-Verzeichnisses (HEAD, config,
index, packed-refs und weitere) sowie pack und idx in der Typenliste. Ohne
diese Dateien laesst sich das Verzeichnis nicht aufrollen, weil die
Objektdateien hexadezimale Namen tragen.

FilesMatch passt nur auf Dateinamen, nicht auf Pfadbestandteile, und kann
.git deshalb nicht vollstaendig sperren. Der Kommentar in der Datei sagt das
und benennt die belastbare Loesung: .git und restricted/ ausserhalb des
Dokumentenbaums legen.

Gegengeprueft: von den 40 Adressen, die die Seiten laden, faellt keine unter
die neuen Regeln; in .git greifen sie zusaetzlich fuer 13 Dateien.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-28 16:16:26 +02:00

53 lines
2.2 KiB
ApacheConf

# Zugriffsschutz fuer den gesamten Web-Root.
#
# restricted/.htaccess schuetzt nur ein Verzeichnis. Die Regeln hier greifen
# fuer den ganzen Baum und fangen ab, was ausserhalb davon liegt - allen voran
# das Git-Verzeichnis, ueber das sich sonst der komplette Quellcode samt
# Historie herunterladen laesst.
# --- Punkt-Verzeichnisse und -Dateien: .git, .claude, .gitignore ---
# .well-known bleibt frei, das brauchen Zertifikatsausstellungen.
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule (^|/)\.(?!well-known/) - [F,L]
</IfModule>
<IfModule !mod_rewrite.c>
<IfModule mod_alias.c>
RedirectMatch 404 (^|/)\.(?!well-known/)
</IfModule>
</IfModule>
# --- Dateitypen, die der Browser nie anfordert ---
# Konfiguration, Python-Skripte, Datenhaltung, Vorlagen und Archive. Die
# Seite laedt ausschliesslich .php, .css, .js, Bilder und Schriften.
<FilesMatch "\.(ini|py|pyc|json|md|log|bak|example|sql|sqlite|db|tgz|gz|zip|yml|yaml|pack|idx)$">
<IfModule mod_authz_core.c>
Require all denied
</IfModule>
<IfModule !mod_authz_core.c>
Order allow,deny
Deny from all
</IfModule>
</FilesMatch>
# --- Notbremse ohne Modulabhaengigkeit ---
# Die Punkt-Regel oben braucht mod_rewrite oder mod_alias. Fehlen beide, faellt
# sie ersatzlos und ohne Fehlermeldung aus - und .git waere wieder abrufbar.
# FilesMatch gehoert zum Kern und ist immer verfuegbar. Es passt allerdings nur
# auf Dateinamen, nicht auf Pfadbestandteile, kann .git also nicht vollstaendig
# sperren. Es nimmt den ueblichen Auslesewerkzeugen aber den Einstieg: ohne
# HEAD, config, index und packed-refs laesst sich das Verzeichnis nicht
# aufrollen, weil die Objektdateien hexadezimale Namen tragen.
#
# Belastbar waere nur, .git und restricted/ ausserhalb des Dokumentenbaums zu
# legen. Diese Regeln sind Schadensbegrenzung, keine Grenze.
<FilesMatch "^(HEAD|ORIG_HEAD|FETCH_HEAD|MERGE_HEAD|COMMIT_EDITMSG|config|index|packed-refs|description|shallow|gitattributes|gitignore|gitmodules)$">
<IfModule mod_authz_core.c>
Require all denied
</IfModule>
<IfModule !mod_authz_core.c>
Order allow,deny
Deny from all
</IfModule>
</FilesMatch>