Почему не стоит использовать $ _SESSION в Restful реализациях? - PullRequest
2 голосов
/ 09 марта 2010

Оригинальный вопрос:

Я читал это для веб-сайтов RESTful. это не хорошо использовать $ _SESSION. Почему это не хорошо? как тогда правильно аутентифицировать пользователей, не просматривая базу данных все время для проверки ролей пользователя?


Я читал, что использовать $ _SESSION нехорошо.

http://www.recessframework.org/page/towards-restful-php-5-basic-tips

Я создаю ВЕБ-САЙТ, а не веб-сервис на PHP. и я пытаюсь сделать его более интересным. по крайней мере, в духе.

прямо сейчас я переписываю все действие, чтобы использовать теги Form POST, и добавляю скрытое значение с именем _method, которое будет "delete" для удаления действия и "put" для обновления действия.

однако, я не уверен, почему рекомендуется НЕ использовать $ _SESSION. Я хотел бы знать, почему и что я могу сделать, чтобы улучшить.

Чтобы разрешить легкую проверку авторизации, то, что я сделал после входа в систему, имя пользователя хранится в $ _SESSION.

Каждый раз, когда пользователь переходит на страницу, страница проверяет, хранится ли имя пользователя внутри $ _SESSION, а затем на основе $ _SESSION получает всю информацию, включая привилегии, из базы данных, а затем оценивает авторизацию для доступа к странице на основе информация получена.

Способ реализации плохой? не RESTful? как улучшить производительность и безопасность?

Спасибо.

Ответы [ 3 ]

8 голосов
/ 09 марта 2010

Как написано в статье, это "правило" является полной ерундой . Автор чертовски $_SESSION, но все в порядке с cookie-файлами, хранящими аутентификационную информацию. Он продолжает говорить:

В случае, если вам нужно больше, чем просто файл cookie, запаситесь данными для хранения их в центральной базе данных с аутентификацией, которая все еще находится в файле cookie.

В чем разница между хранением данных в сеансе с токеном в cookie и хранением данных в базе данных с аутентификацией в cookie? Нет никакой разницы, кроме того, что при использовании токена вы не передаете данные аутентификации, возможно, в открытом виде, при каждом запросе.

Нет разницы между передачей дополнительной информации с каждым запросом и передачей токена, который представляет дополнительные данные, но должен быть разрешен через сеанс на сервере. Это просто вопрос безопасности и практичности.

Часто аргументом является то, что сервер должен быть "не сохраняющим состояние". Так как RESTfulness относится к протоколу HTTP, «отсутствие состояния» не означает «сервер не хранит любое состояние». Отсутствие состояния с точки зрения протокола означает, что я могу делать любое количество запросов в произвольном порядке, и я получаю один и тот же ресурс для того же запроса.

GET  /index.html
POST /someaction
GET  /index.html  -> should return the same *resource* as before

Сравните это с реальным протоколом сохранения состояния, таким как FTP:

LS       -> gets list of files in current directory
CD /dir  -> changes directory, i.e. changes state
LS       -> same command gets list of files for a different directory

Это реальная разница между протоколом RESTful и протоколом сохранения состояния. Хранит ли сервер какие-либо данные, относящиеся к пользователю, или нет, это полностью деталь реализации сервера и не имеет ничего общего с RESTfulness. Если сервер возвращает тот же ресурс, что и ответ на точно такой же запрос, независимо от того, какие другие типы запросов были сделаны между ними, он остается без состояния и, следовательно, RESTful.

Это не имеет ничего общего с аутентификацией или хранением дополнительных данных, а также не исключает возможности истечения срока действия запросов или URL-адресов.

Если срок действия URL / запросов do истекает, есть специальный способ справиться с этим с помощью HTTP: отвечать соответствующими кодами состояния. Если пользователь отправляет запрос с просроченным токеном / логином, сервер не должен ответить с экраном входа по запрошенному URL . Это нарушило бы RESTfulness.

не RESTful:

GET /restricted/page

200 OK

Please log in here:
Name: _____
Password: _____

----------------------

POST /restricted/page
[name, password]

200 OK

Content of restricted page.

----------------------

GET /restricted/page

200 OK

Content of restricted page.

RESTful:

GET /restricted/page

401 Unauthorized
* * Или тысяча сорок-девять
GET /restricted/page

307 Temporary Redirect
Location: /login

----------------------

GET /login

200 OK

----------------------

POST /login
[name, password]

307 Temporary Redirect
Location: /restricted/page

----------------------

GET /restricted/page

200 OK

Это не «заменяет» ресурс /restricted/page, как это сделал бы плохой пример, сохраняя сервер RESTful. надлежащим образом сигнализирует клиенту, что запрос действителен, только не прямо сейчас . Обратите внимание, что всегда используется термин resource , а не response . Сервер может нормально отвечать по-другому, но нельзя предлагать другой ресурс (content *) по тому же URL. Если бы это было так, клиент также должен был бы отслеживать текущее состояние сеанса (например, FTP), чтобы иметь возможность сказать, что происходит. Безгражданство - это гораздо больше о клиенте, не имеющем состояния, чем о сервере. Это не мешает серверу отслеживать, что делает клиент.


*) Обратите внимание, что content не эквивалентно resource . Можно изменить и обновить содержимое ресурса.

Также обратите внимание, что являются вескими причинами против использования $_SESSION, в особенности масштабируемость на нескольких серверах Сохранение сервера RESTful - это , а не действительная причина. Если вам нужно какое-либо состояние, например, срок действия логинов или корзина покупок, вам нужно где-то отслеживать эту информацию. Сеанс сервера является таким же допустимым местом, как и файл cookie, и во многих случаях является лучшим выбором. Будет ли этот сеанс реализован с использованием $_SESSION или базы данных, или пера, и бумаги - это детали реализации.

1 голос
/ 09 марта 2010

Та же самая ссылка, которую вы разместили, предлагает решение:

На практике это означает хранение информация об аутентификации в куки с отметкой времени и контрольной суммой.

Но лично я не согласен с тем, что контрольной суммы достаточно. Я предпочитаю, чтобы куки-файл аутентификации содержал временную метку, исходный IP-адрес для входа в систему (чтобы предотвратить захват куки-файлов) и был полностью зашифрован с помощью ключа сайта.

1 голос
/ 09 марта 2010

Сеансы, поскольку они обычно реализуются, не являются RESTful, поскольку они хранят только небольшой токен на стороне клиента, в то время как фактическое «состояние» клиента (зарегистрировано, содержимое корзины и т. Д.) Хранится на сервере. REST требует, чтобы сеть следовала своему первоначальному дизайну «безгражданства», что означает, что каждый запрос точно такой же, как и любой другой - серверу не нужно ничего отслеживать.

Если все данные хранятся в файле cookie - фактические данные, а не просто токен, - это может соответствовать REST. Я склонен к тому, чтобы сервер возвращал все состояния клиенту в виде блока зашифрованного текста, который расшифровывается сервером при следующем вызове, чтобы подтвердить, что пользователь вошел в систему, что находится в корзине и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...