Root Only

подайте на пропитание, бывшему админу бывшего локалхоста

Menu
  • Администрирование
  • Программирование
  • Монетизация
  • Продвижение
  • Хлам
Menu

Модификация данных клиентских сессий

Иногда бывает необходимо сделать изменения в клиентской сессии так сказать «на лету». Например, мы храним в сессии пользователя его уровень доступа, и решаем повысить или понизить его. Как здесь быть? Конечно можно внести необходимые изменения в базу, и разлогинить пользователя, тем самым заставив его перечитать обновленные данные из базы. Но этот вариант имеет огромный недостаток — пользователю придется произвести вход, с вводом логина и пароля (либо в случае с авторизацией через соцсети (oAuth) переполучением токена, что тоже не очень удобно, и не располагает к нам клиента:)).
Представленный вашему вниманию класс php написан с целью расширения базового функционала php-сессий.
С его помощью мы можем работать с пользовательскими данными, скрытыми в сессии, зная лишь его session_id (заботливо сохраненном при авторизации (например в базе mysql)).
Класс имеет 3 паблик метода , set, get и del. Вот небольшой пример, иллюстрирующий его работу:

$session_data=sessions::get($id);
$session_data['client']['level']='admin';
sessions::set($id,$session_data);
где $id - идентификатор, полученный в результате выполнения функции session_id();

результат работы кода аналогичен выполнению
$_SESSION['client']['level']='admin';
в контексте клиента.

Ниже сам класс (код)

class sessions {

    public static function get($id) {
        $session_data = self::read($id);
        return self::unserialize($session_data);
    }

    public static function set($id, $session_data) {
        $session_data = self::serialize($session_data);
        return self::write($id, $session_data);
    }

    public static function del($id) {
        $file = session_save_path() . '/sess_' . $id;
        unlink($file);
    }

    private static function read($id) {
        $file = session_save_path() . '/sess_' . $id;
        if (file_exists($file))
            return file_get_contents($file);
    }

    private static function write($id, $session_data) {
        $file = session_save_path() . '/sess_' . $id;
        if (file_exists($file))
            return file_put_contents($file, $session_data);
    }

    private static function serialize($session_data) {
        $method = "serialize_" . ini_get("session.serialize_handler");
        return self::$method($session_data);
    }

    private static function unserialize($session_data) {
        $method = "unserialize_" . ini_get("session.serialize_handler");
        return self::$method($session_data);
    }

    private static function serialize_php($session_data) {
        $out = '';
        foreach ($session_data as $name => $value)
            $out.=$name . '|' . serialize($value);
//        $out = 's:' . strlen($out) . ':"' . $out . '";';
        return $out;
    }

    private static function unserialize_php($session_data) {
        $return_data = array();
        $offset = 0;
        while ($offset < strlen($session_data)) {
            if (!strstr(substr($session_data, $offset), "|")) {
                throw new Exception("invalid data, remaining: " . substr($session_data, $offset));
            }
            $pos = strpos($session_data, "|", $offset);
            $num = $pos - $offset;
            $varname = substr($session_data, $offset, $num);
            $offset += $num + 1;
            $data = unserialize(substr($session_data, $offset));
            $return_data[$varname] = $data;
            $offset += strlen(serialize($data));
        }
        return $return_data;
    }

    private static function serialize_php_binary($session_data) {
        throw new Exception("The php_binary serializer supported in future :)");
    }

    private static function unserialize_php_binary($session_data) {
        $return_data = array();
        $offset = 0;
        while ($offset < strlen($session_data)) {
            $num = ord($session_data[$offset]);
            $offset += 1;
            $varname = substr($session_data, $offset, $num);
            $offset += $num;
            $data = unserialize(substr($session_data, $offset));
            $return_data[$varname] = $data;
            $offset += strlen(serialize($data));
        }
        return $return_data;
    }

}

Пользуйтесь на здоровье.

ps: меня не хватило на реализацию метода serialize_phpbinary , и наверно поэтому он появится в следующих версиях этого класса , но если кто-то меня опередит — милости просим в коменты/email

Поиск

Метки

archlinux awk bash binlog cache console css debian docker ffmpeg filemanager hash healthcheck ipcam java jquery jscript loginza mail md5 mysql mysqldump netbeans nginx php PHP-функция на JScript python qemu quote redirect replication RSS session sniffer socat systemd tinymce unix-socket usb vim windows 7 youtube авторизация продвижение социальные сети

Безопасность

© 2023 Root Only