hi,
tut mir leid das ich mich wiedermal zu Wort melde, jedoch versteh ich es wirklich nicht. Sitze nun stundenlang dran doch komme nicht weiter. Ich hab ein Skript das ich angemeldet bleiben soll wenn 2 Cookies existieren und der user-token mit der aus der Datenbank übereinstimmt.
Beispiel:
PHP Code:
if($_COOKIE['user-token'] === $rowData['session_user_token']) {
echo 'Erfolg';
}
Nachdem die beiden User-Tokens übereinstimmen, erfolg ein neuer Token mit einem Random String. Dann Update ich den Cookie in der DB und ersetze den durch meinem neuen. Ebenso setze ich einen neuen Cookie mit dem neuen Token.
Klappt auch alles, jedoch bekomm ich den Fehler (Die Tokens stimmen nicht überein). Ich versteh es nicht, ab und zu klappt es sogar das die Fehlermeldung nicht kommt und bei Opera und Mozilla klappt es flüssig.
Falls die tokens übereinstimmen soll er den Cookie Updaten falls
nicht soll er die Meldung (Tokens stimmen nicht überein) aussagen. Das lustige ist er macht beides ? Wie geht das denn..
Code
PHP Code:
function random_string() {
if(function_exists('random_bytes')) {
$bytes = random_bytes(16);
$str = bin2hex($bytes);
} else if(function_exists('openssl_random_pseudo_bytes')) {
$bytes = openssl_random_pseudo_bytes(16);
$str = bin2hex($bytes);
} else if(function_exists('mcrypt_create_iv')) {
$bytes = mcrypt_create_iv(16, MCRYPT_DEV_URANDOM);
$str = bin2hex($bytes);
} else {
$str = md5(uniqid('ijasd9d8asu9823asddasasdsdaasdasd2334dfs', true));
}
return $str;
}
if(!isset($_SESSION['id']) && isset($_COOKIE['user-token']) && isset($_COOKIE['user-auth-id'])) {
// User-auth-id bedeutet nichts anderes wie die User-Id. Wie z.b User 21.
$ident = $_COOKIE['user-auth-id'];
// SELECT CURRENT USER //
if($cUser = $pdo->prepare("SELECT `session_user_id`,`session_user_token` FROM `secure_session` WHERE `session_user_id` = :id LIMIT 1;")) {
$path = __DIR__ . '/../err_database/errorlog.txt';
$cUser->BindValue('id', $ident, PDO::PARAM_INT);
if(!$cUser->execute()) {
## ErrorLog
file_put_contents($path, PHP_EOL . serialize($cUser->errorInfo()));
}
}
$rowData = $cUser->fetch(PDO::FETCH_ASSOC);
// CHECK IF BOTH TOKENS ARE MATCH
if($_COOKIE['user-token'] === $rowData['session_user_token']) {
// CREATE NEW TOKEN STRING
$newToken = random_string();
// Update new User-Token //
if($updateToken = $pdo->prepare("UPDATE `secure_session` SET `session_user_token` = :user_token WHERE `session_user_id` = :id LIMIT 1;")) {
$updateToken->BindValue('user_token', $newToken, PDO::PARAM_STR);
$updateToken->BindValue('id', $ident, PDO::PARAM_INT);
if(!$updateToken->execute()) {
## ErrorLog
file_put_contents($path, PHP_EOL . serialize($cUser->errorInfo()));
}
// SET NEW COOKIES AND SESSION ID
setcookie('user-token', $newToken, time() + 43200, '/', '127.0.0.1', false, true);
setcookie('user-auth-id', $ident, time() + 43200, '/', '127.0.0.1', false, true);
$_SESSION['id'] = $rowData['session_user_id'];
}
} else {
echo $rowData['session_user_token'] . ' (Datenbank Cookie)' .'<BR><BR>';
echo $_COOKIE['user-token'] . ' (Client Cookie)';
echo '<br><br>';
die("Tokens stimmen nicht überein.");
}
}
Hab hier auch ein Video gemacht:
Ich hab mein Cookie ausgegeben. Er zeigt mir den alten Cookie noch. Der neue Cookie den ich gesetzt habe wurde auch gesetzt, jedoch muss ich immer meine Seite neu laden wenn es klappt.
PS: Im Video sieht man den ausgegebenen Cookie nicht ganz. Also der Datenbank Cookie stimmt mit dem neuen Cookie überein, nur wenn ich den Cookie ausgebe zeigt er mir noch den alten.