извините за повторяющийся вопрос, я видел несколько из них на этом форуме, но ни один из ответов не работал для меня …
Я создаю базовый логин, используя php-сессии, которые я новичок в …
login.php проверяет форму входа в html и начинает сеанс, устанавливая переменные: $_SESSION['login']
и $_SESSION['id]
,
то каждая страница, для которой требуется действительное использование логина, require 'session.php';
который проверяет переменную $_SESSION['valid']
и перенаправляет пользователя без правильной переменной входа. Проблема в том, что при выходе из системы ни одна переменная сеанса, которую я установил, не будет отменена.
Прямо сейчас мой файл logout.php использует каждый метод для уничтожения переменных, которые я смог найти в Интернете, и никто на самом деле этого не сделает.
Поэтому всякий раз, когда я выхожу из системы, я могу получить доступ к «закрытым» страницам.
Также обратите внимание: я пробовал это с именем сессии ex: session_start();
это не работает, так что теперь я использую session_start("user");
Также обратите внимание: я НЕ использую файлы cookie.
Вот файлы, которые я упомянул:
login.php
$email=$_POST['email-log']; $pass=$_POST['password-log']; $i=-1; do {$i++; $path="users/".$i.".json"; $file= file_get_contents($path); $x=json_decode($file,true); } while($x['email']!=$email); $id=$i; $truepass=$x['pass']; $errors=0; $hash=hash('sha256',$pass); if($hash != $truepass){$errors=$errors+1;} if($errors==0){ session_start("user"); $_SESSION['login']="valid"; $_SESSION['id']=$id; header('Location: loginlanding.php');} else{header('Location: front.php?error=y');}
session.php
session_start("user"); if($_SESSION['login'] !== "valid") {header('Location: front.php?needto=login');}
logout.php
unset($_SESSION); unset($_SESSION['login']); unset($_SESSION['id']); session_unset("user"); $_SESSION=array(); session_destroy("user"); header('Location: front.php?logged=out');
Любые ответы приветствуются, и я благодарю вас заранее, также обратите внимание: я новичок в логинах в целом, поэтому любые советы по повышению безопасности также приветствуются. Я планирую сделать его более безопасным, но сначала мне нужно запустить эту базовую функциональность.
Вы никогда не должны unset($_SESSION)
.
Самый простой способ очистить переменную $_SESSION = Array();
– $_SESSION = Array();
Однако вы также можете выполнить итерацию с unset
:
foreach(array_keys($_SESSION) as $k) unset($_SESSION[$k]);
Удивительно, сколько вещей вы пытаетесь сделать после того, как вы отменили единственную ссылку, которую вы имели на сеанс в первую очередь. Непосредственно из руководства:
предосторожность
НЕ ОТКЛЮЧИТЕ всю
$_SESSION
сunset($_SESSION)
как это отключит регистрацию переменных сеанса через$_SESSION
.
Вы отменяете $_SESSION
поэтому ваши unsets для других массивов супер-глобальной $_SESSION
не регистрируются, оставляя их все еще в временных файлах браузеров. Используйте session_unset()
вместо этого, если вы пытаетесь удалить все переменные сеанса. В противном случае не отключайте сеанс глобальный, но не удаляйте каждое отдельное значение, которое вы хотите удалить.
Мой рабочий пример (обратите внимание, что вы должны положить начало вызова)
<?php session_start(); session_unset(); session_destroy(); header('location: ./'); ?>