質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Cookie

HTTPにおけるCookieとは、クライアントのウェブブラウザ上に保存された一時的なデータを指します。クライアント側のJavaScriptでも、サーバー側のHTTPヘッダーでもクッキーの読み書き・修正・削除が可能です。

CGI

CGI(Common Gateway Interface)とは、Webサーバー上でユーザプログラム動作させる仕組みのこと。また、動かす前提のプログラムをCGIと呼ぶこともあります。HTMLなどの静的な情報に限らず、プログラムの処理結果をベースにした動的情報の提供が可能です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

1回答

1090閲覧

CGI::Sessionでセッション管理を行っているサイトのCookie情報をC#で取得できずに困っています

ykcx

総合スコア1

Cookie

HTTPにおけるCookieとは、クライアントのウェブブラウザ上に保存された一時的なデータを指します。クライアント側のJavaScriptでも、サーバー側のHTTPヘッダーでもクッキーの読み書き・修正・削除が可能です。

CGI

CGI(Common Gateway Interface)とは、Webサーバー上でユーザプログラム動作させる仕組みのこと。また、動かす前提のプログラムをCGIと呼ぶこともあります。HTMLなどの静的な情報に限らず、プログラムの処理結果をベースにした動的情報の提供が可能です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

1クリップ

投稿2023/01/13 11:10

編集2023/01/18 02:12

前提

C#を使用したCookie認証が上手くいきません(C#初心者です)。

実現したいこと

(1)CGI::Sessionモジュールを使用したセッション管理を行っているサイト(https://www.kent-web.com/pwd/protect/enter.cgi)にIDとPWを入力する。IDとPWは共にguestです。
(2)レスポンスとして戻ってくるCookie情報をprotect.cgiに送ることで保護されたページの情報にアクセスする

発生している問題・エラーメッセージ

(1)でCookieContainerにCookie情報が格納されない為、(2)に進めません。アドバイスを頂きたくお願いします。

該当のソースコード

C#

1namespace ConsoleApplication1 2{ 3 public class Program 4 { 5 static void Main() 6 { 7 // WebRequestによるCookie認証 8 // POSTしてCookieContainerに書き込む 9 var data = Encoding.ASCII.GetBytes(string.Join("&", 10 new[] { "id=guest", "pw=guest" })); 11 var cookieContainer = new CookieContainer(); 12 var req = (HttpWebRequest)WebRequest.Create("https://www.kent-web.com/pwd/protect/enter.cgi"); 13 req.CookieContainer = cookieContainer; 14 req.Method = "POST"; 15 req.ContentType = "application/x-www-form-urlencoded"; 16 req.ContentLength = data.Length; 17 using (var stream = req.GetRequestStream()) 18 { 19 stream.Write(data, 0, data.Length); 20 } 21 var res = req.GetResponse(); // ここでCookieContainerに書き込まれる筈ですが、ダメです。 22 23 // 以下、そのCookieを使えばアクセス可能な筈ですが、、、。 24 var reqLog = (HttpWebRequest)WebRequest.Create("https://www.kent-web.com/pwd/protect/protect.cgi"); 25 reqLog.CookieContainer = cookieContainer; // CookieContainerセット 26 var resLog = reqLog.GetResponse(); 27 using (var stream = resLog.GetResponseStream()) 28 29 using (var sr = new StreamReader(stream, Encoding.GetEncoding("shift-jis"))) 30 { 31 Console.WriteLine(sr.ReadToEnd()); // アクセスできてるのを確認 32 } 33 34 } 35 } 36}

試したこと

https://neue.cc/2009/12/17_230.htmlを基に作成しました。
上記ページの他のやり方も試しましたが駄目でした。

補足情報(FW/ツールのバージョンなど)

Windows10の Visual Studio 2019 で.NET COREで実行できるアプリケーションを.NET 5.0で作成

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2023/01/13 12:09

リンクの設定がダメ、コードがインデントされてないところを直してください。
退会済みユーザー

退会済みユーザー

2023/01/13 12:10

何を何で作っているかを質問欄を編集して追記してください。(例: Windows 10 の Visual Studio 2022 で Windows Forms アプリをターゲットフレームワーク .NET Framework 4.8 で作っています・・・とか) ターゲットフレームワークというのは、Visual Studio のソリューションエクスプローラーでプロジェクト名を右クリックして出てくるメニューでプロパティを選んで表示すると「対象のフレームワーク (またはターゲットフレームワーク)」という項目があるので、それを見てください。
dodox86

2023/01/15 03:38

示されたURLについて、試しにcurlコマンドで以下のように実行してみると curl -i -X POST -d 'id=guest' -d 'pw=guest' https://www.kent-web.com/pwd/protect/enter.cgi HTTPレスポンスのヘッダー含め、以下のようなレスポンスが返ります。 ここから>>> HTTP/2 200 server: nginx date: Sun, 15 Jan 2023 03:29:43 GMT content-type: text/html; charset=shift_jis vary: Accept-Encoding <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html lang="ja"> <head> <meta http-equiv="content-type" content="text/html; charset=shift_jis"> <meta http-equiv="content-style-type" content="text/css"> <style type="text/css"> body,th,td { font-size: 13px; } table.passwd { margin-top: 80px; width: 400px; background: #0080c0; } td.ttl { padding: 10px; color: #fff; } td.input { padding: 10px; background: #fff; font-family: verdana,century,osaka; width: 100%; } input.len { width: 220px; } input.btn { font-family: verdana,century,osaka; width: 100px; height: 32px; } </style> <title>アクセス認証</title> </head> <body> <div align="center"> <form action="enter.cgi" method="post"> <table cellspacing="1" class="passwd"> <tr> <td class="ttl"><b>アクセス認証</b></td> <tr></tr> <td class="input"> USER ID :<br> <input type="text" name="id" class="len"><br><br> PASSWORD :<br> <input type="password" name="pw" class="len"><br><br> <div align="right"> <input type="submit" name="login" value="LOG IN" class="btn"> </div> </td> </tr> </table> </form> </div> <script language="javascript"> <!-- self.document.forms[0].id.focus(); //--> </script> <p align="center" style="margin-top:40px;font-size:10px;font-family:verdana,helvetica,arial,osaka;"> - <a href="http://www.kent-web.com/" target="_top">WebProtect</a> - </p> </body> </html> <<<ここまで Cookieの要素が無いですね。ブラウザでアクセスしたときにも出るログインフォームっぽいものです。Web APIの仕様が違っているか、そもそもアクセスの仕方が間違っているのではないでしょうか。(ヘッダーを見ると"HTTP/2"になっていますね) 仕様を再確認した方が良いと思います。
退会済みユーザー

退会済みユーザー

2023/01/15 04:12

> Cookieの要素が無いですね。 ブラウザで https://www.kent-web.com/pwd/protect/enter.cgi にアクセスして表示される画面で id, password を入力して[LOG IN]ボタンをクリックすると、302 応答とともに以下のクッキーが返ってきます。 Set-Cookie: CGISESSID=39846a7f83f0620147aedd1467902a6b;
dodox86

2023/01/15 04:36

WEBブラウザーで表示されるHTMLでsubmitするとフォームのパラメータに"login=LOG+IN"が追加されてますね。これが足りないようです。提示のコードがそういうWEBブラウザーでの動きを模倣する意図なのであれば、そういうことですね。 $ curl -i -X POST -d 'id=guest' -d 'pw=guest' -d "login=LOG+IN" https://www.kent-web.com/pwd/protect/enter.cgi HTTP/2 302 server: nginx date: Sun, 15 Jan 2023 04:32:53 GMT content-type: text/html; charset=iso-8859-1 content-length: 197 location: ./protect.cgi set-cookie: CGISESSID=86238bd34128675b503fd011384b446a; <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> <html><head> <title>302 Found</title> </head><body> <h1>Found</h1> <p>The document has moved <a href="./protect.cgi">here</a>.</p> </body></html>
ykcx

2023/01/15 12:56

回答が遅くなり申し訳ございません。 Windows10の Visual Studio 2019 で「.NET COREで実行できるアプリケーションを.NET 5.0」で作成しています(カッコ内は知識が及ばず、意味は分かっていません)。 また、dodox86様にご教示いただいた通り、"login=LOG+IN"を加えれば情報が取得できそうです。 誠にありがとうございます。
退会済みユーザー

退会済みユーザー

2023/01/16 01:28 編集

上の一番最初のコメントで依頼した「リンクの設定がダメ、コードがインデントされてないところを直してください」にきちんと対応してください。質問欄は後から編集できます。 上のあなたのレス、 > Windows10の Visual Studio 2019 で「.NET COREで実行できるアプリケーションを.NET 5.0」で作成しています は質問欄を編集して追記願います。ここコメント欄は元々質問への情報の追加の依頼の場です。初期画面では閉じているので見ない人が多々いるはずですので。
guest

回答1

0

ベストアンサー

上の質問へのコメント欄でのこちらのお願いに対し質問者さんが無言で、開発環境など不明ですが、.NET Framework の HttpWebRequest / HttpWebResponse で https://www.kent-web.com/pwd/protect/enter.cgi から送信されてくるクッキーを取得したいのだと理解してレスします。

質問の 2023/01/15 13:36 のコメントで dodox86 さんが書かれたように login=LOG+IN も送信しないとクッキーは送られてこないという仕様のようです。

というわけで、以下のようなコードで id=guest&pw=guest&login=LOG+IN を送信すれば良さそうです。

C#

1using System.IO; 2using System.Net; 3using System.Text; 4 5namespace ConsoleAppWebRequest 6{ 7 internal class Program 8 { 9 static void Main(string[] args) 10 { 11 var url = "https://www.kent-web.com/pwd/protect/enter.cgi"; 12 var req = (HttpWebRequest)WebRequest.Create(url); 13 var cookieContainer = new CookieContainer(); 14 req.CookieContainer = cookieContainer; 15 req.Method = "POST"; 16 req.ContentType = "application/x-www-form-urlencoded"; 17 string postData = "id=guest&pw=guest&login=LOG+IN"; 18 var data = Encoding.ASCII.GetBytes(postData); 19 req.ContentLength = data.Length; 20 21 using (Stream stream = req.GetRequestStream()) 22 { 23 stream.Write(data, 0, data.Length); 24 25 using (var res = (HttpWebResponse)req.GetResponse()) 26 { 27 CookieCollection cookies = cookieContainer.GetCookies(new System.Uri(url)); 28 } 29 } 30 } 31 } 32}

以下のようにクッキーが送信されてきます。

イメージ説明

結果は以下のようになります。

イメージ説明

投稿2023/01/15 07:36

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ykcx

2023/01/15 13:09

ありがとうございます。教えて頂いた方法で、CookieContainerにCookie情報が格納することができました! 引き続き、手元で、「(2)レスポンスとして戻ってくるCookie情報をprotect.cgiに送ることで保護されたページの情報にアクセスする」を試行錯誤します。
退会済みユーザー

退会済みユーザー

2023/01/15 13:58

(2) に関する問題で質問するなら、新たに別のスレッドを立てて質問願います。このスレッドはクローズしてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問