変数は HTTP POST 経由で送信されるため、HTTP GET 経由で送信される変数よりも優れたセキュリティは提供されません。
HTTP/1.1 は、リクエストを送信するための一連のメソッドを提供します。
- オプション
- 得る
- 頭
- 役職
- 置く
- 消去
- 痕跡
- 接続
GET を使用した次の HTML ドキュメントがあるとします。
<html>
<body>
<form action="http://example.com" method="get">
User: <input type="text" name="username" /><br/>
Password: <input type="password" name="password" /><br/>
<input type="hidden" name="extra" value="lolcatz" />
<input type="submit"/>
</form>
</body>
</html>
ブラウザは何を尋ねますか? これは次のように尋ねます。
GET /?username=swordfish&password=hunter2&extra=lolcatz HTTP/1.1
Host: example.com
Connection: keep-alive
Accept: application/xml,application/xhtml+xml,text/html;q=0.9,text/ [...truncated]
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) [...truncated]
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
ここで、そのリクエスト メソッドを POST に変更したとしましょう。
POST / HTTP/1.1
Host: example.com
Connection: keep-alive
Content-Length: 49
Cache-Control: max-age=0
Origin: null
Content-Type: application/x-www-form-urlencoded
Accept: application/xml,application/xhtml+xml,text/ [...truncated]
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; [...truncated]
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
username=swordfish&password=hunter2&extra=lolcatz
これらの HTTP リクエストは両方とも次のとおりです。
- 暗号化されていません
- 両方の例に含まれています
- 傍受され、MITM 攻撃を受ける可能性があります。
- サード パーティやスクリプト ボットによって簡単に再現されます。
多くのブラウザーは、POST/GET 以外の HTTP メソッドをサポートしていません。
多くのブラウザー動作はページ アドレスを保存しますが、これは、これらの他の問題を無視できるという意味ではありません。
具体的には:
あるものは別のものよりも本質的に安全ですか? POST は URL に関する情報を公開しないことは理解していますが、それには本当の価値があるのでしょうか、それとも隠蔽による単なるセキュリティなのでしょうか? ここでのベストプラクティスは何ですか?
HTTP を話すために使用しているソフトウェアは、ある方法でリクエスト変数を保存する傾向があるため、これは正しいことです。別の方法では、誰かがあなたのブラウザの履歴を見たり、h4x0r1ng を理解していると思っている 10 歳からの素朴な攻撃を防いだりするだけです。 、または履歴ストアをチェックするスクリプト。履歴ストアをチェックできるスクリプトがあれば、ネットワーク トラフィックをチェックするスクリプトも同じように簡単に作成できます。
https を介して、POST データはエンコードされますが、URL は第三者によって傍受される可能性がありますか?
SSL の仕組みは次のとおりです。上記で送信した 2 つのリクエストを覚えていますか? SSL での表示は次のとおりです ( example.com は SSL で応答しないため、ページをhttps://encrypted.google.com/に変更しました)。
SSL経由で投稿
q5XQP%RWCd2u#o/T9oiOyR2_YO?yo/3#tR_G7 2_RO8w?FoaObi)
oXpB_y?oO4q?`2o?O4G5D12Aovo?C@?/P/oOEQC5v?vai /%0Odo
QVw#6eoGXBF_o?/u0_F!_1a0A?Q b%TFyS@Or1SR/O/o/_@5o&_o
9q1/?q$7yOAXOD5sc$H`BECo1w/`4?)f!%geOOF/!/#Of_f&AEI#
yvv/wu_b5?/o d9O?VOVOFHwRO/pO/OSv_/8/9o6b0FGOH61O?ti
/i7b?!_o8u%RS/Doai%/Be/d4$0sv_%YD2_/EOAO/C?vv/%X!T?R
_o_2yoBP)orw7H_yQsXOhoVUo49itare#cA?/c)I7R?YCsg ??c'
(_!(0u)o4eIis/S8Oo8_BDueC?1uUO%ooOI_o8WaoO/ x?B?oO@&
Pw?os9Od!c?/$3bWWeIrd_?( `P_C?7_g5O(ob(go?&/ooRxR'u/
T/yO3dS&??hIOB/?/OI?$oH2_?c_?OsD//0/_s%r
SSL経由でGET
rV/O8ow1pc`?058/8OS_Qy/$7oSsU'qoo#vCbOO`vt?yFo_?EYif)
43`I/WOP_8oH0%3OqP_h/cBO&24?'?o_4`scooPSOVWYSV?H?pV!i
?78cU!_b5h'/b2coWD?/43Tu?153pI/9?R8!_Od"(//O_a#t8x?__
bb3D?05Dh/PrS6_/&5p@V f $)/xvxfgO'q@y&e&S0rB3D/Y_/fO?
_'woRbOV?_!yxSOdwo1G1?8d_p?4fo81VS3sAOvO/Db/br)f4fOxt
_Qs3EO/?2O/TOo_8p82FOt/hO?X_P3o"OVQO_?Ww_dr"'DxHwo//P
oEfGtt/_o)5RgoGqui&AXEq/oXv&//?%/6_?/x_OTgOEE%v (u(?/
t7DX1O8oD?fVObiooi'8)so?o??`o"FyVOByY_ Supo? /'i?Oi"4
tr'9/o_7too7q?c2Pv
(注: HEX を ASCII に変換しましたが、一部は明らかに表示できないはずです)
HTTP 会話全体が暗号化され、通信の唯一の目に見える部分は TCP/IP 層 (つまり、IP アドレスと接続ポート情報) にあります。
ですから、ここで大胆な発言をさせてください。あなたのウェブサイトは、ある HTTP メソッドよりも別の HTTP メソッドよりも優れたセキュリティを提供されているわけではありません。世界中のハッカーや初心者は、私がここで示した方法を正確に知っています。セキュリティが必要な場合は、SSL を使用してください。ブラウザーは履歴を保存する傾向があります。RFC2616 9.1.1 では、GET を使用してアクションを実行しないことが推奨されていますが、POST がセキュリティを提供すると考えるのは完全に間違っています。
POST が対象とする唯一のセキュリティ対策は? ブラウザの履歴をひっくり返す嫉妬深い元からの保護。それでおしまい。残りの世界はあなたのアカウントにログインし、あなたを笑っています。
POST が安全でない理由をさらに示すために、Facebook はあらゆる場所で POST リクエストを使用しています。
HTTPS を使用していて、サイトにXSS脆弱性が含まれていない場合でも、 CSRFで攻撃される可能性があることに注意してください。要するに、この攻撃シナリオは、被害者 (サイトまたはサービスのユーザー) が既にログインしており、適切な Cookie を持っていることを前提としています。次に、被害者のブラウザーが (おそらく安全な) サイトで何かを行うように要求されます。CSRF に対する保護がない場合でも、攻撃者は被害者の資格情報を使用してアクションを実行できます。サーバーの応答は被害者のブラウザに転送されるため、攻撃者はそれを見ることができませんが、通常、その時点ですでに損害が発生しています。