原始问题:
我读到使用$ _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/