プロが教える店舗&オフィスのセキュリティ対策術

Ruby の Cookie 情報取得について質問です。「取得できるサイトとできないサイトの違い」と、「取得する方法」をご教授ください。

現在、以下のコードで Cookie の情報を取得するプログラムを作っています。


require 'net/http'

uri = URI.parse('http://www.google.co.jp')
http = Net::HTTP.new(uri.host)
http.start

response = http.get '/'
p response.get_fields('Set-Cookie')


上のコードのように "www.google.co.jp" などはちゃんと取得できるのですが、中には取得できないサイトもあります。
取得できない場合は、コマンドプロンプトに "nil" と表示されます。
例えば、 "http://auctions.yahoo.co.jp/" を Chrome ブラウザの EditCookie でみてみると、複数の Cookie を確認できます。
しかし上記のコードを試してみると、取得できません。

・この原因は何なのか
・解決方法("auctions.yahoo.co.jp" からの取得方法を知りたいわけではなく、取得できないサイト一般についての解決策)

この2点をご教授いただければ幸いです。

A 回答 (4件)

取得できるわけないでしょ。


仮に銀行のCookieを読み取れるってことは、そのURIを踏めば、
誰のでも自由に銀行口座を操作することが可能になるってことですよ。
Cookieの概念を理解するように。

http://detail.chiebukuro.yahoo.co.jp/qa/question …

そんなん読み取れたら脆弱性でブラウザに問題あり。

この回答への補足

説明足らずで申し訳ありません。
Cookie の情報というのは、他人のものではありません。

最終的にしたいことは、Cookie に指定した値を入力して送信したいということです。
そのためのとっかかり(Cookie の受信)ができないので困っています。

補足日時:2012/12/27 03:33
    • good
    • 0

実際に試してないので全く見当はずれかも知れませんが……。


auctions.yahoo.co.jpということでふと思ったのですが、それらのクッキーは、ひょっとしてHTTPSアクセスで利用されるのではありませんか。HTTPSアクセスでのクッキーにはSecure属性が設定され、HTTPからは見ることができなくなりますので。

この回答への補足

ご回答ありがとうございます。

HTTPS アクセス時は、 require 'net/https' を使用した別のコードが必要になるんですね。
色々調べることができました。ありがとうございます。

補足日時:2012/12/27 17:58
    • good
    • 0

えーと。

。。。
まだ説明が良くわからないのですが、RubyでProxyを作りたいのでしょうか?
これであれば答えは先ほどと同じでできないになります。

単純にauctions.yahoo.co.jpからCookieがないと言う質問であれば、
http://auctions.yahoo.co.jpにアクセスしてもCookieは発行されていないので、Nilが正解です。
この辺はFireFoxのLive HTTP HEADERSなどで生の情報を確認しましょう。

また、基本的にヤフオクなどはSSLで暗号化した通信を行うので、
HTTPで通信するだけでは機能的に実現できないことが多いです。
HTTPS通信を利用し、セッションのCookieの一時保管等が必要になるところもあります。
私も昔Perlで作ったことがありますが(証券系のWebサイトに自分のIDでログインし自動的に株価情報を取得し解析する)、ハードルは結構高いです。
少なくてもJavascriptでCookieの操作(IEのアドレスから動かすことが可能です。
たとえばjavascript:alert(document.cookie)とIEのアドレスに入れてみましょう。)、
HTTP_HEADERの解析、Cookieの解析とCookieの改造する知識。
この程度は自分でできるようにならないと厳しいですよ。

この回答への補足

当初したかったことは、下記サイトの内容です。

http://d.hatena.ne.jp/mzp/20070216/cookie

上記サイトのやり方で受信が可能なサイトと不可能なサイトがあるので、悩んでいたのです。
もっと言ってしまうと、下記サイトにアクセスし以下の流れを実行したかったのです。

http://www.cardbotmtgo.com/

このサイトはトレーディングカードの価格を表示するサイトです。

1.サイト内の Cookie "Deck" の値をこちらで設定(例えば Abandon Hope という名前のカードの値段を知りたい場合は "deck=Abandon%20Hope%28TE%23107%29" としたい)
2.こちらで設定した Cookie を送信
3.新たに取得したHTMLから、内容をスクレイピング

という感じです。
しかし FireFox の Live HTTP Headers 及び GoogleChrome の chrome://net-internals/ で調べたところ、このサイトも Set-Cookie がありませんでした。
その代わり、GET のところで "Cookie: listBox-setFilter=ALL%20SETS; listBox-rarityFilter=ALL%20RARITIES; deck=Abandon%20Hope%28TE%23107%29" という表示があったので、そこのところの処理を Ruby でうまくできないかと考えています。

再度質問の確認に戻りますが、知りたいことは

・Cookie は存在するのに Set-Cookie が存在しない意味
・Cookie を送信する方法

です。
mozomozo123さんが仰るように Ruby ではできないのであれば、他の言語で試してみたいと思います。
その際に最適の言語、それからお勧めの書籍を教えていただければ幸いです。

補足日時:2012/12/27 18:21
    • good
    • 0

ああ、なるほど。


私はこのサイトのソースを3分しか見ていないので
見落としがあるかもしれませんが、
このサイトはCookieをJavascriptで発行していますね。
ブラウザであればJavascriptが動作しますが、
Rubyでブラウザがわりのことをしようと思ったら、
Javascriptを独自に解析しないといけません。

この場合、セッションのキーがCookieで発行されていなければ、
そのままCookieで送っている情報をRubyで送ればOKなことが多いです。
Cookieの送信の仕方は、下記のサイトに記述があります。
http://d.hatena.ne.jp/mzp/20070216/cookie
    • good
    • 0
この回答へのお礼

仰るとおり、Javascript による Cookie の処理でした。
Ruby の Net::HTTP では動作しないためにこのような状況になったのですね。
Net::HTTP による Cookie の送信も効果がありませんでしたので、
Watir を利用して処理しようと思います。

色々勉強になりました。
ありがとうございます。

お礼日時:2012/12/30 00:41

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!