.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>
This commit is contained in:
2026-08-28 16:16:26 +02:00
co-authored by Claude Opus 5
parent f17d010d5f
commit 37270acb23
+22 -1
View File
@@ -20,7 +20,28 @@
# --- 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)$">
<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>