当前位置: 首页 > 知识库问答 >
问题:

管理员如何在登录时增加当前会话?

龙繁
2023-03-14

使用adminer-4.7。7插件登录密码少。php我找到了一种方法,可以在不输入凭据的情况下输入adminer。但进入adminer后,我希望尽可能保持当前会话(包括打开当前数据库和表),即使在第二天关闭/打开浏览之后。。。是否有管理员会话时间参数/工具?这是我的家用笔记本电脑(kununtu18,Apache2,PHP7.4),所以安全漏洞被忽略。。。apache配置决策也是可能的。

我怎么做?

修改:我试图增加Jasar Orion代码中的gc_maxlifetime,但失败了

我在adminer/include/bootstrap中修改了会话块。inc.php作为:

global $adminer, $connection, $driver, $drivers, $edit_functions, $enum_length, $error, $functions, $grouping, $HTTPS, $inout, $jush, $LANG, $langs, $on_actions, $permanent, $structured_types, $has_token, $token, $translations, $types, $unsigned, $VERSION; // allows including Adminer inside a function

if (!$_SERVER["REQUEST_URI"]) { // IIS 5 compatibility
   $_SERVER["REQUEST_URI"] = $_SERVER["ORIG_PATH_INFO"];
}
if (!strpos($_SERVER["REQUEST_URI"], '?') && $_SERVER["QUERY_STRING"] != "") { // IIS 7 compatibility
   $_SERVER["REQUEST_URI"] .= "?$_SERVER[QUERY_STRING]";
}
if ($_SERVER["HTTP_X_FORWARDED_PREFIX"]) {
   $_SERVER["REQUEST_URI"] = $_SERVER["HTTP_X_FORWARDED_PREFIX"] . $_SERVER["REQUEST_URI"];
}
$HTTPS = ($_SERVER["HTTPS"] && strcasecmp($_SERVER["HTTPS"], "off")) || ini_bool("session.cookie_secure"); // session.cookie_secure could be set on HTTP if we are behind a reverse proxy

@ini_set("session.use_trans_sid", false); // protect links in export, @ - may be disabled
if (!defined("SID")) {
   session_cache_limiter(""); // to allow restarting session
   session_name("adminer_sid"); // use specific session name to get own namespace
// $params = array(0, preg_replace('~\?.*~', '', $_SERVER["REQUEST_URI"]), "", $HTTPS);
   if (version_compare(PHP_VERSION, '5.2.0') >= 0) {
      $params[] = true; // HttpOnly
   }
    $lifetime = time() + 97 * 24 * 60 * 60;
    $params = array($lifetime, preg_replace('~\?.*~', '', $_SERVER["REQUEST_URI"]), "", $HTTPS);

    ini_set('session.gc_maxlifetime', 99600);
   call_user_func_array('session_set_cookie_params', $params); // ini_set() may be disabled

    session_set_cookie_params(99600);

    session_start();
}

它是无效的方式?哪种方式有效?

谢谢

共有3个答案

魏彦
2023-03-14

如果您想要严格的保证,会话超时是一个必须在代码中实现的概念;这是您可以绝对确定没有会话在不活动的X分钟后存活的唯一方法。

如果稍微放松一下这个要求是可以接受的,并且您可以放置一个下限而不是对持续时间的严格限制,那么您可以很容易地做到这一点,并且无需编写自定义逻辑。

如果您的会话是用cookie实现的(它们可能是),并且客户端不是恶意的,那么您可以通过调整某些参数来设置会话持续时间的上限。如果您使用PHP的默认会话处理cookie,请设置session。gc_maxlifetime以及session_set_cookie_params应该像这样为您工作:

// server should keep session data for AT LEAST 1 hour
ini_set('session.gc_maxlifetime', 3600);

// each client should remember their session id for EXACTLY 1 hour
session_set_cookie_params(3600);

session_start(); // ready to go!

这是通过配置服务器将会话数据保持在至少一个小时的不活动状态,并指示您的客户端在相同的时间跨度后应该“忘记”他们的会话标识来实现的。这两个步骤都是实现预期结果所必需的。

>

  • 如果您不告诉客户端在一小时后忘记其会话id(或者如果客户端是恶意的,并且选择忽略您的指示),他们将继续使用相同的会话id,其有效持续时间将是不确定的。这是因为在服务器端其生存期已过期的会话不会立即被垃圾收集,而只有在会话GC启动时才会被垃圾收集。

    GC是一个潜在的昂贵过程,因此通常概率很小,甚至为零(一个获得大量点击的网站可能会完全放弃概率GC,并计划每X分钟在后台进行一次)。在这两种情况下(假设不合作的客户端),有效会话生存时间的下限将是session。gc_maxlifetime,但上限将是不可预测的。

    如果未设置会话。gc_maxlifest到相同的时间跨度,那么服务器可能会在该时间跨度之前丢弃空闲会话数据;在这种情况下,仍然记得会话id的客户机将显示会话id,但服务器将找不到与该会话相关的数据,有效地表现为会话刚刚启动。

    您可以通过使用自定义逻辑来设置会话不活动的上限,从而使事情完全可控;加上上面的下限,这将导致严格的设置。

    通过将上限与其余会话数据一起保存来执行此操作:

    session_start(); // ready to go!
    
    $now = time();
    if (isset($_SESSION['discard_after']) && $now > $_SESSION['discard_after']) {
        // this session has worn out its welcome; kill it and start a brand new one
        session_unset();
        session_destroy();
        session_start();
    }
    
    // either new or old, it should live at most for another hour
    $_SESSION['discard_after'] = $now + 3600;
    

    到目前为止,我们根本不关心每个会话id的确切值,只关心数据应该存在多久就存在多久的要求。请注意,在会话id对您很重要的情况下(不太可能),必须注意在需要时使用session\u regenate\u id重新生成会话id。

  • 施锋
    2023-03-14

    这可能是许可的问题,

    您能否在phpinfo()中检查会话.保存路径“的值,如果您在本地主机上工作,这通常是C:\xampp\tmp

    如果你在ubuntu上工作,会话文件夹应该是/var/lib/php/session,如果文件夹会话不存在,你应该导航到/var/lib/php/并创建文件夹:

    mkdir session
    

    然后需要将权限扩展到用户www-data,使用:

    sudo chown -R www-data:www-data /var/lib/php/session
    

    祝你好运

    邵绪
    2023-03-14

    如果打开文件adminer/adminer/include/bootstrap。inc.php:57您可以看到以下代码:

    call_user_func_array('session_set_cookie_params', $params); // ini_set() may be disabled
    

    根据文档,此方法设置会话生存期。默认情况下,它设置为0,这意味着当浏览器关闭时,会话将被销毁。我想,您可以设置另一个想要的值:

    $lifetime = time() + 7 * 24 * 60 * 60;    
    $params = array($lifetime, preg_replace('~\?.*~', '', $_SERVER["REQUEST_URI"]), "", $HTTPS);
    
     类似资料:
    • X1.4.0新增 sp_get_current_admin_id() 功能: 获取当前登录管理员id,同get_current_admin_id() 参数: 无 返回: 类型int,管理员的id

    • cmf_get_current_admin_id() 功能 获取当前登录的管理员ID 参数 无 返回 int 当前登录的管理员ID

    • cmf_get_current_admin_id() 功能 获取当前登录的管理员ID 参数 无 返回 int 当前登录的管理员ID

    • 问题内容: 有谁知道在詹金斯注销用户之前如何增加超时窗口?我希望将其提高到1天左右。 我整天都在詹金斯工作,我们在两次工作之间一直注销。令人沮丧的是,“保持登录状态”复选框似乎也不起作用。 问题答案: Jenkins使用Jetty,Jetty的默认超时为30分钟。这与身份验证设置无关-我使用的是Active Directory,但仍然是影响超时的设置。 您可以通过将参数传递给Jenkins初始化脚

    • 我正在运行Nginx,它被配置为允许我访问另一台服务器上的几个资源,该服务器可用作反向代理。举个例子 到目前为止一切正常。我在Adminer中输入我的DB用户名和密码,问题就开始了。通过检查管理员登录后返回的标题,我注意到它返回了一个 标题。这就是麻烦的根源。在我的浏览器上,这自然会被解释为相对于当前服务器而不是反向代理的含义。我试图破解管理员代码后,找到了一个地方,它有一个位置头,但这只是阻止了

    • 一、简介 管理站点用户。 二、功能演示 1,添加用户 2,管理用户 您可以添加,查询和删除用户。如下图所示: