如何保护 Rails API 请求?
How to secure Rails API requests?
我只有一个 API rails 应用程序和另一个 angular 应用程序作为前端
目前,我通过在 headers
上发送 X-APP-Token 和每个请求来保护 API
已登录用户的其他 API 在 headers 上有 X-User-Token 作为 (JWT)
我的问题是,从 angular 发送的每个请求,令牌都暴露在 headers 上,任何人都可以访问它们
如何从 front-end 和 back-end 的角度保护这些令牌?比如加盐和加密,这样如果有人偷了那个令牌,它就没用了
提前致谢
在生产环境中,您的客户端代码应该通过 SSL 安全连接与后端通信 API。大多数情况下,您会将 SSL 证书放在代理您的 API 或应用程序服务器的 Web 服务器或 load-balancer 上。这将防止 middle-man 拦截令牌然后冒充用户。
编辑:此外,也许您需要澄清“我的问题,从 angular 发送的每个请求,令牌都暴露在 headers 上,任何人都可以访问它们” - 我我很好奇怎么会有人访问这些 headers?此外,您的 JWT 应该已签名并设置了应用服务器遵守的过期时间。
安全有很多层次,但在保护您的 API 时,您肯定需要包括一些东西,根据我的经验,这里有一些更重要的安全措施:
- 访问控制或 Role-based 控制,如果你想保护你的 API,这是至关重要的,你需要包括某种 'Policies' 来帮助你管理对资源的访问在您的 API 中以保护您的数据(如果您问我 Pundit, CanCan,这些也是不错的选择,尽管我更喜欢 Pundit,但两者都不错),这是一种避免 user/cracker 使用另一个用户访问权限 key/token 获得对不属于他 'domain'.
的资源的访问权限的方法
- 您需要为每个后端响应添加适当的安全性 headers,此配置取决于您的 API 和您的应用程序,也就是说您可以在应用程序控制器中添加以下代码例如(下面是默认配置的一个很好的例子):
before_action :set_headers
def set_headers
response.set_header('Referrer-Policy', 'strict-origin-when-cross-origin')
response.set_header('X-Content-Type-Options', 'nosniff')
response.set_header('X-Frame-Options', 'SAMEORIGIN')
response.set_header('X-XSS-Protection', '1; mode=block')
response.set_header('Content-Security-Policy', "default-src 'self' https:; " \
"img-src 'self' https:" \
"media-src 'none'; " \
"object-src 'none'; " \
"script-src 'self'; " \
"style-src 'self' ")
end
因为你在 rails 5.x
你可以去你的环境配置让我们说 production.rb 并添加以下行:config.force_ssl = true
,这将强制通过 HTTPS
针对您的 API 的所有连接,它还会添加此响应 header strict-transport-security
,这会增加安全性,请注意,如果您尝试访问您的 API通过 HTTP
你的 API 将尝试强制 HTTPS
并且在某些情况下 return 代码 301
这意味着重定向这是一个很好的提示,以防你有健康检查。
您肯定需要处理不安全直接引用 Object 引用 (IDOR) 等常见问题,这个问题顾名思义是当您直接引用私有资源时,比方说在你的应用程序的 URL 中你有类似 ***/shop/23
的东西,其中 23
是你模型的自动增量 ID 我想我不需要解释为什么那是错误的,从那一刻起您可能会受到枚举攻击、访问信息(您应该通过授权避免这种情况)、销毁 objects 等,在这些情况下,一种可能的方法是使用间接引用或更改该 id 的值不是可以猜到。
最后但同样重要的是,您需要为您的用户制定适当的密码政策,您可以查看其他网站,或咨询 NSA 以获取此类信息。
在大多数情况下,安全性取决于您的应用程序的性质,您可能需要一些其他安全性(例如,如果您的逻辑包含外部 links/URLs,您可能需要检查这些链接是否有效且安全,等等...),但正如我之前所说,我认为上面描述的列表非常适合一组好的应用程序,其余的取决于你的logic/flows,希望以上内容有助于澄清。
我只有一个 API rails 应用程序和另一个 angular 应用程序作为前端
目前,我通过在 headers
上发送 X-APP-Token 和每个请求来保护 API已登录用户的其他 API 在 headers 上有 X-User-Token 作为 (JWT)
我的问题是,从 angular 发送的每个请求,令牌都暴露在 headers 上,任何人都可以访问它们
如何从 front-end 和 back-end 的角度保护这些令牌?比如加盐和加密,这样如果有人偷了那个令牌,它就没用了
提前致谢
在生产环境中,您的客户端代码应该通过 SSL 安全连接与后端通信 API。大多数情况下,您会将 SSL 证书放在代理您的 API 或应用程序服务器的 Web 服务器或 load-balancer 上。这将防止 middle-man 拦截令牌然后冒充用户。
编辑:此外,也许您需要澄清“我的问题,从 angular 发送的每个请求,令牌都暴露在 headers 上,任何人都可以访问它们” - 我我很好奇怎么会有人访问这些 headers?此外,您的 JWT 应该已签名并设置了应用服务器遵守的过期时间。
安全有很多层次,但在保护您的 API 时,您肯定需要包括一些东西,根据我的经验,这里有一些更重要的安全措施:
- 访问控制或 Role-based 控制,如果你想保护你的 API,这是至关重要的,你需要包括某种 'Policies' 来帮助你管理对资源的访问在您的 API 中以保护您的数据(如果您问我 Pundit, CanCan,这些也是不错的选择,尽管我更喜欢 Pundit,但两者都不错),这是一种避免 user/cracker 使用另一个用户访问权限 key/token 获得对不属于他 'domain'. 的资源的访问权限的方法
- 您需要为每个后端响应添加适当的安全性 headers,此配置取决于您的 API 和您的应用程序,也就是说您可以在应用程序控制器中添加以下代码例如(下面是默认配置的一个很好的例子):
before_action :set_headers
def set_headers
response.set_header('Referrer-Policy', 'strict-origin-when-cross-origin')
response.set_header('X-Content-Type-Options', 'nosniff')
response.set_header('X-Frame-Options', 'SAMEORIGIN')
response.set_header('X-XSS-Protection', '1; mode=block')
response.set_header('Content-Security-Policy', "default-src 'self' https:; " \
"img-src 'self' https:" \
"media-src 'none'; " \
"object-src 'none'; " \
"script-src 'self'; " \
"style-src 'self' ")
end
因为你在
rails 5.x
你可以去你的环境配置让我们说 production.rb 并添加以下行:config.force_ssl = true
,这将强制通过HTTPS
针对您的 API 的所有连接,它还会添加此响应 headerstrict-transport-security
,这会增加安全性,请注意,如果您尝试访问您的 API通过HTTP
你的 API 将尝试强制HTTPS
并且在某些情况下 return 代码301
这意味着重定向这是一个很好的提示,以防你有健康检查。您肯定需要处理不安全直接引用 Object 引用 (IDOR) 等常见问题,这个问题顾名思义是当您直接引用私有资源时,比方说在你的应用程序的 URL 中你有类似
***/shop/23
的东西,其中23
是你模型的自动增量 ID 我想我不需要解释为什么那是错误的,从那一刻起您可能会受到枚举攻击、访问信息(您应该通过授权避免这种情况)、销毁 objects 等,在这些情况下,一种可能的方法是使用间接引用或更改该 id 的值不是可以猜到。最后但同样重要的是,您需要为您的用户制定适当的密码政策,您可以查看其他网站,或咨询 NSA 以获取此类信息。
在大多数情况下,安全性取决于您的应用程序的性质,您可能需要一些其他安全性(例如,如果您的逻辑包含外部 links/URLs,您可能需要检查这些链接是否有效且安全,等等...),但正如我之前所说,我认为上面描述的列表非常适合一组好的应用程序,其余的取决于你的logic/flows,希望以上内容有助于澄清。