0

我正在使用 Slim 微框架编写一个 RESTful Web 服务,并使用 GET 从 mysql 数据库中读取数据(选择查询),并使用 POST/PUT/DELETE 在数据库中插入/更新/删除行。

我现在的问题是,如果每个人都能够在数据库中写入或删除数据,这不是一个大的安全问题吗?但是我怎么能防止这种情况发生,我认为 REST 中的 ST 代表状态转移(因此 web 服务是无状态的),这与登录或未登录等状态是矛盾的。而且,如果我将一些允许写入数据库的登录数据传递给客户端,那么一个坏人不能用它捕获登录数据和虚假请求,例如删除所有条目吗?

那么,正常的做法是什么,我发现的唯一 Slim 框架示例总是显示路由示例,而不是如何保护它。

Slim 框架中是否还有一些机会来实现我所需要的?它应该尽可能简单,并且请求的响应速度应该几乎与没有身份验证或类似的情况一样快。没有像密码这样的敏感数据,对我来说,不是每个使用 cURL 命令行工具的人都可以删除所有行或类似的东西就足够了。

如果有人能解释我该怎么做和/或举一些例子,那就太好了。我还需要知道,我可能需要在允许发送请求的客户端上进行更改。

非常感谢。

4

4 回答 4

1

每个请求都必须经过身份验证和授权。

人们经常被“无国籍”这个词所束缚。这实际上只是意味着从一个请求到下一个请求,RESTful 服务没有用户状态的先验知识。

但是,显然允许服务知道刚刚发出请求的经过身份验证的用户,否则它将如何决定是否应该允许访问?

因此,您可以在每次请求期间将经过身份验证的用户“存储”在某个变量中。然后由您决定如何使用此信息来授权请求​​。

我喜欢保持简单,并将所有用户作为我的 URI 链中的资源。他们提出类似的要求users/{username}/someresource

我使用 http 基本身份验证(通过 SSL)进行身份验证并根据 URI 进行授权。如果请求未通过身份验证,则为 401 Unauthorized Request。如果 URI {username} 和经过身份验证的 {username} 不匹配,则该请求是 403 禁止的。如果经过认证和授权,则允许请求(http代码依赖于http动词)

现在已经涵盖了 Web 服务,接下来是 Web 服务客户端。这当然必须存储状态,否则您的用户每次发出请求时都必须登录。

您只需将用户会话存储在应用程序中(按照正常的会话管理),并在会话中存储用户名和密码(当然是加密的)。现在,每次发出请求时,您的 Web 服务客户端都需要检索用户名和密码,并将其与请求一起发送到您的 Web 服务。

于 2013-03-04T17:16:47.720 回答
0

它将是无状态的,实际上不会有会话或 cookie。您通常会发出插入/更新/删除所需的密钥。

然后由您在每个请求中传递密钥并确定密钥何时到期。

于 2013-02-27T14:12:32.870 回答
0

它与普通的 http 认证会话一样安全。这些使用 cookie 等将连接的用户验证到存储的会话状态。

无状态服务也不例外 - 令牌被传递给服务,就像令牌存储在普通 http 的 cookie 中一样。如果您担心嗅探(IE 中间人攻击),您可以通过 SSL 保护链接。

服务生成的身份验证令牌将被加密,并包含一个盐,该盐也在服务器上针对每个请求进行验证。您还可以限制会话时间以适应您的妄想症,还可以检查源 IP、用户代理等的变化,如果这些变化使用户的令牌过期。

于 2013-03-27T06:01:07.930 回答
0

我最近遇到了类似的问题。正如这里的人所推荐的,我决定使用 OAuth 身份验证。

我正在使用HybridAuth一个用于 OAuth 的 php 包装器,以及用于 Facebook、Twitter、Google、LinkedIn 等的开箱即用的登录解决方案。

于 2014-03-25T05:32:21.027 回答