Я создаю небольшое приложение для Nextcloud (16). Мне нужно выполнить некоторый код во внешнем файле PHP, а не в приложении Nextcloud. Эта страница должна быть защищена от несанкционированного доступа. Я хочу добиться этого с помощью существующего файла cookie сеанса Nextcloud.
В настоящее время я читаю файл cookie nc_session_id
из браузера пользователя и проверяю, существует ли этот сеанс в пути сеанса PHP. Это должно быть безопасно, потому что злоумышленник обычно не может угадать идентификатор.
Вот как выглядит сессия 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
Если я манипулирую куки-файлом сеанса в своем браузере, код PHP на сервере не может найти файл сеанса для этого манипулируемого куки-файла. Таким образом, доступ запрещен.
Это работает в моей текущей настройке, но что произойдет, если сеансы обрабатываются Redis или Memcache? Файлы cookie не могут быть проверены локально.
Есть ли лучший способ «проверить» файлы cookie сеанса перед запуском сеанса PHP?
Безопасно ли мое решение или в нем есть недостатки?