默认情况下全站共用一个 PHPSESSID,前台用户和后台管理员写在同一个会话数组里,很容易出现越权隐患。

做法:切换会话名

function np_session_start($name) {
    if (session_status() === PHP_SESSION_ACTIVE) {
        if (session_name() === $name) return;
        session_write_close();
    }
    session_name($name); // NPUSER / NPADMIN
    session_start();
}

前台页面调用 np_user_session(),后台页面调用 np_admin_session(),两边的 $_SESSION 互不可见。

再加两点

  1. 登录成功后 session_regenerate_id(true),防会话固定。
  2. Cookie 打开 httponly,JS 拿不到会话 ID。

前台登录态里只存邮箱和登录时间,没有任何多余信息,即使会话被拖走也拿不到隐私数据。