Files
kaffeekasse-saas/.htaccess
T
clemensandClaude Opus 5 52b1726698 Deployment-Vorbereitung: Ausschlussliste, .htaccess-Haertung, Doku
Vor dem ersten FTP-Deploy nach /testumgebung.kaffeeliste.de/httpdocs/
fehlte jede Absicherung des Upload-Umfangs: sync_config.jsonc hatte eine
leere excludePath-Liste, es waeren also .git (komplett herunterladbar),
.env.local (Dev-DB-Zugangsdaten) und sync_config.jsonc selbst (enthaelt
das FTP-Passwort im Klartext) mit ausgeliefert worden. Von diesen dreien
war keines von den bestehenden .htaccess-Regeln erfasst.

- sync_config.jsonc: excludePath gefuellt; scripts/ und database/ bleiben
  bewusst im Deploy, weil die Plesk-Scheduled-Tasks sie vom Webspace aus
  ausfuehren.
- .htaccess: sync_config.jsonc und Dotfile-Ordner gesperrt, Vendor-
  Verzeichnisse (TCPDF/PHPMailer/DataTables) fuer direkte URL-Aufrufe
  gesperrt, HTTPS-Redirect ergaenzt (ohne ihn bekam ein http-Besucher
  eine Session ohne secure-Flag).
- PHPMailer/ entfernt: enthielt nur noch LICENSE, composer.json und ein
  per URL erreichbares get_oauth_token.php, kein Quellcode. Der Versand
  laeuft seit M6 ueber saas_send_mail().
- docs/deployment.md: Umgebungen, Deploy-Ablauf, Migrationen und
  Cron-Jobs ueber Plesk Scheduled Tasks (kein SSH verfuegbar),
  Mail-/DNS-, Stripe- und PayPal-Voraussetzungen, Go-Live-Checkliste.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-06 15:45:01 +02:00

58 lines
2.2 KiB
ApacheConf

# Nur *.php im Webroot und assets/ sollen direkt aufrufbar sein. Interne
# Verzeichnisse (Sessions, Mail-Logs, Migrationen, CLI-Skripte, Doku,
# App-Bausteine, Legacy-DB-Shim, Vendor-Bibliotheken), die Git-Metadaten und
# Konfigurationsdateien mit Zugangsdaten duerfen nicht direkt per URL
# abrufbar sein.
<IfModule mod_rewrite.c>
RewriteEngine On
# Alles auf HTTPS. Session-Cookies werden nur ueber HTTPS mit dem
# secure-Flag gesetzt (app_start_session()), und HSTS wird ebenfalls nur
# dann gesendet - ohne Redirect kaeme ein Nutzer per http an und bekaeme
# eine Session ohne secure-Flag. X-Forwarded-Proto deckt den Fall ab,
# dass Apache hinter dem Plesk-nginx-Proxy laeuft.
RewriteCond %{HTTPS} !=on
RewriteCond %{HTTP:X-Forwarded-Proto} !=https
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteCond %{REQUEST_URI} ^/(var|database|scripts|docs|app|lib)/ [NC]
RewriteRule ^ - [F]
# Vendor-Verzeichnisse werden ausschliesslich serverseitig eingebunden
# (TCPDF ueber exportKaffeeliste.php); direkte URL-Aufrufe ihrer PHP-
# Dateien sind nie erwuenscht.
RewriteCond %{REQUEST_URI} ^/(TCPDF|PHPMailer|DataTables)/ [NC]
RewriteRule ^ - [F]
# .git waere sonst komplett herunterladbar, falls es je mit deployt wird.
RewriteCond %{REQUEST_URI} ^/\.(git|claude|local)(/|$) [NC]
RewriteRule ^ - [F]
# Konventionelle /sitemap.xml auf die dynamische, host-korrekte Sitemap.
RewriteRule ^sitemap\.xml$ sitemap.php [L]
</IfModule>
# Konfigurations- und Deploy-Dateien mit Zugangsdaten. sync_config.jsonc
# enthaelt das FTP-Passwort im Klartext und darf niemals ausgeliefert werden,
# auch nicht versehentlich mit hochgeladen.
<FilesMatch "^(env\.local\.php|env\.local\.example\.php|\.env.*|sync_config\.jsonc|composer\.(json|lock))$">
<IfModule mod_authz_core.c>
Require all denied
</IfModule>
<IfModule !mod_authz_core.c>
Order allow,deny
Deny from all
</IfModule>
</FilesMatch>
<FilesMatch "\.(sql|md|jsonc|yml|yaml|sh|log)$">
<IfModule mod_authz_core.c>
Require all denied
</IfModule>
<IfModule !mod_authz_core.c>
Order allow,deny
Deny from all
</IfModule>
</FilesMatch>