Mit PHP eine SSL-Verbindung erzwingen
Severin Kacianka
- php
Hallo,
ich möchte serverseitig sicher stellen, dass ein Teil einer Webseite _ausschließlich_ über SSL erreicht wird. Bis jetzt habe ich leider nicht sehr viel profundes gefunden, möchte daher fragen, ob meine Lösung sinnvoll ist:
//FORCE_SSL ist nur eine Konstante mit der man dies ein/ausschlaten kann
if(FORCE_SSL && ($_SERVER['SERVER_PORT'] != 443)){
header('Location: https://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'].$_SERVER['QUERY_STRING']);
exit;
}
Dieses Codestück wird (neben der Benutzerauthentifikation und anderem) von jeder "sensiblen" Seite per require eingebunden.
Gruß,
Severin
Moin!
ich möchte serverseitig sicher stellen, dass ein Teil einer Webseite _ausschließlich_ über SSL erreicht wird.
Das stellt man üblicherweise dadurch sicher, dass die nur per SSL erreichbaren Teile eben nur im SSL-Hostbereich erreichbar sind.
HTTP und HTTPS haben normal nämlich nichts miteinander zu tun. Dass über beide Protokolle oftmals dieselben Inhalte erreicht werden können, geschieht aufgrund der Konfiguration, die für beide Hosts eben den gleichen DOCUMENT_ROOT angibt.
Wenn man das nicht haben möchte, muß man eben unterschiedliche DOCUMENT_ROOT für HTTP und HTTPS verwenden, und kann dann sehr exakt bestimmen, welche Inhalte wo erscheinen.
- Sven Rautenberg
Hallo Sven,
Wenn man das nicht haben möchte, muß man eben unterschiedliche DOCUMENT_ROOT für HTTP und HTTPS verwenden, und kann dann sehr exakt bestimmen, welche Inhalte wo erscheinen.
Dann werde ich mich wohl am besten mit dem Informatikdienst unterhalten und versuchen Zugriff auf das HTTPS DOCUMENT_ROOT zu bekommen.
Danke für deine Antwort und liebe Grüße,
Severin
hi,
Dann werde ich mich wohl am besten mit dem Informatikdienst unterhalten und versuchen Zugriff auf das HTTPS DOCUMENT_ROOT zu bekommen.
Bald darf ich seine Stiefel haben ...
gruß,
wahsaga
Hallo,
Das stellt man üblicherweise dadurch sicher, dass die nur per SSL erreichbaren Teile eben nur im SSL-Hostbereich erreichbar sind.
Sollte man aber doch für beide den gleichen DocRoot haben wollen,
würde mir da noch eine nette Möglichkeit einfallen, um sicherzustellen, dass einige Seiten nur per HTTPS erreichbar sind:
In die Conf des HTTP Vhosts:
<Directory "pfad/zu/den/docs/für/ssl">
Order allow,deny
Deny from all
</Directory>
In die Conf des HTTPS Vhosts:
<Directory "pfad/zu/den/docs/für/ssl">
Order deny,allow
Allow from all
</Directory>
Zugegeben - etwas evil, aber dann greift _garantiert_ niemand über den HTTP Host auf diese Dateien zu ;)
Gruß,
Philipp
Hi Severin,
Bis jetzt habe ich leider nicht sehr viel profundes gefunden, möchte daher fragen, ob meine Lösung sinnvoll ist [...]
Das geht in der Form nur solange der Standard Port 443 für HTTPS genutzt wird - wird ein davon abweichender Port genutzt, so wird das natürlich nicht mehr funktionieren.
Einen abweichender Document-Root halte ich nicht für zwingend erforderlich - ich sehe da noch zwei andere Möglichkeiten:
Per RewriteCond in einer .htaccess könntest du die Umgebugnsvariable HTTPS prüfen und wenn diese on ist dem PHP-Script einen geheimen Parameter anhängen - das dies natürlich nur semi-professionell ist, ist klar ;-)
1b) Vielleicht wird diese Umgebugnsvariable HTTPS auch an PHP durchgeschleust - das wäre natürlich super, weil dann bräuchtest du die nur noch auszuwerten. Spätestens beim Einsatz von suExec wird sie aber wohl nicht mehr durchgegeben werden.
Des weiteren gibt es die Apache-Konfigrations-Option SSLRequireSSL - du könntest alle SSL-erfordernden PHP-Scripte in einen Unterordner legen und für diesen mit genannter Direktive festlegen, dass Zugriff nur über eine SSL Verbindung erlaubt sein darf. So dass wirklich so einfach klappt wie da beschrieben, halte ich das für die beste Lösung, eventuell noch in Verbindung mit einer simplen Abfrage in PHP wie von dir bereits eingesetzt.
MfG, Dennis.