Login POP Check




Aufgabe / Analyse:
Intranet Login ohne separate Passwort Datenbank
Zugriffe ab dem Intranet Proxy solle ohne Passwort Zugriff erhalten (bereits authentifiziert)
Dokumentation anonymisiert erstellen.

Lösung / Management Sumary:
Passwort Schutz des Intranet Servers
Als Username e-Mail Adresse und als Passwort POP3 Passwort des Hauptservers
Da die meisten auch Web-Mail nutzen ist ihnen auch das POP3 Passwort geläufig

Rahmenbedingungen:
- Auf dem Server muss PHP laufen
- der Web-Server ist Appache oder IIS
- es besteht ein POP3 Server zur PW Verifizierung

Design:
Da Microsoft die Passwortübergabe für http bei einem Security UpDate des Internet Explorer 6.0 entfernt hat, ist eine Umgehung des POP-UP’s für Passwort geschützte Verzeichnisse nicht mehr möglich!
Geht nicht mehr!!: http://username:passwort@www.meineDomain.ch
Daher bleibt nur noch die Möglichkeit ungeschützte Verzeichnisse zu verwenden und die jeweiligen html Pages mit einem PHP Script und Passwort Abfrage zu schützen.
Nachteil: Jedem hfref muss eine ID übergeben werden!

Ausführungen mit Codebeispielen:

Die Startseite index.htm mit dem IP Check oder Login Form

<html>
<head>
<title>Intranet meine Firma</title>
<meta name="GENERATOR" content="NotePad">
</head>
<body bgcolor="#ffffff">
<img src="images/logo.gif"><BR>
Web-Services<BR>
Intranet Login vom oeffentlichen Internet<BR>
<?php

 $ip = getenv("REMOTE_ADDR");                                   // IP-Adrasse erfragen
 if (SubStr($ip,0,5) !=
'192.168.') {                       // Ist nicht Privat IP Bereich
    echo "<FORM METHOD='POST' ACTION='login.php' >";        // dann Loginn Form aktivieren
    echo "   <TABLE cellspacing='0' cellpadding='0'>";
    echo "      <TR><TD colspan='2'>&nbsp;</TD></TR>";
    echo "      <TR><TD valign='to'>";
    echo "           Benutzername:<BR>";
    echo "           <INPUT NAME='POP_User' VALUE='' TYPE='text' SIZE=50 MAXLENGTH=20></TD>";
    echo "      </TR>";
    echo "      <TR><TD colspan='2'>&nbsp;</TD></TR>";
    echo "      <TR><TD valign='top'>";
    echo "           Passwort:<BR>";
    echo "           <INPUT NAME='POP_Password' TYPE='password' SIZE=50 MAXLENGTH=20></TD>";
    echo "      </TR>";
    echo "      <TR><TD><BR></TD>";
    echo "      </TR>";
    echo "      <TR><TD>";
    echo "           <INPUT type='submit' value=' OK - am Intranet anmelden '>";
    echo "           <input type='reset' value=' alles loeschen '></TD>";
    echo "      </TR>";
    echo "   </TABLE>";
    echo "</FORM>";
    echo "<hr> &copy; Copyright 2005 by clinch.ch, Alle Rechte vorbehalten <BR>";
  } else {
    echo "Login aus dem internen Netz weiter ohne Passwort-Abfrage<BR>";
    $DATUM = date("dmY");
    $ID    = $DATUM * 7;
    echo "<META HTTP-EQUIV='Refresh' CONTENT='0; URL=http://menu.htm?ID=" .
$ID . "'>";}
?>

</body>
</html>



Die Passwortprüfung login.htm (Daten gesendet von Login Form)

<html><head>
<title>Intranet Meine Firma</title>
<meta name="GENERATOR" content="NotePad">
</head>
<body>
<p>Login Intranet</p>

<?php
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%                                                                          %%
%%  Programm:   eMail Konto Abfrage für Intranet.stfw.ch                    %%
%%  Datum:      23.06.2005                                                  %%
%%  Autor:      Manuel Magnin                                               %%
%%  Version:    0.1                                                         %%
%%  Aenderung:  11.09.05  Nach Username & Passwort OK DateHash übergaeben   %%
%%                        PHP Include für Hash Check einbauen               %%
%%                        da http://user:pass@www.xxx.ch nach MSUpDate fail %%
%%                                                                          %%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/?>


<?php
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%                                                                          %%
%%  Bei jeder HTML seite muss folgendes eingefügt werden:                   %%
%%  <#php include "loginChkIncl.php"; #>                                    %%
%%                                                                          %%
%%  Bei jdem Link auf eine weitere Seiten muss folgendes eingefügt werden:  %%
%%  <A href="infos.htm<?php global $ID; echo "?ID=" . $ID; ?>"Infos</A>     %%
%%                                                                          %%
%%  Inhalt der include Datei: loginChkIncl.php                              %%
%%  <#php  global $ID;                                                      %%
%%         $DATUM = date("dmY");                                            %%
%%         $IDNeu = $DATUM * 7;                                             %%
%%         if ($ID <> $IDNeu) {                                             %%
%%           echo "$ID $IDNeu Login ID Abgelaufen<BR>";                     %%
%%           echo "Sie werden sofort zum Login geleitet<BR>";               %%
%%           echo "<META HTTP-EQUIV='Refresh' CONTENT='0; URL=index.php'>";}%%
%%  #>                                                                      %%
%%                                                                          %%
%%  ACHTUNG: Alle # müssen im obigen Source durch ? ersetzt werden          %%
%%                                                                          %%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/?>


<?php

/*  Aufruf: http://Intranet.stfw.ch/login.php?Name=MailKonto;PassWort=xxx */
/*  Auchtung reihenfolge der Variable muss stimmen, Variablen Namen sind egal */
//---- Variablen deklaration und Konfigurationsbereich ----
global $ip;                                           // IP-Adrasse
global $IPLogFile;                                    // IP-AccessLog
global $cfile;                                        // Access-Count DataBase
global $KundenNr;                                     // bergeben via Post
global $Passwort;                                     // bergeben via Post
global $POP_Server;                                   // Mail-Server Adresse intern
//global $POP_Username;                               // uebergeben via Post
//global $POP_Password;                               // uebergeben via Post
global $ValidHash;                                    // Hash Code indicates Valid User
global $mbox;                                         // POP3 Protocol Result

$dbDate    = "";                                      // Datum der Datenbank
$ip        = getenv("REMOTE_ADDR");                   // IP-Adrasse erfragen
$IPLogFile = "IntranetAccess.log";                    // IP-AccessLog

$cfile     = "IntranetAccess.cou";                    // Access-Count DataBase

//  reset($HTTP_POST_VARS);                           // Varibeln übergabe URL
//  $POP_Username = current($HTTP_POST_VARS);         // 1. Varibele abholen
$POP_Username = SubStr($POP_Username,0,20);           // max 10 Zeichen für
//  next($HTTP_POST_VARS);

//  $POP_Password = current($HTTP_POST_VARS);         // 2. Varibele abholen
$POP_Password = SubStr($POP_Password,0,20);           // max 10 Zeichen für
//  next($HTTP_POST_VARS);


echo "<B>";                                           // IP Log / User Count
Besucher();                                           // Ausgabe Zähler
IPLog();                                              // Aufzeichnen IP, User, Pass
echo " von IP: $ip </B><BR>";

//if (strlen($POP_Password)=0) {
//  echo "Benutzername und Passwort ist erforderlich.
          Verwenden Sie Name und Passwort von Mailkonto";}
//else
echo "Guten Tag " . $POP_Username . " Ihr Name und Passwort wird überprüft <BR>";

$POP_Server   = "192.168.111.15";
//$POP_Username = "TestUser";                          // Test Zugang
//$POP_Password = "TestPassWD";                        // Test Zugang
error_reporting(0);                                    // Suppress all error messages
$mbox = imap_open ("{" .
$POP_Server . ":110/pop3}INBOX",$POP_Username,$POP_Password);
error_reporting(E_ERROR | E_WARNING | E_PARSE);        // Normal error handling
if ($mbox!=FALSE) {
   echo "Passwort Pruefung OK<BR>";
   echo $mbox . "<BR>";
   echo "Sie werden jetzt zum Intranet geleitet<BR>";
   $DATUM = date("dmY");
   $ID    = $DATUM * 7;
   echo "<META HTTP-EQUIV='Refresh' CONTENT='0; URL=menu.htm?ID=$ID'>";

   imap_close ($mbox);
} else {
   echo "Benutzername oder Passwort falsch<BR><BR>";
   echo "Fehler Nr.:" . $mbox . " " . imap_last_error() .
"<BR><BR>";
   echo "Sie werden in 4 Sekunden zurueck zum Login geleitet<BR>";
   echo "<META HTTP-EQUIV='Refresh' CONTENT='4; URL=index.htm'>";
}
?>

<?php  /* IP Adresse aufzeichnen */
function IPLog() {
  global $IPLogFile;
  global $REMOTE_ADDR;
  global $POP_Username;
  $fp = fopen($IPLogFile,"a");
  fputs($fp,$REMOTE_ADDR .
" " .  date("Y.m.d") . $POP_Username  . " " . "\r\n");
  fclose ($fp);
}?>

<?php  /* Zugriffszhler */
function Besucher() {
  global $cfile;
  global $REMOTE_ADDR;
  if (file_exists($cfile)) {
    $fp   = fopen($cfile,"r+");
    $data = fgets($fp,25);
    $ip   = chop(substr($data,0,15));
    $count = substr($data,16);
    $count += 1;
    rewind ($fp);
    fputs($fp,substr($ip."          ",0,16).$count);
    fclose ($fp);
    echo "Besucher: $count";
  } else {
    $fp = fopen($cfile,"w");
    $np = $REMOTE_ADDR;
    $count = "1";
    fputs($fp,substr($np."          ",0,16).$count);
    fclose ($fp);
  }
}?>

<BR><BR>

</body></html></body>
</html>



1. Anpassung an jeder HTML Seite zur Prüfung der ID (Include oben einfügen)
Bei jeder HTML Seite muss folgendes eingefügt werden:
<?php include "loginChkIncl.php"; ?>

Die Prüfdatei (include) loginChkIncl.php mit dem die ID geprüft wird

<?php
   global $ID;
   $DATUM = date("dmY");
   $IDNeu = $DATUM * 7;
   if ($ID <> $IDNeu) {
     echo "$ID $IDNeu Login ID Abgelaufen<BR>";
     echo "Sie werden sofort zum Login geleitet<BR>";
     echo "<META HTTP-EQUIV='Refresh' CONTENT='0; URL=index.htm'>";}
?>



2. Anpassung an jeder HTML Seite, jeder Link mit ID ergänzen
Bei jedem Link auf eine weitere Seiten muss folgendes eingefügt werden:
<A href="infos.htm<?php global $ID; echo "?ID=" . $ID; ?>"Infos</A>

Sicherheit, Abschlusstest, Qualität, Nachtrag:
Achtung das ist kein 100% iger Schutz! Bei bekannter Position einer Download Datei nicht HTML Datei kann diese auch ohne Passwort herunter geladen werden!
Beispiel: http://www.meinePage.ch/downloads/WinZIP.exe

Folgerung & Erweiterungen:
Eine gute Umgehung für Download Links ist es, diese Dateien per FTP zugänglich machen via separatem Verzeichnis. Dort funktioniert die Passwort Übergabe via Browser immer noch hervorragend. Beispiel: ftp://username:passwort@ftp.meineDomain.ch


Info und Anregungen an:

Manuel Magnin
Info (at) Clinch.ch