• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Cookies als "eingeloggt bleiben" Funktion

Okay, ich versuche mich mal an dem unteren Vorgehen!
Zukünftig werde ich erst einmal alle Posts mit vielen Votes lesen, bevor ich losgehe ...
Wieso hat dann der untere Post nicht den grünen Hacken?
 
Werbung:
Okay, ich versuche mich mal an dem unteren Vorgehen!
Zukünftig werde ich erst einmal alle Posts mit vielen Votes lesen, bevor ich losgehe ...
Wieso hat dann der untere Post nicht den grünen Hacken?

Weil der Fragende sich aussuchen kann, welche Antwort er als akzeptiert markiert.
Die Community voted jedoch. Daher ist eine Antwort mit mehr Votes eigentlich immer auch mehr wert.
 
Okay, jetzt funktioniert irgendetwas mit der DB-Abfrage nicht mehr.
Ich weiß aber gerade nicht, was, da es in der einen Datei ging und nur beim 1:1 kopieren auf einmal nicht mehr geht.

Hier der Fehler:
Notice: Undefined variable: mysqli in .........

Und hier der entsprechende Code:
PHP:
function rememberMe() {
    $cookie = isset($_COOKIE['rememberme']) ? $_COOKIE['rememberme'] : '';
    if ($cookie) { //falls Cookie vorhanden, dann -->
        list ($user_id, $token, $mac) = explode(':', $cookie);
        if ($mac !== hash_hmac('sha256', $user_id . ':' . $token, 'SECRET_KEY')) {
            return false;
        }
        $stmt = $mysqli->prepare("SELECT user_id, token, password FROM account WHERE user_ID = ? LIMIT 1");
        $stmt->bind_param('i', $user_id);
        $stmt->execute();
        $stmt->store_result();
        $stmt->bind_result($user_id, $user_token, $password);
        $stmt->fetch();
        if ( $user_token = $token) {
                    $user_browser = $_SERVER['HTTP_USER_AGENT'];
                    // XSS-Schutz, denn eventuell wir der Wert gedruckt
                    $user_id = preg_replace("/[^0-9]+/", "", $user_id);
                    $_SESSION['user_id'] = $user_id;
                    // XSS-Schutz, denn eventuell wir der Wert gedruckt
                    $username = preg_replace("/[^a-zA-Z0-9_\-]+/",
                                                                "",
                                                                $username);
                    $_SESSION['username'] = $username;
                    $_SESSION['login_string'] = hash('sha512',
                              $password . $user_browser);
                    $_SESSION['user_ID'] =$user_id;
                    // Login erfolgreich.
        }
    }
}
Den Fehler kann ich gerade nicht erkennen.
Und ja, ich weiß, dass die Konstante 'SECRET_KEY' die komplette Funktion unsicher macht, aber es ist ja nur zu Testzwecken.
 
Zuletzt bearbeitet:
Werbung:
Gib mal bitte die vollständige Fehlermeldung an, kann mir zwar schon denken wie Sie endet aber trotzdem. Woher kommt denn dein MySQLi-Objekt?
 
Notice: Undefined variable: mysqli in C:\xampp\htdocs\php-beispiele\Version-2015-01-26\includes\functions.php on line 111

Fatal error: Call to a member function prepare() on null in C:\xampp\htdocs\php-beispiele\Version-2015-01-26\includes\functions.php on line 111

Die Frage mit dem Objekt verstehe ich jetzt nicht so ganz. Klingt schon wieder nach Anfängerfehler.
 
Code:
$stmt = $mysqli->prepare("SELECT user_id, token, password FROM account WHERE user_ID = ? LIMIT 1");
Das Objekt muss ja irgendwoher kommen bzw. initialisiert werden. Da $mysqli null ist, kann die Funktion prepare auch nicht aufgerufen werden.
 
Werbung:
Ah okay, jetzt weiß ich was du meinst.
Das seltsame ist, dass weiter oben in der functions.php ein include ist, dass sich auf den Verbindungsaufbau mit der DB bezieht.
Also da steht das hier:
Code:
$mysqli = new mysqli("localhost", "BENUTZER", "PASSWORT", "TABELLENNAME");
Habe jetzt mal betreffende Stellen ersetzt.

In den anderen Funktionen, die ebenfalls in der Functions.php sind, geht die DB-Abfrage nämlich auch so.
 
Am besten postest du mal den kompletten Inhalt deiner functions.php und der Datei wo deine MySQL-Verbindung aufgebaut wird. Die anderen Aufrufe des MySQLi-Objekts in anderen Funktionen, funktionieren aber einwandfei so wie ich das verstehe?
 
Hier der Anfang einer anderen Funktion:
PHP:
function login($email, $password, $mysqli) {

Und genau das ist der Fehler.
Bei den anderen Funktionen gebe ich $mysqli mit, bei der o.g. nicht.
Habs korrigiert und siehe da, es geht!

Meinen besten Dank!!!
 
Werbung:
Du könntest es natürlich auch anders lösen, anstatt das du immer das Objekt bei jeder Fuunktion/Methode mitgibst.
 
Werbung:
Okay, so weit bin ich zwar glaube ich noch nicht, aber das Ziel ist es ja, dahin zu kommen :)
Auf jeden Fall juckt es in den Fingern ;)
 
Okay, jetzt funktioniert irgendetwas mit der DB-Abfrage nicht mehr.
Ich weiß aber gerade nicht, was, da es in der einen Datei ging und nur beim 1:1 kopieren auf einmal nicht mehr geht.

Hier der Fehler:


Und hier der entsprechende Code:
PHP:
function rememberMe() {
    $cookie = isset($_COOKIE['rememberme']) ? $_COOKIE['rememberme'] : '';
    if ($cookie) { //falls Cookie vorhanden, dann -->
        list ($user_id, $token, $mac) = explode(':', $cookie);
        if ($mac !== hash_hmac('sha256', $user_id . ':' . $token, 'SECRET_KEY')) {
            return false;
        }
        $stmt = $mysqli->prepare("SELECT user_id, token, password FROM account WHERE user_ID = ? LIMIT 1");
        $stmt->bind_param('i', $user_id);
        $stmt->execute();
        $stmt->store_result();
        $stmt->bind_result($user_id, $user_token, $password);
        $stmt->fetch();
        if ( $user_token = $token) {
                    $user_browser = $_SERVER['HTTP_USER_AGENT'];
                    // XSS-Schutz, denn eventuell wir der Wert gedruckt
                    $user_id = preg_replace("/[^0-9]+/", "", $user_id);
                    $_SESSION['user_id'] = $user_id;
                    // XSS-Schutz, denn eventuell wir der Wert gedruckt
                    $username = preg_replace("/[^a-zA-Z0-9_\-]+/",
                                                                "",
                                                                $username);
                    $_SESSION['username'] = $username;
                    $_SESSION['login_string'] = hash('sha512',
                              $password . $user_browser);
                    $_SESSION['user_ID'] =$user_id;
                    // Login erfolgreich.
        }
    }
}
Den Fehler kann ich gerade nicht erkennen.
Und ja, ich weiß, dass die Konstante 'SECRET_KEY' die komplette Funktion unsicher macht, aber es ist ja nur zu Testzwecken.

PHP:
if ($user_token = $token) {

Kleiner Fehler, große Wirkung ;)
Und wie gesagt, wenn timeSafeCompare empfohlen wird und auch als fertige Funktion vorliegt, sollte man das auch verwenden.
 
Werbung:
Der Beitrag von Peter Kropff zu OOP mit PHP 5 ist aufjedenfall empfehlenswert.
Ja genau das habe ich auch schon angefangen zu lesen.
Der Mann hat teils sehr lustige Beispiele :)

Kleiner Fehler, große Wirkung ;)
Und wie gesagt, wenn timeSafeCompare empfohlen wird und auch als fertige Funktion vorliegt, sollte man das auch verwenden.
Ja, das ist jetzt der nächste Schritt :) es sollte erst einmal das Einfache funktionieren, danach kann ich mich an hash_equal und timesafecompare ran machen :) das ist dann die Hausaufgabe für morgen :)

So langsam bin ich mit meinen Fortschritten zu frieden. Inzwischen verstehe ich, was ich hier zusammen kopiere :D
 
Ja genau das habe ich auch schon angefangen zu lesen.
Der Mann hat teils sehr lustige Beispiele :)


Ja, das ist jetzt der nächste Schritt :) es sollte erst einmal das Einfache funktionieren, danach kann ich mich an hash_equal und timesafecompare ran machen :) das ist dann die Hausaufgabe für morgen :)

So langsam bin ich mit meinen Fortschritten zu frieden. Inzwischen verstehe ich, was ich hier zusammen kopiere :D
Ich hoffe du hast gemerkt das scbawik dich auf den Fehler in der Verzweigung aufmerksam machen wollte. Dort machst du eine Zuweisung und keinen Vergleich. Solltest du es bemerkt haben, entschuldige. ;)
 
Grrr .... nicht bemerkt :)

Danke für den Hinweise! Das war zu subtil :)

Und da ich gerade timesafecompare eingebaut habe und es funktioniert, hätte ich den Fehler auch nie bemerkt.

Richtig müsste es doch so heißen: !== oder?
 
Werbung:
Grrr .... nicht bemerkt :)

Danke für den Hinweise! Das war zu subtil :)

Und da ich gerade timesafecompare eingebaut habe und es funktioniert, hätte ich den Fehler auch nie bemerkt.

Richtig müsste es doch so heißen: !== oder?
Kommt darauf an was du überprüfen möchtest.


Code:
if ($user_token == $token) {
Gibt TRUE zurück, wenn $user_token gleich $token ist.


Code:
if ($user_token === $token) {
Gibt TRUE zurück wenn $user_token gleich $token ist und beide vom gleichen Typ sind.


Code:
if ($user_token != $token) {
Gibt TRUE zurück, wenn $user_token nicht gleich $token ist.


Code:
if ($user_token !== $token) {
Gibt TRUE zurück, wenn $user_token nicht gleich $token ist, oder wenn beide nicht vom gleichen Typ sind.
 
Zurück
Oben