Benutzerlogin via SMTP überprüfen...

21.09.2010 yahe code legacy

Ich habe zur Zeit den Fall, dass ich überprüfen muss, ob jemand Zugriff auf bestimmte Daten haben darf. Der entsprechende Personenkreis bekommt von mir allerdings einfach nur einen E-Mail-Account auf einem meiner Server zugewiesen und ehrlich gesagt habe ich keine Lust, zwei Benutzerverwaltungen mit entsprechendem Passwortabgleich oder ähnliches zu betreiben.

Deshalb habe ich mir gedacht "Warum teste ich nicht einfach, ob die Person einen gültigen E-Mail-Account bei mir hat?". Leider bietet PHP keine einfache Möglichkeit, einen SMTP-Login durchzuführen. Es gibt zwar etwas in der PEAR-Bibliothek, das wäre aber wie mit Kanonen auf Spatzen zu schießen. Ich habe mir deshalb einfach mal angeguckt, wie so eine SMTP-Authentifizierung funktioniert. Der Quelltext ist dabei in meinem Fall speziell auf meinen SMTP-Server zugeschnitten, der ausschließlich AUTH LOGIN unterstützt.

  function smtpLogin($server, $port, $timeout, $username, $password) {
    $result = false;

    $authOK   = "235 ";
    $ehloEnd  = "250 ";
    $password = base64_encode($password);
    $username = base64_encode($username);

    $socket = fsockopen($server, $port, $errorNo, $errorStr, $timeout);
    if ($socket) {
      $input = fgets($socket);             // read welcome message
      fwrite($socket, "EHLO irgendwas\n"); // send EHLO

      do {
        $input = fgets($socket);
        $done  = (stripos($input, $ehloEnd) !== false);
      } while (!$done);

      fwrite($socket, "AUTH LOGIN\n");   // send AUTH LOGIN
      $input = fgets($socket);           // read "username" message
      fwrite($socket, $username . "\n"); // send username
      $input = fgets($socket);           // read "password" message
      fwrite($socket, $password . "\n"); // send password
      $input = fgets($socket);           // read login result;

      $result = (stripos($input, $authOK) !== false);

      fwrite($socket, "QUIT\n"); // send QUIT
      fclose($socket);
    }

    return $result;
  }

Die Verwendung von "fsockopen()" zum Herstellen der Verbindung hat übrigens einen super Nebeneffekt: Durch Voranstellen der Strings "ssl://" vor den Hostnamen (und natürlich dem Auswählen der richtigen Portnummer) kann man den gleichen Quelltext auch für einen SMTPS-Server verwenden!


Search

Categories

administration (40)
arduino (12)
calcpw (2)
code (33)
hardware (16)
java (2)
legacy (113)
linux (27)
publicity (6)
review (2)
security (58)
thoughts (21)
windows (17)
wordpress (19)