Session
Contents |
Обзор
Модуль Session обеспечивает функцию отслеживания HTTP-запросов.
Другие модули безопасности, такие как Cookie Poisoning, обрабатывают запросы с использованием этого модуля.
Модуль Session записывает информацию о сессии, устанавливая cookie в клиентском браузере.
Директивы
session
Синтаксис | session on | off; |
По умолчанию | off |
Контекст | Server |
Включить или выключить модуль Session. При включении Session также должно быть задано значение session_max_size.
Пример:
session on;
session_timeout
Синтаксис | session_timeout timeout; |
По умолчанию | 60 |
Контекст | Server |
Устанавливает таймаут сессии в секундах.
Пример:
session_timeout 600;
session_max_size
Синтаксис | session_max_size number; |
По умолчанию | |
Контекст | http |
Устанавливает максимальное количество сессий.
Пример:
session_max_size 10000;
session_cookie_name
Синтаксис | session_cookie_name name; |
По умолчанию | SENGINX-SESSION-ID |
Контекст | http/Server/Location |
Устанавливает имя сессионного cookie.
Пример:
session_cookie_name session-id;
session_redirect_timeout
Синтаксис | session_redirect_timeout timeout; |
По умолчанию | 5 |
Контекст | http/Server/Location |
Устанавливает время ожидания в секундах, после которого SEnginx отправляет клиенту ответ с редиректом. Этот таймаут должен быть больше, чем значение session_timeout.
Пример:
session_redirect_timeout 700;
session_show
Синтаксис | session_show on | off; |
По умолчанию | off |
Контекст | Location |
Показывать в этом location информацию о всех сессиях SEnginx. Для того, чтобы использовать эту директиву, необходимо включить session в блоке server, в который входит данный location.
Вы можете открыть этот location в браузере, чтобы просмотреть информацию о сессиях.
Пример:
location /show_session { session_show on; }
Использование Session API для разработки модулей
Модуль Session предоставляет набор функций, которые используются другими модулями. Фактически модуль Session это место, в котором другие модули могут хранить сессионные данные во время своей работы. Основные функции API:
void * ngx_http_session_shm_alloc(size_t size); void ngx_http_session_shm_free(void *); void * ngx_http_session_shm_alloc_nolock(size_t size); void ngx_http_session_shm_free_nolock(void *); ngx_http_session_ctx_t * ngx_http_session_create_ctx(ngx_http_session_t *session, u_char *name, ngx_int_t (*init)(void *ctx), void (*destroy)(void *data)); ngx_http_session_ctx_t * ngx_http_session_find_ctx(ngx_http_session_t *session, u_char *name); void ngx_http_session_destroy_ctx(ngx_http_session_t *session, u_char *name); ngx_http_session_t * ngx_http_session_get(ngx_http_request_t *r); void ngx_http_session_put(ngx_http_request_t *r); ngx_int_t ngx_http_session_is_enabled(ngx_http_request_t *r); void ngx_http_session_register_create_ctx_handler(ngx_http_session_create_ctx_t handler);
Далее показано как использовать эти функции:
Регистрация create-ctx callback функции
Сначала нужно зарегистрировать callback-функцию, которая будет вызываться при создании сессии. Эта функция должна создавать session ctx для вашего модуля.
Например, в модуле Cookie Poisoning мы регистрируем callback-функцию следующим образом:
static ngx_int_t ngx_http_cp_filter_init(ngx_conf_t *cf) { ngx_int_t ret; ret = ngx_http_neteye_security_header_register( NGX_HTTP_NETEYE_COOKIE_POISONING, ngx_http_cp_header_handler); if (ret == NGX_ERROR) { return NGX_ERROR; } ngx_http_session_register_create_ctx_handler( ngx_http_cp_create_session_ctx); return ngx_http_neteye_security_request_register( NGX_HTTP_NETEYE_COOKIE_POISONING, ngx_http_cp_handler); }
Реализация "ngx_http_cp_create_session_ctx" может выглядеть так:
static void ngx_http_cp_create_session_ctx(ngx_http_session_t *session) { ngx_http_session_ctx_t *session_ctx; ngx_http_cp_session_ctx_t *cp_ctx; session_ctx = ngx_http_session_create_ctx(session, (u_char *)"cookie_poisoning", ngx_http_cp_init_session_ctx_handler, ngx_http_cp_destroy_session_ctx_handler); if (!session_ctx) { return; } /* init cp_ctx */ cp_ctx = session_ctx->data; cp_ctx->bl_times = 0; ngx_http_cp_hash_init(&cp_ctx->monitored_cookies, NGX_HTTP_CP_DEFAULT_BUCKETS_NUM); }
Вы должны обеспечить 2 callback-обработчика для функции ngx_http_session_create_ctx - для инициализации и удаления соответственно.
Хранение данных в сессии
1. Получить сессию:
session = ngx_http_session_get(r);
2. Заблокирвать сессию до выполнения каких-то действий:
ngx_shmtx_lock(&session->mutex);
3. Получить из сессии структуру ctx, в которой хранятся данные:
session_ctx = ngx_http_session_find_ctx(session, action->session_name);
- Структура ctx создается модулем, основанным на использовании сессии. Уникальный идентификатор структуры ctx это имя ctx.
4. Если в сессии нет ни одной структуры ctx, нужно ее создать:
session_ctx = ngx_http_session_create_ctx(session, action->session_name, action->init, action->destroy);
- Функция ngx_http_session_create_ctx принимает указатели на две функции, которые используются соответственно для создания и удаления структуры ctx.
5. Использовать структуру ctx в модуле.
6. По окончании использования структуры ctx нужно разблокировать сессию и уменьшить счетчик ссылок:
ngx_shmtx_unlock(&session->mutex); ngx_http_session_put(r);
Функции init и destroy в ngx_http_session_create_ctx
Функции init и destroy из модуля Robot Mitigation:
static void ngx_http_rm_destroy_ctx_handler(void *ctx) { ngx_http_session_ctx_t *session_ctx; session_ctx = (ngx_http_session_ctx_t *)ctx; return ngx_http_session_shm_free_nolock(session_ctx->data); } static ngx_int_t ngx_http_rm_init_ctx_handler(void *ctx) { ngx_http_session_ctx_t *session_ctx; session_ctx = (ngx_http_session_ctx_t *)ctx; /* initial session ctx */ session_ctx->data = ngx_http_session_shm_alloc_nolock(sizeof(ngx_http_rm_session_ctx_t)); if (!session_ctx->data) { fprintf(stderr, "create ac ctx error\n"); return NGX_ERROR; } memset(session_ctx->data, 0, sizeof(ngx_http_rm_session_ctx_t)); return NGX_OK; }
Память выделяется в зоне разделямой памяти, поэтому нужно использовать функции ngx_http_session_shm_alloc/free.