Geeigneter Ersatz für HTTP-Benutzernamen und -Kennwort in URL

Leider akzeptiert der Internet Explorer keine Adressen mehr der Form https://user:pass@example.com . Näheres dazu: http://support.microsoft.com/kb/834489 .

Ich suche jetzt eine geeignete Alternative dazu, die ohne serverseitige Browserweiche und nervige Login-Promts auskommt. Die Situation ist Folgende: "Server 1" hat ein schönes (sehr gut geschütztes) Webinterface. Auf einem anderen Server ("Sever 2") läuft ein Mailserver. Ich möchte jetzt den auf "Server 1" eingeloggten Benutzern (denen ich vertraue), die Möglichkeit bieten, ohne serverseitige Browserweiche und "Login-Orgien", auf das Webinterface von "Server 2" zuzugreifen. "Server 1" müssen alle Kennwörter von "Server 2" im Klartext bekannt sein (für einen hier nicht näher erläuterten Zweck). Es bedeutet also keinerlei zusätzliches Sicherheitsrisiko einen Link obiger Art anzubieten.

Die Server können untereinander nur über folgende Wege kommunizieren:

"Server 1" -> "Server 2" per E-Mail

"Server 2" -> "Server 1" per HTTP

Weiterreichen von Sitzungen und/oder Server-To-Server-HTTP(S)-Anfragen fallen damit leider aus.

Kann ich zum Beispiel auf "Server 1" ein PHP-Redirect-Script bauen, welches die HTTP-Authentifizierung übernimmt? Man kann ja schließlich auch POST-Variablen an den anderen Server schicken.

Leider kann/möchte ich das CGI-Script auf "Server 2" nicht anfassen; mir stehen also nur die Optionen der httpd.conf zur Verfügung. Könnte ich dort zum Beispiel valid-user ODER einen bestimmten referrer zulassen (Ist via HTTPS de facto genauso sicher, wie einen Link mit HTTP-Auth anzuklicken, da der referrer einem potentiellen Angreifer genauso unbekannt wie ein benutzername und kennwort ist)?

Habt ihr vielleicht noch kreative andere Ideen, weil es echt totaaal nervig ist, als Admin mehr als 50 verschiedene Passwort von Hand benutzen zu müssen (oben genannte "Login-Orgie")!?

...zum Beitrag

So. Ich habe inzwischen selber eine brauchbare, wenn auch relativ unelegante, Lösung gefunden:

PHP kann leider keine HTTP-Authentifizierung übernehmen; aber JavaScript (zumindest im Internet Explorer; leider nicht in Opera). Hier die vollständige Lösung mit serverseitiger Browserweiche:

Erzeugung des Links in PHP auf "Server 1":

if (strstr($_SERVER['HTTP_USER_AGENT'],'MSIE'))
    $url = "https://server2.com/red.php?htuname=".urlencode('benutzer')."&htpasswd=".urlencode('kennwort')."&url=".urlencode('/url/auf/server2')."&additionalparameter=".urlencode($param);
else
    $url = "https://".urlencode('benutzer').":".urlencode('kennwort')."@server2.com/url/auf/server2?additionalparameter=".urlencode($param);
echo "<a href=\"$url\">Link</a>";

Auf "Server 2" muss man nurnoch eine red.php zur Verfügung stellen:

<?php

//Weiterleitung mit HTTP-Authentification via JavaScript

//Benutzernamen und Kennwort extrahieren
$url = $_GET['url'];
$htuname = $_GET['htuname'];
$htpasswd = $_GET['htpasswd'];

unset($_GET['url']);
unset($_GET['htuname']);
unset($_GET['htpasswd']);

?>

<!DOCTYPE HTML>
<html xmlns="http://www.w3.org/1999/xhtml" lang="de">
<head>
<title>Weiterleitung</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<span>Bitte einen Augenblick Geduld: nach dem autmatisierten Login erfolgt die Weiterleitung. JavaScript muss im Browser aktiviert sein.</span>

<script type="text/javascript">
var url = "<?php echo $url ?>";
var htuname = "<?php echo $htuname ?>";
var htpasswd = "<?php echo $htpasswd ?>";

var data = <?php echo json_encode($_GET) ?>;

http = null;
if (window.XMLHttpRequest) {
    //Alle Browser außer IE5 und IE6
    http = new XMLHttpRequest();
} else {
    //IE5 und IE6
    http = new ActiveXObject("Microsoft.XMLHTTP");
}

//Parameter in String schreiben
var first = true;
for (name in data) {
    if (first) {
        first = false;
        url += "?";
    } else {
        url += "&";
    }
    url += encodeURIComponent(name) + "=" + encodeURIComponent(data[name]);
}

http.open("get", url, false, htuname, htpasswd);
http.send();
if (http.status == 200) {
    document.location = url;
} else {
    alert("Benutzername und/oder Kennwort falsch.");
}
</script>

</body>
</html>

Wichtig ist wegen der SOP, dass diese Datei auf "Server 2" liegt.

Außerdem sollte der Link unbedingt HTTPS sein, da Benutzername und Kennwort sonst unverschlüsselt übertragen werden!

Falls jemand eine elegantere Lösung hat, kann er/sie die gerne noch posten.

Getestet in IE 8 und 9.

...zur Antwort
Geeigneter Ersatz für HTTP-Benutzernamen und -Kennwort in URL

Leider akzeptiert der Internet Explorer keine Adressen mehr der Form https://user:pass@example.com . Näheres dazu: http://support.microsoft.com/kb/834489 .

Ich suche jetzt eine geeignete Alternative dazu, die ohne serverseitige Browserweiche und nervige Login-Promts auskommt. Die Situation ist Folgende: "Server 1" hat ein schönes (sehr gut geschütztes) Webinterface. Auf einem anderen Server ("Sever 2") läuft ein Mailserver. Ich möchte jetzt den auf "Server 1" eingeloggten Benutzern (denen ich vertraue), die Möglichkeit bieten, ohne serverseitige Browserweiche und "Login-Orgien", auf das Webinterface von "Server 2" zuzugreifen. "Server 1" müssen alle Kennwörter von "Server 2" im Klartext bekannt sein (für einen hier nicht näher erläuterten Zweck). Es bedeutet also keinerlei zusätzliches Sicherheitsrisiko einen Link obiger Art anzubieten.

Die Server können untereinander nur über folgende Wege kommunizieren:

"Server 1" -> "Server 2" per E-Mail

"Server 2" -> "Server 1" per HTTP

Weiterreichen von Sitzungen und/oder Server-To-Server-HTTP(S)-Anfragen fallen damit leider aus.

Kann ich zum Beispiel auf "Server 1" ein PHP-Redirect-Script bauen, welches die HTTP-Authentifizierung übernimmt? Man kann ja schließlich auch POST-Variablen an den anderen Server schicken.

Leider kann/möchte ich das CGI-Script auf "Server 2" nicht anfassen; mir stehen also nur die Optionen der httpd.conf zur Verfügung. Könnte ich dort zum Beispiel valid-user ODER einen bestimmten referrer zulassen (Ist via HTTPS de facto genauso sicher, wie einen Link mit HTTP-Auth anzuklicken, da der referrer einem potentiellen Angreifer genauso unbekannt wie ein benutzername und kennwort ist)?

Habt ihr vielleicht noch kreative andere Ideen, weil es echt totaaal nervig ist, als Admin mehr als 50 verschiedene Passwort von Hand benutzen zu müssen (oben genannte "Login-Orgie")!?

...zum Beitrag

Tut mir schrecklich leid! Die beiden Links oben sind irgendwie verkümmert. Der zweite Link lautet http://support.microsoft.com/kb/834489

Schonmal Danke für Antworten.

...zur Antwort

Also ich suche schon seit ner Ewigkeit nach ner Lösung, aber bei der Internetrecherche habe ich das Problem, dass ich bei C++ und Windows immer auf Lösungen in Visual C++ stoße, welches ich aber NICHT verwende! Es muss duch irgendeine Möglichkeit geben, dafür eine Windows-DLL zu linken und das ohne VC++ zu machen! Wenn nicht: shame on Microsoft!

...zur Antwort

Also nochmal kurz fürs Protokoll: ich weiß inzwischen, wie es geht. Gaaaanz wichtig: den Rechner an den WAN-Port(!) des Routers hängen. Im Routersetup bei dem Typ der Internetverbindung "Static IP" angeben, am Windows-Rechner eine passende statische IP für den LAN-Adapter wählen und am Rechner die Einwahlverbindung über Rechte Maustaste->Eigenschaften->Erweitert für den LAN-Port freigeben.

...zur Antwort

Danke für all eure Vorschläge. Einen Router mit speziellem USB-Anschluss werde ich mir für die zwei Wochen allerdings auch nicht zulegen. Es ließ sich aber doch nach meinen Vorstellungen konfigurieren:

  • Surfstick in den Rechner

  • Entsprechende DFÜ-Verbindung unter "Netzwerkverbindungen" für Verwendung über LAN freigeben

  • WAN-Port vom Router mit LAN-Kabel an den Rechner angeschlossen

  • Im Routersetup Internetverbindung auf "Statische IP" 192.168.0.100 und Subnetzmaske natürlich auf 255.255.255.0

Fertig.

So kann ich jetzt mit allen Geräten im WLAN (vorallem die ohne USB-Anschluss) gleichzeitig den Stick nutzen.

...zur Antwort