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>
58 lines
2.2 KiB
ApacheConf
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>
|