2

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

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

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

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

class ApplicationController < ActionController::Base
  filter_parameter_logging :password

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

4

2 回答 2

3

您没有展示如何在 HTML 中定义表单,但我怀疑您是否使用method="get"或未指定浏览器应如何将数据发送到 Sinatra 并使其默认为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

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

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

Sinatra 认为输出接收到的参数是安全的。如果我定义如下形式,也会发生同样的事情:

<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 '/'处理程序中更改表单的定义即可尝试使用postget

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

更改要使用的表单post会将参数放入传入数据的主体中,而不是作为 URL 的一部分,从而更有效地隐藏它们以防窥探。Sinatra 的响应是在其输出中不显示参数。

作为 Web 开发人员,您必须了解使用其中一个getpost作为表单的method. 如果您不负责表单,那么任何人都应该知道使用的效果,get并且它会将参数放入 URL 中。password字段或任何不可见或应该不可见的字段hidden不能在表单中使用method="get",因为这是 HTML 和浏览器的预期和定义行为。无论哪种方式,修复表单,其余问题将得到修复。

于 2013-01-04T14:50:14.970 回答
1

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

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

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

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

谢谢你,丁!

于 2013-01-04T16:23:13.703 回答