GeoSven: HTTPS Protokoll Auflösung PHP

Hallo,

ich habe einen Windows 2008 Server mit dem IIS als Webserver. Ich führe folgendes PHP Test-Script unter HTTPS aus:

$hostname = $_SERVER["HTTP_HOST"];
$protocol = "http:";
if($_SERVER["HTTPS"] == "on") $protocol = "https:";

header('Content-Type: application/javascript');

echo 'var str = "'.$protocol.'//'.$hostname.'"';

folgendes wird ausgegeben:

var str = "http://meineurl.de:443"

Wenn ich das gleiche ohne Javascript header ausgebe ist es korrekt:

var str = "https://meineurl.de"

Woran kann sowas liegen? Firewall?

Danke Sven

  1. Hallo GeoSven,

    das kann ich mit IIS 7.5 unter Win7 nicht nachvollziehen.

    Ich habe http an Port 80 gebunden und https an Port 443. IP und Hostname habe ich leergelassen, weil ich nur gegen localhost testen kann.

    Ich bekomme beim http Aufruf var str = "http://localhost" und beim https-Aufruf var str = "https://localhost". Und natürlich lautes Geschrei von Chrome, dass das überhaupt nicht sicher ist, weil mein Zertifikat höchst merkwürdig sei. Naja. Das IIS Entwicklerzertifikat eben 😀

    Aktivieren oder Deaktivieren des Content-Type Header beeinflusst lediglich, ob Chrome mir das in einem Monospace- oder Proportionalfont anzeigt.

    Deine Ausgabe var str = "http://meineurl.de:443" würde ja bedeuten, dass per http kommuniziert wird und die https-Portadresse als Teil des Hostnamens interpretiert wird. Du fragst nach möglichen Firewall-Problemen... hast Du eine dazwischen?

    Rolf

    --
    sumpsi - posui - clusi
  2. Hallo GeoSven,

    wenn möglich nimm

    $_SERVER['SERVER_NAME']
    

    statt $_SERVER['HTTP_HOST']. Denn der Host:-Header kommt vom User und ist daher unzuverlässig — sogar unsicher.

    Zum Anderen überdenke Deine if-Abfrage

    if($_SERVER["HTTPS"] == "on")
    

    wenn das Script auch in einer anderen Umgebung laufen können soll.

    Doku auf php.net:

    'HTTPS'

    Wird auf einen nicht-leeren Wert gesetzt, wenn das Skript via HTTPS aufgerufen wurde.

    Hinweis: Beachten Sie bei der Verwendung von ISAPI unter IIS, dass der Wert auf off gesetzt wird, wenn der Request nicht mittels HTTPS erfolgte.

    1. Moin;

      Denn der Host:-Header kommt vom User und ist daher unzuverlässig — sogar unsicher.

      Das stimmt! Wenn der User einen falschen Host angibt, wird dies vom IP-Stack nicht bemerkt und der Request geht an den falschen Host. Und wer weiß was der dann damit macht!

      Schönen Sonntag.

    2. Tach!

      wenn möglich nimm

      $_SERVER['SERVER_NAME']
      

      statt $_SERVER['HTTP_HOST']. Denn der Host:-Header kommt vom User und ist daher unzuverlässig — sogar unsicher.

      Der Host-Header ist ein Bestandteil des Protokolls, der benötigt wird, um den richtigen VHost zu finden. Wenn der falsch ist, geht der Request anderswohin und kommt gar nicht an diesem PHP-Script vorbei. Das heißt, die möglichen Werte in $_SERVER['HTTP_HOST'] entsprechen exakt der Anzahl der konfigurierten ServerAlias dieses Vhosts plus 1 für den ServerName. Oder sie ist begrenzt unbestimmt, wenn ein * als Bestandteil des Namens verwendet wurde: *.example.com.

      Es gibt zwei Spezialfälle. Wenn der Apache ohne VHosts läuft und sämtliche Requests an die unter Listen konfigurierte IP-Adresse nebst Port annimmt, dann kann im Host stehen was will. Der zweite Fall ist, dass kein VHost mit dem Hostnamen gefunden werden kann, dann geht der Request zum Default-Host, welches die erste VHost-Konfiguration im Apachen ist. Der Request kommt dann aber immer da an, solange ein DNS-Eintrag auf die IP-Adresse des Servers verweist. Den Default-VHost sollte man separat konfigurieren und keinem Projekt zuweisen, damit auf diesem Projekt keine Requests aufgrund von Fehlkonfiguration landen.

      Ich sehe kein Problem darin, dass das PHP-Script irgendwelche Werte zu sehen bekommt, die sich nicht nachvollziehbar mit der Konfiguration des Apachen zuzüglich DNS begründen lassen.

      Der IIS oder andere Server können sich anders verhalten, aber auch nicht grundlegend.

      dedlfix.