Mein Loginsystem

  • Hallo.
    Ich habe ein Loginsystem gebastelt. Und was ist daran so besonders? Man kann seine Sitzungen jederzeit beenden. Das heißt: Ich bin am PC eingeloggt, logge mich mit dem Handy auch auf der Seite in den selben Account ein und kann die Sitzung die zwischen dem PC und der Seite besteht beenden. Bis auf mehrere Accounts funktioniert alles .. keine Ahnung was da los ist :D.
    Logindaten: - Gast & Wambo.
    Da wie gesagt Accountverwaltung (noch) nicht funktioniert, könnt ihr ja in der Zwischenzeit euch gegenseitig die Sitzungen ausknipsen :D
    Finde das Prinzip bzw. die Idee dahinter ganz interessant und daher dachte ich, ich stelle euch das mal vor :P
    PS: Der Code ist Codetechnisch jetzt vllt nicht optional ... habe laaange nichts gemacht und bin gestern abend/heute morgen erst wieder reingekommen ;)
    ------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    Und wie ich das ganze mache, erfahrt ihr hier:
    Ich speichere in einer Datenbank alle Sitzungen. Bei jedem aufruf einer geschützten Seite schaut die Datenbank, ob bei dem eintrag mit der Sitzungs-ID $_SESSION['id'] noch TRUE (aktiv) steht.
    ------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    html-seminar.de/woltlab/attachment/401/html-seminar.de/woltlab/attachment/400/


    login.php

    PHP
    <?phpsession_start();mysql_connect( "***", "***", "***" );mysql_set_charset("utf-8");mysql_select_db( "***" );$return = mysql_query( "SELECT `active` FROM `login_sessions` WHERE `id` = '". $_SESSION['id'] ."' " );$return = mysql_fetch_assoc( $return );$_SESSION['eingeloggt'] = $return['active'];if( isset( $_SESSION['eingeloggt']) && $_SESSION['eingeloggt'] ){    header( "Location: index.php" );}   if( isset( $_POST['button'] ) ){    if( $_POST['button'] === "Anmelden" )    {        $userName = htmlspecialchars( $_POST['username'] );        $passwordHash = md5( "Wambo" . $_POST['password'] . "Wambo" );        $result = mysql_query( "SELECT `id`, `firstName`, `surName`, `userName` FROM `users` WHERE `userName` = '".$userName."' AND `passwordHash` = '".$passwordHash."' " );        $result = mysql_fetch_assoc( $result );        if( isset( $result['id'] ) )        {            $_SESSION['User-ID'] = $result['id'];            $_SESSION['UserRealName'] = $result['firstName']." ".$result['surName'];            $_SESSION['UserName'] = $result['userName'];            $_SESSION['eingeloggt'] = true;            mysql_query( "INSERT INTO `login_sessions` (`user_ID`, `active`, `ipHash`) VALUES ( '".$_SESSION['User-ID']."', true, '". md5( "Wambo" . $_SERVER['REMOTE_ADDR'] . "Wambo" ) ."' ) " );            $result = mysql_query( "SELECT `id` FROM `login_sessions` WHERE `user_ID` = '". $_SESSION['User_ID'] ."' AND `active` = true AND `ipHash` = '". md5( "Wambo" . $_SERVER['REMOTE_ADDR'] . "Wambo" ) ."' " );            $result = mysql_fetch_assoc( $result );            $_SESSION['id'] = $result['id'];            header( "Location: index.php" );        }    }}?><!DOCTYPE html><html>    <head>        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">        <title>Login</title>        <script>            function cleanInputFieldValue( fieldID )            {                document.getElementById( fieldID ).value = "";                if( fieldID === "two" )                {                    document.getElementById( fieldID ).type = "password";                }            }        </script>        <style>            form            {                width: 200px;            }        </style>    </head>    <body>        <form action="" method="Post">            <fieldset>                <label>                    <input name="username" type="test" value="Benutzername..." id="one" onclick="cleanInputFieldValue('one')" onfocus="cleanInputFieldValue('one') " />                </label>                <label>                    <input name="password" type="test" value="Passwort..." id="two" onclick="cleanInputFieldValue('two')" onfocus="cleanInputFieldValue('two') " />                </label>                <input name="button" type="Submit" value="Anmelden" />            </fieldset>        </form>    </body></html>


    checkLoginSession.php

    PHP
    <?phpsession_start();$mysql_connection = mysql_connect( "***", "***", "***" );mysql_set_charset("utf-8");mysql_select_db( "***" );$return = mysql_query( "SELECT `active` FROM `login_sessions` WHERE `id` = '". $_SESSION['id'] ."' " );$return = mysql_fetch_assoc( $return );$_SESSION['eingeloggt'] = $return['active'];if( !isset( $_SESSION['eingeloggt']) || !$_SESSION['eingeloggt'] ){    header( "Location: login.php" );}    ?>


    index.php

    PHP
    <?phprequire( "checkLoginSession.php" );?><!DOCTYPE html><html>    <head>        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">        <title></title>    </head>    <body>        <a href="logout.php">logout</a>        <fieldset>            <legend>Nutzerübersicht</legend>            <table border="1">                <tr>                    <td>id</td>                    <td>richtiger Name</td>                    <td>Benutzername</td>                </tr>                <tr>                    <td>-</td>                    <td>-</td>                    <td>-</td>                </tr>                <tr>                    <td>                        <?php echo $_SESSION['User-ID'] ?>                    </td>                    <td>                        <?php echo $_SESSION['UserRealName'] ?>                    </td>                    <td>                        <?php echo $_SESSION['UserName'] ?>                    </td>                </tr>            </table>            </fieldset>        <fieldset>            <table border="1">                <tr>                    <td>Sitzungs-ID</td>                    <td>Startdatum</td>                    <td>aktiv</td>                    <td>Enddatum</td>                </tr>            <legend>Übersicht über Sitzungen</legend>            <?php            /* deaktivieren von Sitzung */            if( isset($_GET['id']) )            {                mysql_query("UPDATE `login_sessions` SET `active`=false,`endDate`='".date("Y-m-d H:i:s")."' WHERE `id` = '".$_GET['id']."';");            }            /* ------------------------ */            $return = mysql_query( "SELECT * FROM `login_sessions` WHERE `user_ID` = '".$_SESSION['User-ID']."'" );            while( $result = mysql_fetch_assoc($return) )            {                $result['active'] = str_replace(0, "false", $result['active']);                $result['active'] = str_replace(1, "true", $result['active']);                $result['endDate'] = str_replace("0000-00-00 00:00:00", "-- aktiv --", $result['endDate']);                echo "<tr>";                echo "<td>".$result['id']."</td>";                echo "<td>".$result['startDate']."</td>";                if( $result['active'] === "true" )                {                    $result['active'] = "<a href='?id=".$result['id']."'>".$result['active']."</a>";                }                echo "<td>".$result['active']."</td>";                echo "<td>".$result['endDate']."</td>";                echo "</tr>";            }            ?>        </fieldset>    </body></html>


    logout.php

    PHP
    <?phpsession_start();mysql_connect( "***", "***", "***" );mysql_set_charset("utf-8");mysql_select_db( "***" );mysql_query( "UPDATE `login_sessions` SET `active`=false,`endDate`='".date("Y-m-d H:i:s")."' WHERE `id` = '".$_SESSION['id']."';" );unset( $_SESSION );session_destroy();header("Location: login.php");?>
  • So jetz hatte ich mal den Kopf frei.


    Gefällt mir.
    Ich persönlich würde jetzt noch prepared statements nutzen. Dann sind sql injections nicht mehr möglich.


    Wäre jetzt auch mal schön zu sehen, ob es mit mehreren benutzern funktioniert.
    Evtl auch (als main admin) per click das passwort eines nutzers resetten.


    btw - was macht eigtl -> header( "Location: index.php" );
    Heisst das, dass ab diesem punkt, oder bei übergeben an den browser diese seite aufgerufen wird?

  • Version 2.0 .. mehrere Benutzer funktionieren jetzt :)
    Und jetzt kommt die Schlechte Nachricht: Auf meinem Server scheint MySQLi oder zumindest MySQLi_stmt... Probleme zu bereiten. :wacko:
    Daher kann man es leider nicht auf meinem Server testen :-/ .. oder liegt es vllt am code?

  • liegt sicher am connecten.


    guck mal bei "// connect to the db"
    Prepared Statements


    try{}catch{}



    btw: lass ", array(PDO::ATTR_PERSISTENT => true)" weg falls du keine persistente verbindung möchtest


    edit: und was ist "ss" ?

    PHP
    $stmt->bind_param("ss", $endDate, $_GET['delete'] );


    PHP
    $stmt = $mysql->prepare( "UPDATE `login_sessions` SET `active` = 'false', `endDate` = ? WHERE `id` = ? " );


    ^erwartet 2 parameter (?,?)
    und du übergibst 3 =)
    Dann functioniert (soweit ich weiß) bindparam so nicht.


    guck mal hier:

    PHP
    $stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (?, ?)");
    $stmt->bindParam(1, $name);
    $stmt->bindParam(2, $value);


    http://php.net/manual/en/pdo.prepared-statements.php


    ich würde keine "?" empfehlen.
    Ich mag eher die "named placeholders"

  • Fatal error: Call to undefined method mysqli_stmt::get_result() in /www/htdocs/***/loginsystem/index.php on line 63


    Und beim registrieren steht immer Benutzername sei bereits vergeben. Im localhost geht alles möchte ich nochmal erwähnen

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!