我有一个非常基本的php会话登录脚本。我想强制注销某个用户或强制注销所有用户。
如何阅读我网站上的所有会话,并销毁部分或全部会话?
答案 0 :(得分:14)
您可以尝试通过执行
强制PHP删除所有会话ini_set('session.gc_max_lifetime', 0);
ini_set('session.gc_probability', 1);
ini_set('session.gc_divisor', 1);
这迫使PHP将所有会话视为具有0秒的生命周期,并且100%的概率被清理。
缺点是,当PHP执行清理时,无论哪个不幸的用户首先运行此操作都会得到一个长时间的暂停,特别是如果有很多会话文件需要通过。
对于一个特定用户,您必须向会话处理程序添加一些代码:
if ($_SESSION['username'] == 'user to delete') {
session_destroy();
}
PHP的垃圾收集器不可控,因此您无法为其提供诸如“删除除用户X之外的所有会话”之类的参数。它严格查看会话文件上最后修改/最后访问的时间戳,并将其与max_lifetime设置进行比较。它实际上并不处理会话数据。
答案 1 :(得分:6)
此代码基于official PHP site,另一个写得很好snippet on SO。
<?php
// Finds all server sessions
session_start();
// Stores in Array
$_SESSION = array();
// Swipe via memory
if (ini_get("session.use_cookies")) {
// Prepare and swipe cookies
$params = session_get_cookie_params();
// clear cookies and sessions
setcookie(session_name(), '', time() - 42000,
$params["path"], $params["domain"],
$params["secure"], $params["httponly"]
);
}
// Just in case.. swipe these values too
ini_set('session.gc_max_lifetime', 0);
ini_set('session.gc_probability', 1);
ini_set('session.gc_divisor', 1);
// Completely destroy our server sessions..
session_destroy();
?>
运作良好。像NGinx这样的服务器你可以关闭,清理缓存,刷卡内存重置,清除日志等,并通常删除临时使用。甚至放弃了记忆的极限。
答案 2 :(得分:5)
您可以使用session_save_path()
查找PHP保存会话文件的路径,然后使用unlink()
删除它们。
答案 3 :(得分:3)
这取决于您的会话存储空间。
如果您正在使用PHP会话存储,那么它们可能位于服务器的临时目录中。删除所选文件将“终止”会话。
更好的解决方案是使用数据库会话存储并从那里删除选定的会话。您可以查看包含多个HTTP_Session2
的containers。
答案 4 :(得分:2)
我将创建一个包含令牌的txt
文件,该令牌与生成的登录会话具有相同的值,作为每次用户登录时的比较:
if($_SERVER['REQUEST_METHOD'] == 'POST') {
$token = sha1(uniqid(mt_rand(), true));
if($everything_is_valid) {
// Set login session
$_SESSION[$_POST['username']] = $token;
// Create token file
file_put_contents('log/token.' . $_POST['username'] . '.txt', $token);
// Just to be safe
chmod('log/token.' . $_POST['username'] . '.txt', 0600);
}
}
检查登录用户:
if(isset($_SESSION['charlie']) && file_exists('log/token.charlie.txt') && $_SESSION['charlie'] == file_get_contents('log/token.charlie.txt')) {
echo 'You are logged in.';
}
因此,如果要强制注销此charlie
用户,只需删除令牌文件:
// Force logout the `charlie` user
unlink('log/token.charlie.txt');
答案 5 :(得分:2)
立即清除所有会话需要首先了解哪个session.save_handler
用于存储会话并找到session.save_path
以删除所有会话。要仅删除当前会话,请参阅the documentation for session_destroy()
。
以下是使用标准文件和memcached存储处理程序删除所有会话的一些常见示例:
foreach(glob(ini_get("session.save_path") . "/*") as $sessionFile) {
unlink($sessionFile);
}
$memcached = new Memcached;
$memcached->addServers($listOfYourMemcachedSesssionServers);
// Memcached session keys are prefixed with "memc.sess.key." by default
$sessionKeys = preg_grep("@^memc\.sess\.key\.@", $memcached->getAllKeys());
$memcached->deleteMulti($sessionKeys);
当然,您可能只想考虑从正常的HTTP客户端请求中带外执行此操作,因为清理大型会话存储可能需要一些时间,并且在正常的请求生命周期中会产生无意的副作用。
答案 6 :(得分:2)
我发现这段代码非常有用,而且它真的对我有用
@login_required
def login_redirect(request):
return redirect('profile:profile_view', username=request.user.username)
答案 7 :(得分:0)
陶菲克的答案是我能找到的最好的答案
但是,您可以进一步修改它
在验证用户身份并创建会话变量后,添加以下行:
$token = "/sess_" . session_id();
file_put_contents('log/' . $_SESSION['id'] . '.txt', $token);
如果您需要强制用户在cronjob期间或通过管理员请求注销:
$path = session_save_path();
$file = file_get_contents('log/xxx.txt'); // xxx is user's id
$url = $path.$file;
unlink($url);
答案 8 :(得分:0)
删除所有会话变量
This can be helpful: https://github.com/react-native-image-picker/react-native-image-picker/issues/1259
In manifest
android:requestLegacyExternalStorage="true"
<application
android:name=".MainApplication"
android:label="@string/app_name"
android:icon="@mipmap/ic_launcher"
android:allowBackup="true"
android:theme="@style/AppTheme"
android:requestLegacyExternalStorage="true"
android:usesCleartextTraffic="true">
build.gradle
// camera
compileSdkVersion = 29
破坏会话
session_unset();