所以,我正在构建一个社交网络(社交媒体),为了让它更安全一点,我选择使用cookies/令牌来保存用户登录等。 现在我正在构建注销页面,我的目标是从我保存令牌的数据库中删除令牌(令牌),但是唯一要删除的是浏览器中的cookie,而不是数据库中的。
logout.php
<?php
include('DB.php');
include('cookie_login.php');
if (!Login::isLoggedIn())
{
die("not logged in.");
}
if (isset($_POST['confirm'])) {
if(isset($_POST['alldevices'])) {
DB_update::query_update('DELETE FROM tokens WHERE user_id=:userid',array(':userid'=>Login::isLoggedIn()));
}else{
if ($_COOKIE['SNID']) {
DB_update::query_update('DELETE FROM tokens WHERE token=:token',array(':token'=>sha1($_COOKIE['SNID'])));
}
setcookie("SNID",'1',time()-7000000,'/');
setcookie("SNID_",'1',time()-7000000,'/');
}
header("location: ../logout.html");
}
?>
cookie_login.php
<?php
class Login
{
public static function isloggedIn()
{
if (isset($_COOKIE['SNID'])) {
if (DB::query('SELECT user_id FROM tokens WHERE token=:token', array(':token' =>sha1($_COOKIE['SNID'])))) {
$userid = DB::query('SELECT user_id FROM tokens WHERE token=:token',array(':token' =>sha1($_COOKIE['SNID'])))[0]['user_id'];
if (isset($_COOKIE['SNID_'])) {
return $userid;
}else{
$cstrong = TRUE;
$token = bin2hex(openssl_random_pseudo_bytes(64,$cstrong));
DB_update::query_update('INSERT INTO tokens VALUES (\'\',:token,:user_id)',array(':token'=>sha1($token),':user_id'=>$userid));
DB_update::query_update('DELETE FROM tokens WHERE token=:token',array(':token'=>sha1($_COOKIE['SNID'])));
setcookie("SNID",$token, time() + 60*60*24*7, '/',NULL,TRUE,TRUE);
setcookie("SNID:",'1',time() + 60*60*24*3, '/',NULL,TRUE,TRUE);
return $userid;
}
}
}
return false;
}
}
?>
db.php
<?php
class DB
{
private static function connect()
{
$pdo = new PDO('mysql:host=127.0.0.1;dbname=pap;charset=utf8','root','');
$pdo -> setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
return $pdo;
}
public static function query($query,$params=array())
{
$statement = self::connect() ->prepare($query);
$statement ->execute($params);
$data = $statement -> fetchALL();
return $data;
}
}
class DB_update{
private static function connect()
{
$pdo = new PDO('mysql:host=127.0.0.1;dbname=pap;charset=utf8','root','');
$pdo -> setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
return $pdo;
}
public static function query_update($query_update,$params=array())
{
$statement = self::connect() ->prepare($query_update);
$statement ->execute($params);
$data = $statement -> RowCount();
return $data;
}
}
?>
ps:db_update::query_update并不意味着这只是更新查询。 我只是这么命名的
在logout.php中的这一行,您似乎正在将isLoggedIn作为参数传递给数据库,而不是userid:
DB_update::query_update('DELETE FROM tokens WHERE user_id=:userid',array(':userid'=>Login::isLoggedIn()));