如何在Sinatra的记录器中过滤密码字段?

时间:2013-01-04 13:50:32

标签: ruby logging filter sinatra

如果我发送'password'等表格的参数,在Sinatra的日志中我可以看到:

{"api_session":"da1123f8c5edd2d3b7c8b43a4e93b7c2","password":"12323"}

如何使用星号隐藏密码,例如"******"

例如,在Rails中,我可以为参数启用过滤器:

class ApplicationController < ActionController::Base
  filter_parameter_logging :password

我可以在Sinatra做同样的事吗?

2 个答案:

答案 0 :(得分:3)

您没有展示如何在HTML中定义表单,但我怀疑您正在使用method="get"或未指定浏览器应如何将数据发送到Sinatra并将其默认为{{1 }}

如果我定义这样的表格:

get

以此作为我的处理程序:

<html>
  <body>
    <form action="do_form" method="get">
      User: <input name="user"><br>
      Passwd: <input type=password name="passwd"><br>
      <input type="submit">
    </form>
  </body>
</html>

当我使用浏览器提交表单时,我会在控制台中看到这个:

get '/do_form' do
  puts "got user/password"
end

Sinatra认为输出收到的参数是安全的。如果我将表格定义为:

,则会发生同样的事情
got user/passwd
127.0.0.1 - - [04/Jan/2013 07:43:24] "GET /do_form?user=foo&passwd=bar HTTP/1.1" 200 - 0.0041

相反,如果我将其定义为:

<form action="do_form">

并使用<form action="do_form" method="post"> 处理程序代替post

get

我在日志记录中看到了这一点:

post '/do_form' do
  puts "got user/passwd"
end

这是我用来测试的代码:

got user/passwd
127.0.0.1 - - [04/Jan/2013 07:49:24] "POST /do_form HTTP/1.1" 200 - 0.0015

只需更改require 'sinatra' get '/' do ' <html> <body> <!-- <form action="do_form"> --> <!-- <form action="do_form" method="get"> --> <form action="do_form" method="post"> User: <input name="user"><br> Passwd: <input type=password name="passwd"><br> <input type="submit"> </form> </body> </html> ' end get '/do_form' do puts "got user/passwd" end post '/do_form' do puts "got user/passwd" end 处理程序中表单的定义,即可尝试使用get '/'post

get请求会在发送表单时将所有参数放入URL中。可以理解的是,Sinatra会在那时在其日志中输出这些参数,因为它们是按照get定义的形式“明确地”发送的。

更改表单以使用get将参数放入传入数据的正文中,而不是作为URL的一部分,更有效地将它们隐藏起来。 Sinatra通过不在其输出中显示参数来做出响应。

作为网络开发者,您必须了解使用postget作为表单post的效果。如果您不负责表单,那么谁应该知道使用method的效果,并且它会将参数放入URL中。 get字段或password或应该不可见的任何字段都不能在使用hidden的表单中使用,因为这是HTML和浏览器的预期和定义的行为。无论哪种方式,修复表单,问题的其余部分将被修复。

答案 1 :(得分:0)

我用另一种方式解决了这个问题。

我不使用表单,我发送带有数据的'put'ajax请求。

我错过了Sinatra写的只记录我的打印输出。我可以捕获所有必要的参数,然后过滤它们:

put '/api/*' do |path|
  data = request.body.read.to_s
  filtered_data = data
  filtered_data[:password] = '********'
  puts filtered_data #into log
  #...

谢谢你!