所以我在route.rb中有一条路由,例如:
get "example/:token" => "example#example"
即使production.rb中有config.filter_parameters += [:token]
,我仍然会得到类似以下的日志输出:
Started GET "/example/fjiaowevnieninr3"
Parameters: {"token"=>"[FILTERED]"}
您可以看到,“令牌”在“参数”中被过滤,但仍出现在URL路径中。我一直以为filtered_parameters
也会在那儿过滤它,但我猜不是。是否有官方方法可以从日志中过滤出这样的命名路由参数?
答案 0 :(得分:2)
据我所知,没有内置的方法可以过滤GET /example/[FILTERED]
这样的URL。但是您可以创建自己的方法来做到这一点。
稍微检查一下https://github.com/rails/rails/blob/master/actionpack/lib/action_dispatch/http/filter_parameters.rb
文件后,我发现过滤参数也会过滤路径的query_string
。
例如:在上述情况下,如果您向/example/fjiaowevnieninr3?token=fjiaowevnieninr3
发出请求,则日志中的结果将是:
Started GET "/example/fjiaowevnieninr3?token=[FILTERED]"
Parameters: {"token"=>"[FILTERED]"}
所以我建议您将令牌作为查询参数发送并执行以下操作:
在您的路线中添加:
get "example/auth" => "example#example"
然后您可以发出类似/example/auth?token=123456
params[:token]
在控制器中捕获此令牌这样您的日志将显示:
Started GET "/example/auth?token=[FILTERED]"
Parameters: {"token"=>"[FILTERED]"}
此外,config.filter_parameters
从config/application.rb
移到了它自己的文件,位于config/initializers/filter_parameter_logging.rb
文件中。
在您的token
中添加config/initializers/filter_parameter_logging.rb
符号:
Rails.application.config.filter_parameters += [:password, :token]
此外,别忘了重新启动服务器。
答案 1 :(得分:2)
通常,这取决于您为什么需要这种行为。 allenbrkn
的答案是正确的,您可以通过查询字符串发送它,它将从查询字符串中过滤掉。那就是说,当您尝试执行此操作时,还有更多要考虑的事情。
在生产环境中,您使用诸如Apache或Nginx之类的Web服务器,它们具有自己的访问日志,在其中记录一些标头,带有查询字符串的路径等(可配置)。
这意味着即使您从Rails日志中过滤出URL令牌,它们也可能会出现在Web服务器访问日志中。
也不要忘记这些参数可以发送到外部服务,例如。异常跟踪或性能跟踪软件。
令牌不应视为秘密。您的用户可以看到他们操纵它们,将URL发送给任何人或将其随机显示给某人。
我认为将令牌放入URL的主要原因有两个
难以猜测网址
在这种情况下,令牌始终相同。每次访问URL都不会更改它。通常可以用作某些资源或某些东西的ID。
例如,我们将其用作发票的公共URL,因此我们可以仅向客户发送链接,他们可以从我们的网站下载PDF,并且有些事情可以帮助他们付款。 URL中包含一些令牌,因此他们无法猜测URL并访问其他客户端的发票。令牌始终相同,因此他们可以多次访问电子邮件中的发票。该URL仍在Rails日志和服务器访问日志中,我们可以使用它,因为我们仍然知道令牌-它们是发票ID的一部分。
在这些情况下,它还可以帮助您进行调试。如果出现某些异常情况或资源出现问题,将很难找出原因。
用户授权
这有点复杂。对于授权,您不应将令牌放入URL。它们应始终位于正文中,并从日志或授权标头中过滤掉。不幸的是,有时候,如果您需要在GET请求中使用它,则没有太多选择,例如:
(当然,即使是GET请求,您也可以使用请求主体,但是冒着丢失数据的风险,例如,如果用户手动输入URL等)
在这些情况下,您应该尽可能短地暴露于有效令牌:
有了这些规则,它们是否出现在日志中都没有关系。
例如,我们在应用程序中实现了单点登录。有效令牌仅在有1分钟到期时间的情况下按需发行,并且在使用后立即失效。在这种情况下,它可以出现在日志中,因为在出现时它已经无效并且没有用。
使用密码重置可能会更复杂一些,您可能需要令牌至少几十分钟才能生效,并且令牌将在无效之前出现在日志中。但是,您可能没有太多可以做的事情-顺便说一句,如果有人有一些好主意,我会很高兴阅读它。
您可以从Rails日志中过滤令牌,但如果使用它们,它们也可能仍会出现在其他日志甚至其他服务中。您应该在URL中使用令牌,就像它们可以出现在令牌中一样,如果可以的话,请确保它对您尽可能安全。 Rails日志只是您必须考虑的一个难题。