Security PHP RESTful API


Security PHP RESTful API

我开始开发一个简单的PHP RESTful API。在阅读了一些教程之后,REST的一个特性是

"……无国籍状态是关键。从本质上讲,这意味着处理请求所需的状态包含在请求中本身,无论是作为URI、查询字符串参数、正文的一部分,还是标题"

因此,这意味着我的PHP服务器不需要$_SESSION?你推荐哪种方法?在URL中使用令牌(在短时间内有效)似乎不是有点不安全吗?例如www.myapi.com/1233asdd123/get_user/12。

非常感谢。

如果你是任何类型的web开发人员,你可能已经听过1000次这句话:"HTTP是一个无状态协议"。这意味着每个会话都使用服务器和客户端之间交换的令牌。

当您使用PHP的内置会话时,即使您没有意识到,服务器实际上也在这样做:它生成一个session_id并将其传递给客户端。客户端在cookie上正常返回session_id令牌;PHP允许在URL上也包含会话令牌,作为GET参数,但我个人建议禁用该功能(在PHP 5.3+上默认禁用)

在您的情况下,是的,您不会使用PHP的会话
您可以在数据库中创建一个表,存储所有会话令牌和关联的会话。

代币的使用寿命应该很短(例如,30分钟),并且应该经常刷新。刷新不仅对延长会话寿命很重要(每次刷新都会给你额外的30分钟左右),而且有助于防止会话密钥被盗。在我们创建的一些REST服务器中,会话令牌的有效期为30分钟,并且在会话启动10分钟后发出的第一个请求中,会向用户提供一个新令牌。当客户端收到新的令牌时,旧的令牌会立即失效。

您可以通过任何方式将令牌传递给服务器,但将其作为GET参数添加并不是一个理想的解决方案,原因有两个:1。GET参数通常写在服务器和2的访问日志中。用户经常复制/粘贴URL并共享它们,这可以公开他们的会话令牌
对于API服务器,最好的方法是将会话令牌包含在HTTP请求的其中一个头中。例如,您可以设置Authorization头:Authorization: SessionToken 123123123,其中123123123是您的令牌,SessionToken是一个字符串,用于告诉服务器使用您的授权方法(您可以自由选择自己的名称,只要它不是像Basic这样的默认方法之一;但要保持一致!)。

API服务器上的安全性通常通过使用SSL获得。基本上,如果您有API服务器,则必须使用HTTPS(SSL)对其进行保护
有一些方法也可以在不使用SSL的情况下实现安全性,但它们需要对每个请求进行签名,而且实现和使用起来非常复杂,而且它们增加的开销可能比使用SSL的开销更大。

一种非常常见的做法是在URL中使用一个键值:

www.myapi.com?key=1234

它并不比张贴字符串更安全。SSL加密确保整个有效负载不会被中间的人截获。

更多信息:

您还提到了临时访问(会话令牌)。在系统中,使用凭据登录(如上面的解决方案)并在响应中获得临时会话令牌是很常见的。然后使用会话令牌而不是登录详细信息来查询服务。它减少了在拦截的情况下凭据的展示,如果有人设法窃取了会话令牌,它将只工作几分钟。拥有很好,尽管不是必需品。