原始问题:



我读到使用$ _SESSION不好。

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

我正在用PHP创建一个WEBSITE,而不是Web服务。并且我正在尝试使其更加RESTful。至少在精神上。

现在,我正在重写所有使用Form标记POST的操作,并添加一个名为_method的隐藏值,该值将“删除”以删除操作,而“put”则更新操作。

但是,我不确定为什么不建议使用$ _SESSION。我想知道为什么以及我可以做些什么来改善。

为了方便进行授权检查,我在登录用户后要做的是,用户名存储在$ _SESSION中。

每次用户导航到页面时,页面都会检查用户名是否存储在$ _SESSION中,然后基于$ _SESSION从数据库中检索所有信息(包括特权),然后根据检索到的信息评估访问页面的授权。

我实施的方式不好吗?不是RESTful的?我如何改善性能和安全性?

谢谢。

最佳答案

如文章所述,此“规则”是完全是废话。作者该死的是$_SESSION,但对于存储身份验证信息的cookie完全可以。他接着说:



在 session 中使用cookie中的 token 存储数据和在cookie中使用身份验证将数据存储在数据库中有什么区别?除了使用 token 之外,没有其他区别,您不会随每个请求传输明文身份验证数据。

在每个请求中发送附加信息与发送代表附加数据的 token 之间没有区别,但是需要通过服务器上的 session 来解决。这只是安全性和实用性问题。

争论经常是服务器应该是“无状态的”。由于RESTfulness属于HTTP协议(protocol),因此“无状态”并不表示“服务器不存储任何状态”。从协议(protocol)的角度来看,无状态意味着我可以以任意顺序发出任意数量的请求,并且我为同一请求获得相同的资源。

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

将其与真实的状态保持协议(protocol)(例如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协议(protocol)和状态保持协议(protocol)之间的真正区别。服务器是否存储与用户有关的任何数据完全是服务器的实现细节,与RESTfulness无关。如果服务器返回的资源与对完全相同的请求的响应相同,则无论之间是否进行了其他类型的请求,该服务器都是无状态的,因此是RESTful的。

这与身份验证或存储其他数据没有任何关系,也不排除请求或URL最终可能过期。

如果URL /请求确实过期,则有一种特殊的方式使用HTTP处理该请求:以适当的状态码进行响应。如果用户发送带有过期 token /登录名的请求,则服务器是而不是,应该在请求的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状态。它确实向客户端发出该请求有效的信号,只是现在还没有。请注意,始终使用术语资源而不是响应。服务器以不同的方式响应是可以的,但是在同一URL上提供不同的资源(内容*)是不可行的。如果是这种情况,客户端还需要跟踪 session 的当前状态(例如FTP),以便知道发生了什么。无状态性更多是关于客户端无服务器性。这并不妨碍服务器跟踪客户端的操作。

*)请注意,内容不等于资源。可以更改和更新资源的内容。

还要注意,有充分的理由反对使用$_SESSION,尤其是跨多个服务器的可伸缩性。保持服务器RESTful是而不是的有效原因。如果您需要某种状态,例如登录到期或购物篮到期,则需要在某处跟踪该信息。服务器 session 与cookie一样有效,并且在许多情况下是更好的选择。该 session 是使用$_SESSION还是数据库或笔和纸来实现的,都是实现的细节。

关于php - 为什么在Restful Implementations中使用$ _SESSION不好?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2406541/

10-13 06:33