WEB相談室

Webページ作成に関しての何でも掲示板です。

タイトル:クッキーOFFの方を制限する

0:[投稿] kougamiteru [2002/03/27 19:28 ][環境:WIN+IE UNIX系+Perl]

こんにちは。
COOKIE機能をブラウザでOFFにしている方に、CGI(Perl)スクリプトページを表示する際エラーを出したいのですが、

$cookie = $ENV{'HTTP_COOKIE'};
if(!$cookie) { &error; }

こうじゃないですよね。どうすればできますか?
Javascriptでは
function checkCookie(key){
    setCookie(key,'ok');
    window.open("./testcookie.htm","testCookie","width=400,height=250");
}

function setCookie(key, val, tmp) {
   tmp = key + "=" + escape(val) + "; ";
   //tmp += "path=" + location.pathname + "; ";
   //tmp += "expires=Fri, 31-Dec-2030 23:59:59; ";
   document.cookie = tmp;
}
<input type="button" value="Cookieが有効か調べる" onClick="checkCookie('TEST')">

こんな感じのものをいくつか見つけることができましたが、JavascriptではなくCGIで分岐(排除)させたいのです。
使い道は、一応1日1回しかできないおみくじゲームを設置することです。
ちなみに「クッキーOFF排除は邪道」とかそう言ったもめ事は避けたいのでそこのところよろしくお願いします。


1:[回答] えび [2002/03/27 19:46 ]

 邪道うんぬん以前にはっきり言ってムリです。
 CGI が受け取れる情報(HTTP要求ヘッダ)からは Cookie が有効か否か判断することはできませんし、他の方法で判断することもできません。

 実際に Set-Cookie フィールドを出力し、その後にリクエストされたときに Cookie が送られてきているかどうかを見て、そこで初めて判明します。初回に判定することは(CGIだけでは)不可能です。


2:[回答] えび [2002/03/27 19:49 ]

 とは言え【謎】、要は初回でムリというだけなのですから、

・初回では Location と Cookie を出力する
・Location のリダイレクト先に本体【謎】があり、Cookie が送られてきていなければ排除する

 という方法を使えばそれなりにそれなりな事は可能です。


3:[回答] ヨシミ [2002/03/27 19:50 ]

$cookiestr = 'xyopsgrlg';
print "Set-Cookie: cookieon=$cookiestr \n";

みたいにして一度クッキーを書きます。

で、その後
unless ($ENV{'HTTP_COOKIE'} =~ /$cookiestr/i) { &error;}
とかすれば良いかと思います。


4:[回答] kougamiteru [2002/03/27 19:59 ]

ありがとうございます。>えびさんヨシミちゃんさん

http://www.breeders-club.com/
ここの「ぶりくらちゃりてぃーおーくしょん【謎】」の「チャリティーブース」というところにクッキーOFFで入ろうとするとエラーが出ますが、これもその類でしょうか。
もちろん、かぶとむしもクワガタも私の趣味ではありません。

いろいろと教えていただきありがとうございます。
早速実践します。



5:[完了] kougamiteru [2002/03/27 20:19 ]

http://www.panpukin98.ne.jp/
ここの「掲示板」というリンクをクリックする先がクッキー分岐されている様子。よくできていますがやっふぁりJavascriptですね。


6:[質問] るうら [2002/03/30 05:34 ]

すいません、ぼくも最近同じような問題で悩んでいたのですが、
例えばアクセス解析のCGIBOYの解析ページでは
非常にスムーズにオンオフの判断ができてるようですが、
これなんかもやっぱりLocationで飛ばしてるんでしょうかねえ。
ちょっと見て欲しいです。↓サンプルのページ
http://ax4.cgiboy.com/vip/autologin.cgi?id=0300001&passwd=testtest&flash=2

あと、kougamiteruさんは最終的にどういう方法にしましたか?
参考にぜひ聞きたいです。


7:[回答] ふじ [URL] [2002/03/30 14:28 ]

$ telnet ax4.cgiboy.com 80
GET /vip/autologin.cgi?id=0300001&passwd=testtest&flash=2 HTTP/1.0

HTTP/1.1 200 OK
Date: Sat, 30 Mar 2002 06:07:09 GMT
Server: Apache/1.3.23 (Unix)
Cache-Control: no-cache
Content-Language: ja
Pragma: no-cache
Set-Cookie: 0300001=testtest;
Set-Cookie: mode=2;
Set-Cookie: mine=0000000000;
Connection: close
Content-Type: text/html; charset=Shift_JIS

<html><head><META HTTP-EQUIV="Refresh" CONTENT="0;URL=analyzer.cgi?0300001"></head></html>


metaタグで飛ばしてるようです。
# しかし、この id と passwd は公開してしまっていいものなのかしらん。


8:[回答] るうら [2002/03/30 19:19 ]

うむう、なるほど、そういう調べ方があるんですねえ。
勉強になります、ありがとうございます。

ちなみにそのページはcgiboyのアクセス解析サービスの
サンプルなので問題ないと思いますよう。


9:[回答] tote [2002/03/31 23:13 ]

ところでgoogleなどのロボットはクッキーを食べることができるんでしょうか。
食べられない場合はエラーページしか拾ってくれませんが・・・。


10:[回答] えび [2002/04/01 13:17 ]

>>6
見事に真っ白な画面が出て終了ですね【謎】。

>>9
食べないと思いますが……。


11:[回答] kougamiteru [2002/04/03 13:26 ]

> あと、kougamiteruさんは最終的にどういう方法にしましたか?
> 参考にぜひ聞きたいです。

およびがかかったようで・・
時間的にまだ完成していないのですが、現在のところえびさんの

> ・初回では Location と Cookie を出力する
> ・Location のリダイレクト先に本体【謎】があり、Cookie が送られてきていなければ排除する
> という方法を使えばそれなりにそれなりな事は可能です。

を参考にヨシミさんの

> $cookiestr = 'xyopsgrlg';
> print "Set-Cookie: cookieon=$cookiestr \n";
> みたいにして一度クッキーを書きます。
> で、その後
> unless ($ENV{'HTTP_COOKIE'} =~ /$cookiestr/i) { &error;}
> とかすれば良いかと思います。

方向にいじって行こうとしています【謎】。

現在の状況。
HTMLのindex.htmlにボタンがあり、それを押すとおみくじするtest.cgiへ飛ぶ。index.htmlではcookieをセットせず、test.cgiでセットしている。
test.cgiでは早速HTMLを吐き、そこへcookieをセットする。そこからlocationで当cgiへ飛ばし、cookieがなければエラーという風にしています。
cookieがonになっていればOKですが、処理上二度書くことにはなるでしょう。でも同じことを書けばいいかと思っています。

どうでしょうか・・


12:[回答] kougamiteru [2002/04/03 15:42 ]

現在の状況2。
う〜ん、2段階のせいで、HTMLのフォーム(あったんです)からのデータが届いていない・・・
locationでデータを受け渡すのをどうしよう。。
submitでの送信だったらhiddenで済むのですが。
しょうがないからcookieに入れてしまおうか。
困ってしまいました。


13:[回答] kougamiteru [2002/04/03 18:47 ]

cookieへ入れるとして
print "Set-Cookie: USER=user; a=$a; b=$b; expires=$date\n";

こんな感じで(勝手に)入れていいんでしょうか。
どうもその後が取り出せなくて・・
もしかして、$aや$bは半角英数字限定でしょうか。


14:[回答] kougamiteru [2002/04/03 20:07 ]

あ、クッキーひとつに、自由にできるデータのセットは、ひとつだけなんですね!
つまり上記の場合はUSER=userのみが保存されると。
それ以外はexpiresなど規格通りの内容しか保存できないと。
(ここまでは合ってますか?)
それでは、もうひとつ個人データを保存したいときはどうするのですか?


15:[完了] kougamiteru [2002/04/03 20:21 ]

なるほど!set-cookieを複数に分けて記述すればいいのですね!

解決しました(T T)お騒がせしました。


16:[完了] るうら [2002/04/05 11:47 ]

なるほどそうですか。
ぼくはLocationがうまく機能しなかったので
METAタグつかって飛ばすことにしました。
さほど変わりませんが・・・。


17:[完了] ヨシミ [2002/04/05 13:10 ]

>>14
> あ、クッキーひとつに、自由にできるデータのセットは、ひとつだけなんですね!
そんなことない。ただセミコロンで区切らずにカンマとかにしてみよ。


18:[完了] kougamiteru [2002/04/05 17:50 ]

> そんなことない。ただセミコロンで区切らずにカンマとかにしてみよ。

print "Set-Cookie: are=$are; expires=$date\n";
print "Set-Cookie: tabe=$tabe; expires=$date\n";
print "Set-Cookie: tai=$tai; expires=$date\n";

print "Set-Cookie: are=$are,tabe=$tabe,tai=$tai; expires=$date\n";

というふうにでしょうか。
ちなみにいくつに分けてもcookiesディレクトリではひとつのファイルにおさまってるんですね^^


19:[完了] ヨシミ [2002/04/05 18:02 ]

>>18
違う。
print "Set-Cookie: USER=user; a=$a; b=$b; expires=$date\n";

print "Set-Cookie: USER=user, a=$a, b=$b;expires=$date\n";
みたいにする。


20:[完了] kougamiteru [2002/04/05 18:17 ]

なるほど〜。それでクッキーに記録されなかったんだ。。
結局複数に分けて記述するということで納得してしまっていましたが、誤ったことを憶えてしまうところでした。ありがとうございます。

回答(必須): 状態:

お名前(必須):

e-mail:

URL:




[戻る]

ChaichanPAPA's World