Как безопасно продолжить сеанс из Nextcloud на внешней странице PHP - PullRequest
0 голосов
/ 07 октября 2019

Я создаю небольшое приложение для Nextcloud (16). Я должен выполнить некоторый код во внешнем файле PHP, а не в приложении Nextcloud. Эта страница должна быть защищена от несанкционированного доступа. Я хочу добиться этого с помощью существующего файла cookie сеанса Nextcloud.

В настоящее время я читаю файл cookie nc_session_id из браузера пользователя и проверяю, существует ли этот сеанс в пути сеанса PHP. Это должно быть безопасно, поскольку злоумышленник обычно не может угадать идентификатор.

Вот так выглядит сессия Nextcloud в браузере:

Файлы cookie Nextcloud

Я пытался проверить cookie с помощью session_status('nc_session_id') != PHP_SESSION_NONE, но это всегда возвращает int (1) -> сеанс не существует, потому что перед этим мне нужно будет запустить session_start (). НО в этом особом случае внешняя страница никогда не должна начинать сам новый сеанс - она ​​должна только проверять, существует ли действительный сеанс Nextcloud.

Мой текущий код, кажется, выполняет эту работу:

session_name('nc_session_id');
$sessid_cook = filter_input(INPUT_COOKIE, "nc_session_id", FILTER_SANITIZE_STRING);
$sess_path = session_save_path().'/sess_'.$sessid_cook;

if(isset($_COOKIE['nc_session_id']) &&
    isset($_COOKIE['nc_username']) && 
    file_exists($sess_path)) {
    echo "Session okay";
    session_start();
} else {
    echo "Access denied";
    exit;
}

// my protected logic here

Если я манипулирую файлом cookie сеанса в моем браузере, код PHP на сервере не может найти файл сеанса для этого файла cookie. Таким образом, доступ запрещен.

Это работает в моей текущей настройке, но что произойдет, если сеансы обрабатываются Redis или Memcache? Файлы cookie не могут быть проверены локально.

Есть ли лучший способ «проверить» файлы cookie сеанса перед началом сеанса PHP?

Мое решение безопасно или в нем есть недостатки?

...