「パスワードの送信にURLクエリパラメータを使ってはいけない」のは何故か?
「パスワード等の機密情報をWebサーバーに送信する際は,URLクエリパラメータではなくPOSTのリクエストボディを使うべきである」
という主張を複数の書籍・サイトで見かけたことがありますが,この理由はなんでしょうか?
SSL/TLSを使わないhttp通信の場合は通信路でパケットを盗聴されるとリクエストの中身がすべて丸見えですから
POSTで送ったところで機密情報の保護には役に立ちません。
一方SSL/TLSを使った場合はクエリパラメータまで暗号化されるため,クエリパラメータで送ったところで
機密情報が盗み見られることはありません。(SSL/TLSに脆弱性が無い限り)
したがって個人的にはパスワードをクエリパラメータで送っても何の問題もないと思っているのですが,
表題の主張には何か理由があるものなのでしょうか?
よろしくお願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答9件
0
ショルダーハッキングとか。
あと、他人にURLを伝えるときにコピペだけではだめ。パスワードとか消して伝えないといけない。
そういうことをITエンジニアでない一般ユーザーに伝えるのは困難。絶対に徹底できない。
まあ、他人にURLを伝えることが絶対に無いような種類のサイトだと良いかもですが、ちょっと想像つかないです。
投稿2018/01/31 15:44
総合スコア85778
0
一番わかり易いのは、bookmark を見ることで、id/pass がバレてしまうとか。
もう少し踏み込むと、アクセスログに id/pass が残るのもまずい。
等々。考慮しなければならない点が増えてしまいます。
投稿2018/01/31 13:32
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
質問者の主張は十分な時間や知識があれば、結局のところ見れてしまうから同じだろう?という主張だと理解した前提で回答します。
実際問題としては、URLに載っかってる情報というのは、HTTPリクエストのボディにあるデータより断然、覗き見やすいです。
例を上げて言うなら、ブラウザの履歴やアクセスログ等など、ハッキングの知識がない人であっても、容易に知ることができます。
また、人間というのは、普段、悪いことをしない人であっても、チャンスがあると誘惑にかられることもあります。(例えば、今まで一度たりとも物を盗んだことがない人であっても、金庫の暗証番号のヒントが書かれてる紙を偶然見つけてしまったら、人によっては誘惑に負けてしまう人だっているでしょう。本当に開けれるかどうかは別としても)
そういった相手に付け入る隙をなるべく与えないことは、意味はあるのです。
また、セキュリティは結局のところ、ここまでやれば、絶対に大丈夫なんてものはないので、コスト(労力)とエフェクティブ(効果)の兼ね合いなのです。今回のことでいえば、GETを使わずにPOSTを使うようにするのは、それほど労力はかからないと思うので、やるだけの意味はあるように思えます。
投稿2018/02/06 01:57
総合スコア253
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
SSL/TLSストリームとして通信を見ると、そのどこにパスワードを含めても同じ(はず)ですが、HTTPプロトコル的にURLは他のヘッダやペイロードに比べて人に近いデータで、色々な所にさらされることが多いからじゃないでしょうか。
ログとかブラウザのアドレスバーとかリファラーとか。ユーザーが自分の見ている画面をほかの人にシェアしたくてURLをメールで送ったらパスワードがそこに含まれていたとか。
パスワードは相対的にさらされる頻度の低いペイロードに含めようって解釈もできるなぁと思います。
投稿2018/01/31 15:04
総合スコア6142
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
まだ質問を受け付けているようなのでお答えします。
他の方がおっしゃっているブラウザの履歴の問題はクライアント側でID/PWの組み合わせが漏洩してしまう問題ですよね。
サーバ側で漏洩を幇助してしまう理由としてはブラウザがリクエストを生成する際にRefererヘッダに遷移元のURLを付与してしまうことが原因です。
例えばGETパラメータでID/PWを認証するサービスでは、認証時のサービスからのリクエストは以下のようなURLになります。
https://hoge.com/login.html?id=uid001&passwd=pw12345
認証をした後のlogin.htmlのページから送信されるリクエストのRefererヘッダにはログイン時に送信したリクエストURLがGETパラメータごと付与されてしまいます。
GET / HTTP 1.1 ~ Referer:https://hoge.com/login.html?id=uid001&passwd=pw12345 ~
このRefererヘッダはリクエストヘッダに自動で付与されるため
認証後に別ドメインのURLへ遷移するような処理を行なっている場合、遷移先のサーバで有効なID/PWの組み合わせが漏洩します。
このRefererヘッダはchormeなどのデペロッパーツールを使うと容易に確認できます。
[Network]タブからURLを選択し、Headersの項目を参照する。
[補足]
ハッシュ化してから送信するという答えもありましたが、その場合クライアント側でハッシュ化を行うのであれば攻撃者にもハッシュアルゴリズムが漏洩します。
投稿2018/02/09 12:35
編集2018/02/16 12:03総合スコア135
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
SSLで暗号化されていたとしても、サーバ側のアクセスログには平文で書かれてしまいます。
また、その参考にされた書籍がそもそも SSL が一般的ではない(技術はともかく、証明書発行が高かったり面倒だったりで普及していない)頃に書かれたものというのもあるかも知れません。
実際のところ、何でもかんでも SSL にしようというのは、Let's Encrypt などで手軽にオレオレでない証明書が発行できるようになったからではないでしょうか。
投稿2018/01/31 13:40
総合スコア13703
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
本気でハッキングしようと思ったらどちらにしろ同じですし、送信データをSSLの他に暗号化させてないのでどちらも不十分だと思います。ただ、セキュリティの概念(セキュリティとはハッキングしようとしている人が少しでも手間だと思うことをすること)に基づいたら、URLで記述するよりリクエストボディで送る方が手間だと感じます。
理由として、URLは自然と目につく部分のため、「なにかしている」というヒントを与えているのに対して、リクエストボディは見ようと思わなければ見ないですし、リクエストボディの方が解析するのは手間なためです。
投稿2018/02/06 00:11
総合スコア69
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
getとpostはhtttp通信におけるメソッドであって、役割が全く異なります。
getは必要な情報をURLに記載することで情報を受け渡すものであり、postはヘッダーに情報を追記することで情報を渡します。
前者は情報量をURLだけに絞ることで、早く処理を行うとともに、同じURLを叩いたら同じ動的情報を取得することが可能ですが、文字数制限があるため多くの情報を送信することができません。
またパスワードは、送信された後、ハッシュ化されて DB に保存されます。ブラウザ上で入力した値とDBに保存される値が異なり、DBに登録されるのはhash化されたパスワードになります。hash化されたパスワードの正式な値を知る方法はソースコード上で復元される時のみなので、見られたからと言ってすぐに影響はでません。つまり、送信されたパスワードから対応するDBのレコードを探しても、どれがそれに該当するのかわからないようになっております。
あくまでも高速処理や大規模データ処理等、getメソッドである必要がある時のみgetメソッドを用いるのであり、それ以外の時はpostメソッドで送信するのが慣習です。
余談ですが、知人と話している時、知人の友人がガスコンロの上に衣服を干す人がいるという話を聞きました。知人の友人の言い分はガスの元栓閉めているから問題ないとのことでしたが、知人はもの凄く違和感を抱いたようです。いくら物理的に発火しないといっても、発火物の上に可燃物の衣服を置くのは多くの人に取って不快感を与えます。それと同じように、いくらセキュリティを強化してあるからと言って、getメソッドでパスワードを送信しようとするのは、多くのプログラマーに取って違和感を与えます。
何かしらgetを使いたい強い理由があればいいと思いますが、そのような理由は誰も思いつかないので、やらないほうがいいです。
投稿2018/02/06 09:49
編集2018/02/06 13:50総合スコア57
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2018/02/06 10:03
2018/02/06 11:18
退会済みユーザー
2018/02/06 11:46
2018/02/06 13:51
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。