• 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");?>

    Einmal editiert, zuletzt von unkown-6363 (23. Februar 2013 um 17:02)

  • 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?

    Einmal editiert, zuletzt von unkown-6363 (25. Februar 2013 um 16:49)

  • 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"

    Einmal editiert, zuletzt von cottton (25. Februar 2013 um 18:00)

  • und was ist "ss" ?


    zwei Strings als parameter^^. Der andere (dritte) Parameter ist doch vorgegeben und quasi nicht "dynamisch"
    Deine verwirrungen kommen sicherlich zustande, da ich das ganze mit MySQLi mache ..? Kann das sein? Und du amchst das ohne MySQLi.?

    Einmal editiert, zuletzt von unkown-6363 (26. Februar 2013 um 17:15)

  • 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!