过滤路径参数

时间:2019-08-10 04:29:23

标签: ruby-on-rails logging

所以我在route.rb中有一条路由,例如:

get "example/:token" => "example#example"

即使production.rb中有config.filter_parameters += [:token],我仍然会得到类似以下的日志输出:

Started GET "/example/fjiaowevnieninr3"
    Parameters: {"token"=>"[FILTERED]"}

您可以看到,“令牌”在“参数”中被过滤,但仍出现在URL路径中。我一直以为filtered_parameters也会在那儿过滤它,但我猜不是。是否有官方方法可以从日志中过滤出这样的命名路由参数?

2 个答案:

答案 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_parametersconfig/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发送给任何人或将其随机显示给某人。


我认为将令牌放入URL的主要原因有两个

  1. 很难猜测网址
  2. 用户授权

难以猜测网址

在这种情况下,令牌始终相同。每次访问URL都不会更改它。通常可以用作某些资源或某些东西的ID。

例如,我们将其用作发票的公共URL,因此我们可以仅向客户发送链接,他们可以从我们的网站下载PDF,并且有些事情可以帮助他们付款。 URL中包含一些令牌,因此他们无法猜测URL并访问其他客户端的发票。令牌始终相同,因此他们可以多次访问电子邮件中的发票。该URL仍在Rails日志和服务器访问日志中,我们可以使用它,因为我们仍然知道令牌-它们是发票ID的一部分。

在这些情况下,它还可以帮助您进行调试。如果出现某些异常情况或资源出现问题,将很难找出原因。

用户授权

这有点复杂。对于授权,您不应将令牌放入URL。它们应始终位于正文中,并从日志或授权标头中过滤掉。不幸的是,有时候,如果您需要在GET请求中使用它,则没有太多选择,例如:

  • 单点登录(重定向流)
  • 密码重置

(当然,即使是GET请求,您也可以使用请求主体,但是冒着丢失数据的风险,例如,如果用户手动输入URL等)

在这些情况下,您应该尽可能短地暴露于有效令牌:

  • 始终按需发行新令牌,切勿重复使用相同令牌
  • 有效期很短的工作
  • 每个令牌使用后应立即失效

有了这些规则,它们是否出现在日志中都没有关系。

例如,我们在应用程序中实现了单点登录。有效令牌仅在有1分钟到期时间的情况下按需发行,并且在使用后立即失效。在这种情况下,它可以出现在日志中,因为在出​​现时它已经无效并且没有用。

使用密码重置可能会更复杂一些,您可能需要令牌至少几十分钟才能生效,并且令牌将在无效之前出现在日志中。但是,您可能没有太多可以做的事情-顺便说一句,如果有人有一些好主意,我会很高兴阅读它。


结论

您可以从Rails日志中过滤令牌,但如果使用它们,它们也可能仍会出现在其他日志甚至其他服务中。您应该在URL中使用令牌,就像它们可以出现在令牌中一样,如果可以的话,请确保它对您尽可能安全。 Rails日志只是您必须考虑的一个难题。