如果我发送'password'
等表格的参数,在Sinatra的日志中我可以看到:
{"api_session":"da1123f8c5edd2d3b7c8b43a4e93b7c2","password":"12323"}
如何使用星号隐藏密码,例如"******"
?
例如,在Rails中,我可以为参数启用过滤器:
class ApplicationController < ActionController::Base
filter_parameter_logging :password
我可以在Sinatra做同样的事吗?
答案 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通过不在其输出中显示参数来做出响应。
作为网络开发者,您必须了解使用post
或get
作为表单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
#...
谢谢你!