私の大学は POST cgi メソッドをサポートしていません (私は知っていますが、それはクレイジーです)。ユーザーがユーザー名とパスワードを使用して安全にログインできるシステムを構築できることを望んでいました。これは可能ですか?
そうでない場合、POST でどのようにしますか? 単なる好奇心から。
乾杯!
私の大学は POST cgi メソッドをサポートしていません (私は知っていますが、それはクレイジーです)。ユーザーがユーザー名とパスワードを使用して安全にログインできるシステムを構築できることを望んでいました。これは可能ですか?
そうでない場合、POST でどのようにしますか? 単なる好奇心から。
乾杯!
実際には、すべて GET メソッドで実行できます。ただし、ログインには完全なチャレンジ レスポンス プロトコルを使用する必要があります。(javascript を使用してクライアント側でハッシュすることができます。毎回固有のチャレンジを送信するだけで済みます。)また、SSL を使用して、文字列が通過するときに誰も文字列を見られないようにする必要があります。
ある意味では、GET と POST リクエストの間に実際のセキュリティの違いはありません。どちらもプレーンテキストで渡されるためです。別の意味では、実際には... GET は傍受するのが非常に簡単で、ほとんどの人のログとあなたのウェブブラウザの履歴。:)
(または、他のポスターで提案されているように、HTTP 認証、ダイジェスト認証、または AD、LDAP、kerberos、shib などのより高いレベルの認証方式など、まったく別の方法を使用します。ただし、POST がなければ、これらもありません。)
サポートされている場合は、HTTP 認証を使用できます。
すべてのメソッド、POST、GET、および HTTP Auth (ダイジェスト HHTP 認証を除く) はプレーンテキストを送信するため、SSL を追加する必要があります。
GET は基本的に POST と同じですが、送信できるデータの量に制限があり、通常は POST よりもはるかに小さく、セマンティックの違いにより、その観点からは GET は適切な候補ではありません。たとえ技術的には両方とも出来る。
例として、何を使用していますか?cgi モジュールや、Django、CherryPy などのフレームワークなど、Python には多くの選択肢があります。
良い選択:HTTPダイジェスト認証
うまくやってのけるのは難しいですが、オプション:Javascriptを使用したクライアント側のハッシュ
JavaScriptを少し使用すると、入力したパスワードとサーバーで生成されたナンスをクライアントにハッシュさせ、それをHTTPGETで使用できます。
この場合、Javascript が最適なオプションです。
ユーザー名とパスワードの要求とともに、一意のランダム文字列を送信します。次に、javascript md5 ライブラリを使用して、ランダムな文字列とパスワードを組み合わせることにより、ハッシュ化されたパスワードを生成できます [pwhash = md5(randomstring+password)]。次に、javascript はhttp://SERVER/login.cgi?username=TheUsername&random=RANDOMSTRING&pwhash=0123456789abcdef0123456789abcdefへの呼び出しをインスタンス化します。
次に、サーバーは次の 2 つのことを行う必要があります。ランダムな文字列が以前に使用されたことがないかどうかを確認し、使用されている場合は、要求を拒否します。(セキュリティ上非常に重要です)
ユーザー名の平文パスワードを検索し、md5(randomstring+password) を実行します。それが、ユーザーが URL で pwhash として提供したものと一致する場合、それがユーザーであることがわかります。
ランダムな文字列が以前に使用されたことがあるかどうかを確認する理由は、繰り返し攻撃を止めるためです。誰かがネットワーク トラフィックやブラウザの履歴やログを見ることができれば、元のパスワードを知っているかどうかは関係なく、同じ URL を使用して再度ログインすることができます。
また、認証されたセッションがブラウザーまたは ISP の Web キャッシュに保存されないように、CGI スクリプトによって返されるヘッダーの先頭に「Pragma: no-cache」および「Cache-Control: no-cache」を配置することをお勧めします。 .
さらに安全なソリューションは、適切な暗号化とチャレンジ レスポンスを使用することです。サーバーにユーザー名を伝えると、サーバーはチャレンジ (パスワードで暗号化されたランダムな文字列) を送り返し、ランダムな文字列が何であったかをサーバーに伝えます。サーバーに伝えることができれば、明らかにあなたはパスワードを知っており、あなたが言うとおりの人物です! Kerberos はこの方法でそれを行いますが、あらゆる種類の攻撃を防ぐためにかなり慎重に行っています。
安全にログインすることは非常に主観的です。完全な「セキュリティ」を実現するのは簡単ではありません(可能であれば...議論の余地があります)。ただし、近づくことはできます。
POSTがオプションでない場合は、使用しているシステムに応じて、.htaccessやWindows認証などのディレクトリセキュリティ方式を使用できます。
上記の両方で、ユーザー名とパスワードを入力できるポップアップウィンドウが表示されます。
ログインクレデンシャルを送信するメソッドとしてPOSTを使用するには、method = "post"を含むHTMLフォームを使用し、$ _POST['varname']メソッドを使用してPHPまたはASPページなどから情報を取得します。 PHPの場合またはASPのrequest.form( "varname")メソッド。たとえば、PHPまたはASPページから、ユーザーのデータベースを検索して、そのユーザー名とパスワードの組み合わせが存在するかどうかを確認し、存在する場合は、適切なページにリダイレクトできます。
参考までに、HTML/ASP部分にはhttp://www.w3schools.com/ASP/showasp.asp?filename=demo_simpleformを使用してください