Unsicheres Login Script ?

OpenMedia

Lieutenant
Registriert
Okt. 2016
Beiträge
706
Hallo zusammen,

ich habe mir mal aus dem Internet ein Login Script herausgesucht was soweit eigentlich auch gut funktioniert. Nun zu meiner Frage wenn ich explizit einen falschen Nutzernamen und Passwort eingebe, wird mir der Zugang nicht gewährt soweit so gut. Wenn ich einen richtigen Nutzer eingebe werde ich eingeloggt.

Nun zu dem Problem wenn ich kein Nutzernamen und Kein Passwort eingebe und nur auf den login Button klicke werde ich dennoch Erfolgreich eingeloggt und weitergeleitet weiß jemand wo der Fehler steckt ?

Code:
<?php
error_reporting(E_ALL);
ini_set('display_errors', 'On');
define('DOMAIN_FQDN', 'ad.com'); //Replace with REAL DOMAIN FQDN
define('LDAP_SERVER', 'ldap.com.serber.com');  //Replace with REAL LDAP SERVER Address
//Basic Login verification

if (isset($_POST['submit']))
{
    $user = strip_tags($_POST['username']) .'@'. DOMAIN_FQDN;
    $pass = stripslashes($_POST['password']);
    $conn = ldap_connect("ldap://". LDAP_SERVER ."/");
    if (!$conn)
        $err = 'Could not connect to LDAP server';
    else
    {
        //        define('LDAP_OPT_DIAGNOSTIC_MESSAGE', 0x0032);  //Already defined in PHP 5.x  versions
        ldap_set_option($conn, LDAP_OPT_PROTOCOL_VERSION, 3);
        ldap_set_option($conn, LDAP_OPT_REFERRALS, 0);
        $bind = @ldap_bind($conn, $user, $pass);
        ldap_get_option($conn, LDAP_OPT_DIAGNOSTIC_MESSAGE, $extended_error);
        if (!empty($extended_error))
        {
            $errno = explode(',', $extended_error);
            $errno = $errno[2];
            $errno = explode(' ', $errno);
            $errno = $errno[2];
            $errno = intval($errno);
            if ($errno == 532)
                $err = 'Unable to login: Password expired';
        }
        elseif ($bind)
        {
            //determine the LDAP Path from Active Directory details
            $base_dn = array("CN=Users,DC=". join(',DC=', explode('.', DOMAIN_FQDN)),
                             "OU=Users,OU=People,DC=". join(',DC=', explode('.', DOMAIN_FQDN)));
            $result = ldap_search(array($conn,$conn), $base_dn, "(cn=*)");
            if (!count($result))
                $err = 'Result: '. ldap_error($conn);
            else
            {
                echo "Success";
                 die('Login erfolgreich. Weiter zu <a href="geheim.php">internen Bereich</a>');
            }
        }
    }
    // session OK, redirect to home page
    if (isset($_SESSION['redir']))
    {
        header('Location: /');
        exit();
    }
    elseif (!isset($err)) $err = 'Result: '. ldap_error($conn);
    ldap_close($conn);
}
?>
<head>
</head>
<body>
    <div align="center">
        <h3>Server</h3>
        <div style="margin:10px 0;"></div>
        <div title="Login"  id="loginbox">
            <div style="padding:10px 0 10px 60px">
                <form action="<?php echo $_SERVER['PHP_SELF'] ?>" id="login" method="post">
                    <table><?php if (isset($err)) echo '<tr><td colspan="2" class="errmsg">'. $err .'</td></tr>'; ?>
                        <tr>
                            <center><td>Login:</td></center>
                            <br>
                            <td><input type="text" name="username" autocomplete="off"/></td>
                            <td>Password:</td>
                            <td><input type="password" name="password"  autocomplete="off"/></td>
                        </tr>
                    </table>
                    <input class="button" type="submit" name="submit" value="Login" />
                </form>
            </div>
        </div>
    </div>
</body>
</html>
 
OpenMedia schrieb:
ich habe mir mal aus dem Internet ein Login Script herausgesucht was soweit eigentlich auch gut funktioniert.
Nach dem Satz habe ich bereits aufgehört weiter zu lesen.
Leute, was denkt ihr eigentlich, wie programmieren funktioniert? Das man sich als Programmierer hinsetzen und dann solange irgendwelche Code-Schnipsel (die man nicht versteht) von Stackoverflow kopiert, bis das Programm irgendwie läuft?
Und meint ihr wirklich, das bei einem solchen Vorgehen zuverlässige, solide und sichere Software rauskommt?
 
  • Gefällt mir
Reaktionen: owned139, Ebrithil, Zerstoerer und 10 andere
Erstmal: Finger weg, wer keine Ahnung von LDAP, HTTP(s), Browsereigenschaften usw. hat, da muss ich @andy_m4 zustimmen. Um auch konstruktiv zu sein: Ich denke, wenn User und Passwort leer sind, dann gibt das bind einen Fehler zurück, der via @ unterdrückt wird. Du wirst trotzdem eingeloggt, weil du eine aktive Session von vorherigen Tests hast. Wie wäre es mit einer VM, die immer zurückgesetzt wird, nach jedem Test? Oder zumindest Testen mit Browser im Icognito-Modus?
 
scooter010 schrieb:
Erstmal: Finger weg, wer keine Ahnung von LDAP, HTTP(s), Browsereigenschaften usw. hat, da muss ich @andy_m4 zustimmen. Um auch konstruktiv zu sein: Ich denke, wenn User und Passwort leer sind, dann gibt das bind einen Fehler zurück, der via @ unterdrückt wird. Du wirst trotzdem eingeloggt, weil du eine aktive Session von vorherigen Tests hast. Wie wäre es mit einer VM, die immer zurückgesetzt wird, nach jedem Test? Oder zumindest Testen mit Browser im Icognito-Modus?

Vielen Dank. Leider auch im Icognito Modus oder im anderen Browser wenn Nutzername und Passwort leer ist dann wird dennoch eingeloggt.

Ich muss natürlich noch ergänzen das ich sehr wohl Erfahrung im Bereich Https etc. habe nur das wird natürlich erst später hinzugefügt.
Ergänzung ()

andy_m4 schrieb:
Nach dem Satz habe ich bereits aufgehört weiter zu lesen.
Leute, was denkt ihr eigentlich, wie programmieren funktioniert? Das man sich als Programmierer hinsetzen und dann solange irgendwelche Code-Schnipsel (die man nicht versteht) von Stackoverflow kopiert, bis das Programm irgendwie läuft?
Und meint ihr wirklich, das bei einem solchen Vorgehen zuverlässige, solide und sichere Software rauskommt?

Ich kann dein Ungunst verstehen es wird nicht produktiv damit was gemacht sondern nur zum testen für den privaten gebrauch und da benötigt man keine High-Level-Security Authentication daher die Frage ;)
 
Das Skript sieht furchtbar aus.
"Such" dir lieber ein anderes. (erstelle eine ordentliche Klasse zur LDAP-Authentifizierung mit sauberer Fehlerbehandlung und Plausibilitätsprüfung)

Das "Problem" steckt gleich in mehreren Zeilen: 8, 13, 15, 20, 22, 32, 38 & 40
Überall ist die Prüfung unsicher / unsinnig / schlecht. Das dickste Problem steckt wohl in Zeile 20.
Kurzum: Es ist halt kein Fehler, wenn kein Benutzername und kein Passwort übergeben wird. Das Skript prüft aber immer nur auf "Fehler vorhanden, sonst weiter" bis hin zum Logon. Und wenn ich da schon wieder unnötigerweise mit @ unterdrückte Warnungen / Fehler sehe, dann bekomme ich das harte kotzen. Solchen Code kann man gleich wegwerfen, wenn man irgendwo ein @-Zeichen vor einer Funktion sieht.
Entweder funktioniert etwas ohne Fehler oder nicht. Die "Fehler" einfach zu unterdrücken und trotzdem weiter zu machen ist ein ganz miserabler Style und lässt auch für den Rest nichts gutes Hoffen, wie in dem obigen Beispiel ja auch deutlich zu sehen ist.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: BeBur
OpenMedia schrieb:
nur zum testen für den privaten gebrauch und da benötigt man keine High-Level-Security Authentication daher die Frage
Das entbindet Dich trotzdem nicht von Eigeninitiative.
Ich glaube, es hat kaum jemand ein Problem damit, wenn man an einer spezifischen Stelle nicht weiter kommt oder von mir aus mal ne Grundsatzfrage dazu hat, wie man Probleme löst.

Ansonsten: Wenn jemand etwas nicht kann, muss er jemanden beauftragen der es kann oder muss sich selbst reinarbeiten.
Stattdessen bettelst Du um kostenlose Hilfe. Bei wildfremden Leuten!
Das kannste von mir aus noch mit Deinem Kumpel machen. Und selbst der wird irgendwann sagen: "Hey. Wenn ich Dir bei der Sache helfe, musst du mir auch beim Umzug helfen".

Solche Foren sind ne tolle Sache und vor allem die hilfsbereiten Menschen hier. Man sollte dann aber auch so fair sein, das nicht auszunutzen.
 
ayngush schrieb:
Das Skript sieht furchtbar aus.
"Such" dir lieber ein anderes. (erstelle eine ordentliche Klasse zur LDAP-Authentifizierung mit sauberer Fehlerbehandlung und Plausibilitätsprüfung)

Das "Problem" steckt gleich in mehreren Zeilen: 8, 13, 15, 20, 22, 32, 38 & 40
Überall ist die Prüfung unsicher / unsinnig / schlecht. Das dickste Problem steckt wohl in Zeile 20.
Kurzum: Es ist halt kein Fehler, wenn kein Benutzername und kein Passwort übergeben wird. Das Skript prüft aber immer nur auf "Fehler vorhanden, sonst weiter" bis hin zum Logon. Und wenn ich da schon wieder unnötigerweise mit @ unterdrückte Warnungen / Fehler sehe, dann bekomme ich das harte kotzen. Solchen Code kann man gleich wegwerfen, wenn man irgendwo ein @-Zeichen vor einer Funktion sieht.
Entweder funktioniert etwas ohne Fehler oder nicht. Die "Fehler" einfach zu unterdrücken und trotzdem weiter zu machen ist ein ganz miserabler Style und lässt auch für den Rest nichts gutes Hoffen, wie in dem obigen Beispiel ja auch deutlich zu sehen ist.

Vielen Dank wie könnte man denn sagen wenn garnichts hinterlegt ist dann sende einen Fehler ?
 
Ernsthaft: Wirf das Skript weg, das ist von vorne bis hinten miserabel. Da würde ich gar nichts dran erweitern.
Ein Logon-Skript muss von Grund auf richtig aufgebaut werden, das vorliegende ist jedoch von Grund auf falsch aufgebaut. Schon die grundlegende Logik dahinter (wenn keine Fehler auftreten, dann melde den User an) ist komplett falsch. Die richtige Logik eines Logon-Skriptes lautet ja: Wenn der Benutzer erfolgreich authentifiziert und autorisiert werden kann führe die Anmeldung durch.
 
+1 Script wegschmeißen. Es gibt doch wohl fertige Lösungen für LDAP und PHP. Sowas baut man nicht 'mal eben' neu und erst recht kopiert sich das niemand zusammen. Solche simplen Dinge würde man auch in kurzer Zeit debuggen... wenn man wollte... was man nicht will...

Du brauchst vielleicht nicht "High-Level-Security", aber du brauchst definitiv "Normal-Level-Security" anstatt "Spielerei-Fake-Security".
 
BeBur schrieb:
+1 Script wegschmeißen. Es gibt doch wohl fertige Lösungen für LDAP und PHP. Sowas baut man nicht 'mal eben' neu und erst recht kopiert sich das niemand zusammen. Solche simplen Dinge würde man auch in kurzer Zeit debuggen... wenn man wollte... was man nicht will...

Du brauchst vielleicht nicht "High-Level-Security", aber du brauchst definitiv "Normal-Level-Security" anstatt "Spielerei-Fake-Security".

Vielen Dank könntest du mir eventuell ein script empfehlen ich habe leider nichts gefunden :( Alles was ich ausprobiert habe hat nicht wirklich funktioniert ich möchte nur, das dass Script prüft ob der Nutzer überhaupt in der AD exisitiert und nicht ob er in bestimmten gruppen ist.
 
Irgend ein Script einzusetzen ohne zu wissen wie es funktioniert oder was es genau tut ist irgendwie nicht so ne gute Idee.
Zumal sich so ein Script zu bauen im Grund nicht sonderlich schwierig ist.
Code:
prepared statement um daten für gegebenen nutzernamen zu bekommen
wenn exakt 1 wert zurück gegeben wird:
    stimmt der gespeicherte hash mit meinem passwort überein? (password_verify)
    wenn ja
        dann setz was auch immer um irgend nen login zu machen
Das ganze ist dann zwar auch nicht zwingend sicher, sendet aber zumindest nicht deine Passwörter unbemerkt sonst wo hin.
 
Ich brauche PHP in Kombination mit LDAP nur selten. Aber wenn ich es brauche nutze ich in der Regel diese Libary die einwandfrei funktioniert und mit Composer easy installierbar ist.

https://github.com/Adldap2/Adldap2
 
Zurück
Oben