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 に入れます。get
フォームの定義に従って「平文で」送信されたため、Sinatra がその時点でこれらのパラメーターをログに出力することは理解できます。
使用するフォームを変更するpost
と、URL の一部としてではなく、受信データの本文にパラメーターが配置され、詮索好きな目からより効果的に隠蔽されます。Sinatra は、出力にパラメーターを表示しないことで応答します。
get
Web 開発者は、またはpost
をフォームの として使用した場合の影響を認識する必要がありますmethod
。あなたがフォームを担当していない場合は、フォームを使用することの効果とget
、パラメーターが URL に挿入されることを知っているはずです。password
フィールド、または非表示である、または非表示にする必要があるフィールドは、HTML およびブラウザーの予期された定義済みの動作であるため、hidden
使用するフォームでは使用できません。method="get"
いずれにせよ、フォームを修正すれば残りの問題は修正されます。