您没有展示如何在 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 '/'
处理程序中更改表单的定义即可尝试使用post
或get
。
发送get
表单时,请求会将所有参数放入 URL。Sinatra 会在其日志中输出这些参数是可以理解的,因为它们是按照表单的get
定义“以明文形式”发送的。
更改要使用的表单post
会将参数放入传入数据的主体中,而不是作为 URL 的一部分,从而更有效地隐藏它们以防窥探。Sinatra 的响应是在其输出中不显示参数。
作为 Web 开发人员,您必须了解使用其中一个get
或post
作为表单的method
. 如果您不负责表单,那么任何人都应该知道使用的效果,get
并且它会将参数放入 URL 中。password
字段或任何不可见或应该不可见的字段hidden
不能在表单中使用method="get"
,因为这是 HTML 和浏览器的预期和定义行为。无论哪种方式,修复表单,其余问题将得到修复。