#php #r #security #cookies #shiny
#php #r #Безопасность #файлы cookie #блестящий
Вопрос:
Это широкий вопрос, и я провел массу исследований по этому вопросу за последние несколько недель. Однако я не нашел хорошего безопасного решения для этого. Я работаю над сайтом, который использует WordPress / PHP, но имеет приложение R Shiny, которое используется в том же домене. Это сайт членства, и приложение R Shiny должно иметь возможность определять, должен ли пользователь, вошедший в систему (через WordPress), иметь доступ к приложению. Я предполагаю, что это обычная задача для других языков, но R Shiny довольно ограничен с точки зрения его возможностей веб-разработки. Единственный способ, который я действительно нашел, чтобы определить, следует ли предоставлять доступ, — это файлы cookie. Однако было сложно найти подход к шифрованию или типу безопасности, который будет работать как между PHP, так и R.
Моя текущая мысль заключается в том, что когда setcookie
функция запускается при входе в систему / инициализации, на сервер может быть передан отдельный ключ, который затем будет загружен и аутентифицирован в приложении R Shiny (на стороне сервера) в дополнение к проверке соответствующего файла cookie. Однако у меня гораздо больше опыта работы с R, чем с PHP, поэтому я не уверен, сработает ли это (тем более, что этот «ключ» нужно будет удалить при выходе из системы). Кто-нибудь знает, есть ли рекомендуемый или «лучший» способ аутентификации такого доступа между двумя языками / программами? В частности, ограниченные возможности re: R. Или, может быть, есть ресурсы, которые я могу исследовать? Я уже потратил много времени на работу с libsodium и openssl, которые оба имеют (ограниченные) функции в R, но не повезло с таким подходом к аутентификации сервера.
Любая помощь или идеи будут высоко оценены! Спасибо
Ответ №1:
Со стороны сервера вы можете получить доступ к session$request
объекту.
Этот объект будет содержать полный http-запрос, включая заголовки (примечание: поскольку он задается с помощью HTTP GET-запроса, вы можете использовать httpOnly
).
Там много всего:
names(session$request)
[1] "SERVER_NAME" "SERVER_PORT" "rook.url_scheme" "REQUEST_METHOD" "rook.version"
[6] "rook.errors" "HTTP_SEC_WEBSOCKET_EXTENSIONS" "HTTP_USER_AGENT" "HTTP_SEC_WEBSOCKET_VERSION" "HTTP_CONNECTION"
[11] "SCRIPT_NAME" "HTTP_ORIGIN" "HTTP_ACCEPT_LANGUAGE" "rook.input" "REMOTE_PORT"
[16] "HTTP_COOKIE" "HTTP_ACCEPT_ENCODING" "HTTP_SEC_WEBSOCKET_KEY" "HTTP_UPGRADE" "httpuv.version"
[21] "HTTP_HOST" "HEADERS" "PATH_INFO" "QUERY_STRING" "REMOTE_ADDR"
[26] "HTTP_CACHE_CONTROL" "HTTP_PRAGMA"
Что вас интересует, так это
> session$request$HTTP_COOKIE
[1] "plop=this"
На случай, если вам это нужно, я написал небольшую функцию для анализа строк cookie здесь.
Итак, идея заключалась бы в том, чтобы перенаправить с помощью PHP волю Set-cookie
в заголовке, затем внутри {shiny}
сеанса проанализировать строку cookie, а затем проверить, что этот cookie действителен.
Если вы используете JWT, вы можете взглянуть на https://cran.r-project.org/web/packages/jose/vignettes/jwt.html
Ps: До сих пор я делал это с помощью NodeJS, поэтому я не совсем уверен, как это работает с PHP.
Комментарии:
1. Спасибо за ответ. Я рассмотрю это позже сегодня вечером. Я немного прочитал о сеансах за последние несколько недель. Итак, в этом случае пользователю придется входить в систему каждый раз, когда он посещает сайт, чтобы информация сохранялась и идентифицировалась для целей доступа? Насколько я понимаю, информация о сеансе очищается при закрытии сеанса. Это правильно?
2.
session
Объект является новым каждый раз, когда вы подключаетесь к блестящему приложению. Но это верно для любого другого разработчика приложений: всякий раз, когда вы подключаетесь, например, к приложению NodeJS, поскольку связь не имеет состояния, у вас нет идентификатора сеанса со стороны сервера. Вот почему вам нужна форма cookie: cookie хранится в браузере, поэтому сеанс R не имеет к нему никакого отношения, но может использовать его для повторной идентификации пользователя, если это необходимо.3. В этом случае я в основном пытаюсь гарантировать, что 1.) кто-то не мог просто создать или скопировать существующий cookie, чтобы обойти ограничения доступа, и 2.) им не нужно входить в систему каждый раз, когда они посещают сайт. Может быть, я думаю об этом неправильно, но будет ли этот сеансовый подход достичь этого?