我正在使用Slim Microframework编写RESTful Web服务,并使用GET从mysql数据库(选择查询)读取数据,并使用POST / PUT / DELETE在数据库中插入/更新/删除行。
现在我的问题是,如果每个人都能够在数据库中写入或删除数据,这不是一个大的安全问题吗?但我怎么能阻止这种情况,我认为REST中的ST代表状态转移(因此webservice是无状态的),这与登录或未登录状态相矛盾。如果我将一些登录数据传递给允许在数据库中写入的客户端,那么一个坏人是不是可以捕获logindata并使用它来伪造请求,例如删除所有条目?
那么,通常的方法是什么,我发现的唯一Slim Framework示例总是显示路由示例,而不是如何保护它。
Slim Framework中是否还有一些机会实现我所需要的?它应该尽可能简单,并且响应的响应几乎与没有验证或类似的响应一样快。没有像密码这样的敏感数据,对我而言,并非每个拥有cURL命令行工具的人都可以删除所有行或类似的东西。
如果有人能解释我该做什么和/或举一些例子,那将会很棒。我还需要知道,我可能需要在允许发送请求的客户端进行更改。
非常感谢。
答案 0 :(得分:1)
每个请求都必须经过身份验证和授权。
人们常常被“无国籍”这个词所束缚。这实际上只意味着从一个请求到下一个请求,RESTful服务没有用户状态的先验知识。
但是,显然允许服务知道刚刚发出请求的经过身份验证的用户,否则它将如何决定是否允许访问?
因此,您可以在每个请求期间将经过身份验证的用户“存储”在某个变量中。然后由您决定如何使用此信息来授权请求。
我喜欢保持简单,并将所有用户作为URI链中的资源。他们提出users/{username}/someresource
等请求。
我使用http基本身份验证(通过SSL)进行身份验证,并根据URI进行授权。如果请求验证失败,则为401 Unauthorized Request。如果URI {username}和authenticated {username}不匹配,则请求为403禁止。如果经过身份验证和授权,则允许请求(http代码取决于http动词)
现在已经覆盖了Web服务,现在是Web服务客户端。这当然是存储状态,否则您的用户每次发出请求时都必须登录。
您只需将用户会话存储在应用程序中(按照正常的会话管理),并在会话中存储用户名和密码(当然加密)。现在,每次发出请求时,您的Web服务客户端都需要检索用户名和密码,并将其与请求一起发送到您的Web服务。
答案 1 :(得分:0)
它将是无国籍的,在某种意义上说,确实没有会话或cookie。您通常会发出INSERT / UPDATE / DELETE所需的密钥。
然后,您可以通过每个请求传递密钥并确定密钥何时过期。
答案 2 :(得分:0)
它与普通的http身份验证会话一样安全。这些使用cookie等来验证连接的用户对存储的会话状态。
无状态服务也不例外 - 令牌传递给服务,就像令牌存储在正常http的cookie中一样。如果您担心嗅探(IE中间人攻击),您可以通过SSL保护链接。
服务生成的身份验证令牌将被加密,并包含一个salt,该服务器还会针对每个请求验证该资源。您还可以限制会话时间以适应您的偏执,并检查源IP,用户代理等的更改,并在用户的令牌发生更改时使其到期。
答案 3 :(得分:0)
我最近遇到了类似的问题。根据此处人员的建议,我决定使用OAuth身份验证。
我正在使用HybridAuth一个用于OAuth的php包装器和开箱即用的登录Facebook,Twitter,Google,LinkedIn等解决方案。