• 締切済み

下のCookieの質問に関しまして補足です その2

さらに調べていたのですが、どうやら登録されているURLのデータに「=」が含まれていると 上手くいかないことが解りました。 以下のスクリプトで保存及び抽出データに「=」が含まれていても上手く処理する方法は無いでしょうか。 #***************************************************************************** sub plink{ #パーソナルリンク &error("現在、パーソ\ナルリンクは使用出来ません。") if !($personallink); my ($a1,$a2,$a3,%temphash); for $a1(split(/; */,$ENV{'HTTP_COOKIE'})){ ($a2,$a3) = split(/=/,$a1); $a3 =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("C", hex($1))/eg; if ($a2 eq 'plink_list'){ foreach(split(/<>/,$a3)){ $temphash{$_}=1; } last; } } &filelock("linkdata"); open (IN,"$linkdata"); while(<IN>){ if ($temphash{(split(/<>/,$_))[15]}){ $totalct++; push(@site,$_) if ($totalct >= $startnum) && ($totalct <= $endnum); } } close (IN); &fileunlock("linkdata"); $endnum = $totalct if $totalct < $endnum; $startnum = 0 if $totalct == 0; $action = "パーソ\ナルリンク"; &searchbar("","<option value=\"\" selected>$searchtitle\n"); &databar(); if ($totalct != 0){ $resultmessage = "$totalct件のリンクが登録されています。<br /><br />"; &linkbar("act=$act&line=$line&indi=$indi"); &siteindicate("",@site); }else{ $resultmessage = "登録が無いか、クッキーが有効になっていません。<br /><br />"; $linkbar = $siteindicate = ""; } &html_output; } #***************************************************************************** sub plink_add{ #パーソナルリンク追加 &error("現在、パーソ\ナルリンクは使用出来ません。") if !($personallink); &get_cookie; $plink_list.=$url."<>" if $plink_list !~ /\Q$url\E/; &set_cookie; &searchbar("","<option value=\"\" selected>$searchtitle\n"); $linkbar = $siteindicate = ""; $action = "パーソ\ナルリンク追加"; $resultmessage = "<b>".&sitename_get."</b> をパーソ\ナルリンクに追加しました。<br />"; &html_output; } #***************************************************************************** sub get_cookie{ #クッキー取得 my ($a1,$a2,$a3); for $a1(split(/; */,$ENV{'HTTP_COOKIE'})){ ($a2,$a3) = split(/=/,$a1); $a3 =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("C", hex($1))/eg; if ($a2 eq 'plink_list'){ $plink_list = $a3; last; } } } #****************************************************************************** sub set_cookie{ #クッキー設定 $plist_link =~ s/(\W)/sprintf("%%%02X", unpack("C", $1))/eg; print "Set-Cookie:plink_list=$plink_list; expires=Thu, 1-Jan-2030 00:00:00 GMT;\n"; } #**************************************************************************** 宜しくお願い致します。

  • Perl
  • 回答数1
  • ありがとう数1

みんなの回答

  • kabaokaba
  • ベストアンサー率51% (724/1416)
回答No.1

サイトを運営するってなら 自分で保守すべきだと思うのだが・・・ >以下のスクリプトで保存及び抽出データに「=」が含まれていても上手く処理する方法は無いでしょうか。 みてわかるように,セットしたCookieが項目の区切りとして 「=」を使ってて,それを解読するのに「=」でsplitしてるから URLに「=」があれば誤動作するのは自然なこと. #ついでにいうとexpireの日付が決めうちなのも個人的には・・・ だから区切りにURLでは使わないものを使って それでsplitすればいいんでしょう. セットするCookieのデータ構造を考え直すしかないんでは?

das_horn
質問者

お礼

ご回答ありがとうございます。 その後、さらに調査していたのですが、登録URLデータに記号の「=」及び「&」が 含まれる場合に不具合が発生することが解りました。 取り敢えずの応急処置として、上記の場合にはパーソナルリンクを 使用できないようにして対応しました。 ありがとうございました。

関連するQ&A

  • 書き込んだばかりのcookieが読み込めません

    cookieを書込んだ直後、書込めたか(cookieをオフにしていたり、cookieを書込めない携帯端末からのアクセスかもしれないので)確認をしようと、cookieを読込もうとしたのですが、cookieが書込まれているにもかかわらず情報を取得することができません 実験環境として、htmlファイルにボタンを作って、cgiへ飛び、そのcgi内でcookieを書込み、cookieが書込めたかどうかで分岐して、表示するようにしています (cgiを一度実行したあと一旦ブラウザで前のhtmlファイルに戻って)cookieが既に書込まれた状態で、改めてhtmlファイルのボタンを押せばcookieは読込めますが、最初にcookieを書込んだ時に同じcgi内で即読込みを行ったら読込めません 書込が完結する前に読込みに行っているから読込めないのかとも思い、読込み前にタイムラグを作っても見ましたがやはり読込めません どうすれば書込み直後に読み込めるのでしょうか? 色々ネットで調べても見ましたが、いっこうに解決策が見つかりません ご存じの方ぜひご教授下さい よろしくお願いします なお、下にperlのコードを書いておきます #クッキーを書込 $test{sid} = "12345"; &set_cookie($test{sid}); #タイムラグ use Time::HiRes; Time::HiRes::sleep(0.8); #クッキーを読込 ($cookie{test}) = &get_cookie; if(!$cookie{test}){ print "読み込めてない"; } else{ print "読み込めた"; } ######→読み込めません##### #クッキー書込sub sub set_cookie { local(@cook) = @_; local($gmt, $cook, @t, @m, @w); @t = gmtime(time + 2*60*60); @m = ('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'); @w = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat'); $gmt = sprintf("%s, %02d-%s-%04d %02d:%02d:%02d GMT", $w[$t[6]], $t[3], $m[$t[4]], $t[5]+1900, $t[2], $t[1], $t[0]); foreach (@cook) { s/(\W)/sprintf("%%%02X", unpack("C", $1))/eg; $cook .= "$_<>"; } print "Set-Cookie: SID=$cook; expires=$gmt; path=/;\n"; } #クッキー読込sub sub get_cookie { local($key, $val, *cook); $cook = $ENV{'HTTP_COOKIE'}; foreach ( split(/;/, $cook) ) { ($key, $val) = split(/=/); $key =~ s/\s//g; $cook{$key} = $val; } foreach ( split(/<>/, $cook{'SID'}) ) { s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("C", hex($1))/eg; push(@cook,$_); } return (@cook); }

    • ベストアンサー
    • Perl
  • perlの文法について

    はじめましてstaraman_sです。 今はPerl/CGI辞典という本を使いながらPerlの勉強をしていますが、インターネットで検索しても解決できず困っています。 皆さんのお力をお貸しください。 疑問点 sub getCookie { my ($tmp, $name, $value); for $tmp (split(/; */, $ENV{'HTTP_COOKIE'})) { ($name, $value) = split(/=/, $tmp); $value =~ s/\%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg; $COOKIE{$name} = $value; } } 本の中の掲示板のプログラムの中に上記のようなプログラムが書いてあるのですが、最後の方に$COOKIE{$name} = $value;とあります。変数$COOKIEの後に中括弧を使い{$name}と書いているのは、どういった文法からきているのでしょうか。 よろしくお願いいたします。

    • ベストアンサー
    • CGI
  • 複数のcookieでの保存

    javescriptはかなりの初心者です。 サイトや本のサンプルで勉強してテキストボックス、チェックボタン、 ラジオボタンに記入した内容を保存するcookieの作成を試みたのですが 上手くいきません;; どなたかご教授よろしくお願いします。 やりたい事はフォームに記入・チェックした内容をセレクトボタン 「保存1」「保存2」・・・と選択したら、それぞれにセーブ・ロードを複数記憶させたいと思っています。 5つほどの記憶を予定しています。 実際に保存させるフォーム数は数十個以上あり、テキストボックスの記入内容は数字だけの予定です。 また、それらは別途の計算するスクリプトでの入力内容として使っています。(競合とかの問題もあるのでしょうか?) なお、下記の状態でもラジオボタンだけは保存も出来ませんでした; 作成したものを載せましたが、なにぶん初心者の作成したscriptな だけに役に立たない構文で、説明不足もあるかもしれませんがよろしくお願いします。 <HTML> <HEAD> <script language="JavaScript"> <!-- function set_cookie(){ var a = document.getElementById('myform').a.value; var b = document.getElementById('myform').b.selectedIndex; var c = document.getElementById('myform').c.selectedIndex; var d = document.getElementById('myform').d.checked; var e = document.getElementById('myform').e[0].checked; var f = document.getElementById('myform').e[1].checked; EXP=new Date(); EXP.setTime(EXP.getTime()+(30*1000*60*60*24)); document.cookie= a+"["+b+"["+c+"["+d+"["+e+"["+f+"["+";expires="+EXP.toGMTString(); } function get_cookie(){ var GET=document.cookie; GET=GET.split("["); document.getElementById('myform').a.value = GET[0]; document.getElementById('myform').b.selectedIndex = GET[1]; document.getElementById('myform').c.selectedIndex = GET[2]; document.getElementById('myform').d.checked = GET[3]; document.getElementById('myform').e[0].checked = GET[4]; document.getElementById('myform').e[1].checked = GET[5]; } --> </script> </HEAD> <BODY> <form id="myForm">テキスト1<BR> <INPUT size="20" type="text" maxlength="10" value="0" name="a"><BR> <BR> セレクト1<BR> <SELECT size="2" name="b"> <OPTION value="0" selected>0</OPTION> <OPTION value="1">1</OPTION> <OPTION value="2">2</OPTION> <OPTION value="3">3</OPTION> <OPTION value="4">4</OPTION> <OPTION value="5">5</OPTION> </SELECT><BR> <BR> セレクト2<BR> <SELECT name="c"> <OPTION value="0" selected>0</OPTION> <OPTION value="1">1</OPTION> <OPTION value="2">2</OPTION> <OPTION value="3">3</OPTION> <OPTION value="4">4</OPTION> <OPTION value="5">5</OPTION> </SELECT><BR> <BR> チェック1<BR> <INPUT type="checkbox" name="d" value="0"><BR> <BR> ラジオ1<BR> <INPUT type="radio" name="e" value="0"><BR> <INPUT type="radio" name="e" value="1"><BR> <BR> <BR> <SELECT name="selectsave"> <OPTION selected>保存1</OPTION> <OPTION>保存2</OPTION> <OPTION>保存3</OPTION> <OPTION>保存4</OPTION> <OPTION>保存5</OPTION> </SELECT><BR> <BR> <INPUT type="button" value="セーブ" name="save" onclick="set_cookie()"> <P><INPUT type="button" value="ロード" name="lord" onclick="get_cookie()"><BR> </P> </form> </BODY> </HTML>

  • PHPでのCookie

    PHPでクッキーを使い、下記のような入力フォームを作りました。 form.phpで入力→form2.phpで正常出力出来るのですが、 form2.phpで一度更新しないと、結果が画面に表示されません。 これをform2.phpを開いた時点で表示されるようにするには、どのように書けばいいのでしょう。 後1つあります。form.phpで 「テスト&1」と書くと「テスト」としか表示されなく、&とそれ以降が記憶されません。 これはなぜでしょうか? お願いします。 【form.php】 <?PHP parse_str($_COOKIE["city"]); parse_str($_COOKIE["city_name"]); ?> <html> <form method="post" action="form2.php"> <?PHP echo "名前1<input type=text name=name1 maxlength=16 size=12 value=$set_name1> <BR>ID<input type=text name=p1 maxlength=8 size=6 value=$set1><BR><BR>"; echo "名前2<input type=text name=name2 maxlength=16 size=12 value=$set_name2> <BR>ID<input type=text name=p2 maxlength=8 size=6 value=$set2>"; ?> <input type="submit" value="実行"> </form> </html> 【form2.php】 <?php if ($_POST) { $city1 = $_POST["p1"]; $city2 = $_POST["p2"]; $city_name1 = $_POST["name1"]; $city_name2 = $_POST["name2"]; setcookie ("city", "set1=$city1&set2=$city2",time()+3600*24*90); setcookie ("city_name", "set_name1=$city_name1&set_name2=$city_name2",time()+3600*24*90); } parse_str($_COOKIE["city"]); parse_str($_COOKIE["city_name"]); echo $set_name1; echo $set1; echo $set_name2; echo $set2; ?>

    • ベストアンサー
    • PHP
  • クッキー書き込みが正常に行われない?

    http://oshiete1.goo.ne.jp/kotaeru.php3?q=394703 を質問していたものです。 1.フォームで名前を入力 2.1の情報をクッキーに書き込み ということをやりたいのです。 (応用いたしますが、基本はこれです。) 1つ目のcgiで、フォームで名前を入力。 -----1.cgi-------------------- #!/usr/local/bin/perl print "Content-type:text/html\n\n"; print "<form method=post action=2.cgi>\n"; print "<input type=text name=name></input><BR>\n"; print "<input type=submit value=ok></input><BR>\n"; print "</form>\n"; exit; ------------------------------ 1.cgiの名前のデータを呼び込もうとしてもエラーになる。 -----2.cgi-------------------- #!/usr/local/bin/perl read(STDIN,$atai,$ENV{'content_length'}); ($key, $value) = split(/=/, $atai); $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; print &setCookie("name",$value); print "Content-type:text/html\n\n"; print "名前:<FONT COLOR=RED>",$value,"</FONT>と送信されました。<br>\n"; #Cookie書き込み。 sub setCookie{ local($tmp,$val); $val = $_[1]; $val =~ s/(\W)/sprintg("%%%02X",unpack("C",$1))/eg; $tmp="Set-Cookie: "; $tmp .="$_[0]=$val; "; $tmp .="expires=Thu, 1-Jan-2030 00:00:00 GMT;\n"; return($tmp); } ------------------------------ クッキー書き込みをしないで実行すると、きちんと名前が表示されます。 どこをなおせばきちんとクッキーにセットされるのでしょうか? 何度も申し訳ありませんがよろしくお願いします。

    • ベストアンサー
    • CGI
  • GETパラメータ

    こんにちは CGI初心者です。 http://www.perl-labo.org/formdata/getmethod/get.cgi?日本語 この様に、日本語のGETパラメータを取得したいです。 http://www.perl-labo.org/formdata/jpname/ を参考にしました。 【記述】 #!C:/Perl/bin/perl package plab; sub getformdata { local $rawdata; local %formdata; local @inputs; local($input, $name, $val); if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $rawdata, $ENV{'CONTENT_LENGTH'}); } elsif ($ENV{'REQUEST_METHOD'} eq "GET") { $rawdata = $ENV{'QUERY_STRING'}; } @inputs = split('&', $rawdata); foreach $input (@inputs) { ($name, $val) = split('=', $input); $name =~ tr/+/ /; $val =~ tr/+/ /; $name =~ s/%([A-Fa-f0-9][A-Fa-f0-9])/pack("C", hex($1))/eg; $val =~ s/%([A-Fa-f0-9][A-Fa-f0-9])/pack("C", hex($1))/eg; $formdata{$name} = $val; } return %formdata; } 1; 実行するとサーバーエラーになってしまいます。 パスは「#!C:/Perl/bin/perl」で合っています。 記述方法のミスでしょうか? 教えて下さい!

    • 締切済み
    • CGI
  • SELECTの選択状態を、複数のVALUE要素の一部を使ってCookie保存したい

    1つの選択に複数のvalue値を持つSELECTで、 選択状態をCookieに保存しているのですが、 保存した後に、諸般の事情でSELECTに設定してあるvalueの値を変更(修正)しなければならないことがあります。 しかしそうすると、Cookieを読み込んだとき保存データとSELECTが照合出来なくなり選択状態を再現できません。 そこで、valueで持たせている数値のうち1ヶ所を連番にして、 そこだけ照合して読み込みできないかと思い立ちました。 v[1] = o.b.value.split(',')[3]; などとして、value値の一つを抜き出して保存するところまでは出来たのですが、 それをCookieから読み込んでも、複数のvalueの値の1ヶ所を選んで照合する方法がわかりません。 そもそも可能なのかもわからないのですが・・何か良い方法はないでしょうか?。 サンプルをHTML化してアップローダに置いたもの http://kissho.xii.jp/1/src/1jyou57011.html <HTML> <BODY> <form id="myform"> <BR> セレクト1 <SELECT name="a"> <OPTION value="0,00,000,a00" selected>0</OPTION> <OPTION value="1,11,111,a01">1</OPTION> <OPTION value="2,22,222,a02">2</OPTION> <OPTION value="3,33,333,a03">3</OPTION> <OPTION value="4,44,444,a04">4</OPTION> <OPTION value="5,55,555,a05">5</OPTION> </SELECT> ← valueをまとめて保存。Cookieから読み込み選択状態の再現も可能。<BR> <BR> セレクト2 <SELECT name="b"> <OPTION value="0,00,000,b00" selected>0</OPTION> <OPTION value="1,11,111,b01">1</OPTION> <OPTION value="2,22,222,b02">2</OPTION> <OPTION value="3,33,333,b03">3</OPTION> <OPTION value="4,44,444,b04">4</OPTION> <OPTION value="5,55,555,b05">5</OPTION> </SELECT> ← 「,」で分離してvalue[3]のみ保存。読み込みで選択状態の再現まではできず。<BR> <BR> 保存番号 <SELECT size="3" name="selectsave"> <OPTION value="v1" selected>保存1</OPTION> <OPTION value="v2" >保存2</OPTION> <OPTION value="v3" >保存3</OPTION> </SELECT><BR> <BR> <INPUT type="button" value="セーブ" name="save" onclick="set_cookie()">  <INPUT type="button" value="ロード" name="lord" onclick="get_cookie()">  <input type="reset" value="リセット"> </form> Cookieデータ表示<br><input type="text" size="50" id="sample"> <script language="JavaScript"> function set_cookie(){ o=document.getElementById('myform'); var v =[]; v[0] = o.a.value; v[1] = o.b.value.split(',')[3]; //「,」で分離して[3]のみ保存 saveCookie( o.selectsave.value, v.join('/'),30); document.getElementById('sample').value=v.join('/'); } function get_cookie(){ var o=document.getElementById('myform'); var GET=loadCookie(o.selectsave.value).split('/'); document.getElementById('sample').value=loadCookie(o.selectsave.value);//sapmle setvalue(document.getElementById('myform').a, GET[0]); setvalue(document.getElementById('myform').b, GET[1]); } function setvalue(o,v){ for(i=0;i<o.length;i++) if(o[i].value==v) o[i].selected=true; } function saveCookie( vn, v, dy ){ if(navigator.cookieEnabled) document.cookie = vn+ '='+ v+ ';expires='+ new Date((new Date()).getTime()+dy*24*3600000).toGMTString(); } function loadCookie(vn){ var rt=''; if( vn && document.cookie ) { var v = document.cookie.split(';'); for(i in v){ v[i].match(/^\s*(.*)=(.*)$/); if( RegExp.$1 == vn) { rt = RegExp.$2; break; } } } return rt; } </script> </BODY> </HTML>

  • クッキーの保存と確認をしようとしたら

    すみません質問です。 クッキーの保存と確認をするスクリプトを組んだのですが、 保存ボタンを押したらscriptエラーが出てしまいます。 エラーの内容は-------------------------- ライン:1 文字:1 オブジェクトを指定してください。 ---------------------------------------- というものです。 以下のソースのどこに問題があるのでしょうか。 スクリプトが間違っているのなら直そうと思うのですが、 <script>~</script>を消去してもエラーになってしまいます。 お暇な人、教えてください。お願いします。 <html> <head> <title>COOKIE TEST</title> <script language=javascript> function set_c(key){ document.cookie = "dest=" + key ; } function get_c(c_Name){ c_Name += "="; theCookie = document.cookie + ";"; start = theCookie.indexOf(c_Name); if (start != -1){ end = theCookie.indexOf(,";",start); return unescape(theCookie.substring(start + c_Name.length, end)); } return false; } function conf_c(){ get_c(dest); alert(document.cookie.sousin); } function conf_c2(){ alert(document.cookie); } </script> </head> <body> <a href="javascript:set_c('http://www.yahoo.co.jp');">クッキー保存</a><br><br> <a href="javascript:conf_c();">クッキー確認</a><br><br> <a href="javascript:conf_c2();">クッキー確認2</a> </body> </html>

  • safariで買い物かごに残らない

    ある買い物カゴCGIを使用していますがsafariだと日本語表記の商品だけ買い物カゴに入れても残りません。 次の買い物をしたり買い物カゴを確認した時に入っていません。英数表記の商品は大丈夫です。 CGIそのものが古いので替えるのがベストなんですが、諸事情により当面これを使用しなければいけないので何とか御教授お願い致します。 多分下記の部分が問題だと思うのですがCGIなどは全くの素人なので分かりやすくお願い致します。 *********************************************************** if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'}); } else { $buffer = $ENV{'QUERY_STRING'}; } @pairs = split(/&/,$buffer); foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); $name =~ tr/+/ /; $name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; # 記録するデータはsjisに統一する &jcode'convert(*name,'sjis'); &jcode'convert(*value,'sjis'); $value =~ s/</&lt;/g; $value =~ s/>/&gt;/g; $value =~ s/://g; $value =~ s/,//g; $FORM{$name} = $value; } $soryo = $FORM{$soryo}; #--------# $cookies = $ENV{'HTTP_COOKIE'}; @cookie_pairs = split(/;/,$cookies); foreach $cookie_pair (@cookie_pairs) { ($name, $value) = split(/=/, $cookie_pair); $name =~ s/ //g; $DUMMY{$name} = $value; } $goods_next = 0; foreach $goods_num (1 .. $#cookie_pairs + 1) { $cookie_name = 'CARGO_'.$goods_num; if ($DUMMY{$cookie_name} =~ /^goods:/ || $DUMMY{$cookie_name} =~ /^removed/) { $GOODS[$goods_num] = $DUMMY{$cookie_name}; $goods_next = $goods_num + 1; } } #--------# ***********************************************************

    • ベストアンサー
    • CGI
  • クッキー読み込むと漢字文字列が文字化け、対策は?

    クッキーに漢字文字列 $c_inputwords を書き込んだ場合、cookie ファイルには正しく書き込まれているのですが、読み込むと文字化けしてしまいます。 エンコード、デコードしてもうまく行きません。やり方がたぶん間違っているのだと思いますので、どなたか正しい書き方・読み方を教えて下さい。 本にはApache2 とWin の間だけで発生するトラブル、と書かれていました。 ##### クッキー読み込み ########## @pairs = split(/\;/,$ENV{'HTTP_COOKIE'}); foreach $pair(@pairs) { ($cname, $hisITEMs, $fSizeData, $stichwort, $dic_current, $mojiZOOM, $c_inputwords ) = split(/\=/,$pair); $cname =~ s/ //g; $fSizeData =~ s/ //g; $dic_current =~ s/ //g; $c_inputwords =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("C", hex($1))/eg; ## デコード } ####### クッキー書き込み準備 ########## $c_inputwords =~ s/(\w)/sprintf("%%%02X", unpack("C", $1))/eg; ## エンコード $c_line = $hisITEMs . "\=" . $fSizeData . "\=" . $stichwort . "\=" . $dic_current . "\=" . $mojiZOOM . "\=". $c_inputwords; $c_line = "KDIC=$c_line\; expires=Wednesday, 1-Jan-2020 00:00:00 GMT"; ###################################### print <<EOD; Content-type: text/html; charset=sjis-jp; Set-Cookie: $c_line <HTML><HEAD> --- --- EOD

    • ベストアンサー
    • Perl

専門家に質問してみよう