WEB相談室

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

タイトル:JavaScriptで得た情報をCGIへ

0:[投稿] manet [URL] [2004/01/06 23:30 ][環境:IE6 WinXP perl]

UserAgentをJavaScriptで取得して、それをCGIに送るアクセス解析を設置しようとしてます。CGIにデータを送ると、記号文字以降の文字が削除されるので、JavaScriptで記号文字をエスケープしてデータを渡そうと思ってます。しかし、JavaScriptで
<SCRIPT language=javascript>
<!--
中略

f1 = /"\("/g;
f2 = /"\)"/g;
ua = navigator.userAgent;
ua = ua.replace(f1, '%28');
ua = ua.replace(f2, '%29');

   document.write('<IMG src=http://cgi32.plala.or.jp/hir_/cgi-bin/access/ac.cgi?');
   document.write('namae=' + Name + '&from=' + From + '&befo=' + ref + '&OS=' + ua +' width=1 height=1>');
//--></SCRIPT>

のように、正規表現で「\(」のように組んでも

Mozzila/4.0

だけしか残らないのです。何がいけないのでしょうか。


1:[回答] バギンズ [2004/01/07 01:50 ]

余計なダブルコーテーションが原因

f1 = /"\("/g;
f2 = /"\)"/g;
   ↓
f1 = /\(/g;
f2 = /\)/g;


2:[質問] manet [URL] [2004/01/07 15:15 ]

有難うございます。でも、
ダブルクォーテーションを外してみましたができません。
JSファイルで、


seek=unescape(document.cookie);
Match = seek.match(/name::([^&]*)&from::([^&]*)&/);
if(seek.indexOf(/name::([^&]*)&/)){
 Name = RegExp.$1;
 if(Name == ''){
   Name = 'CookieOFF';
 }
}
if(seek.indexOf(/from::([^&]*)&/)){
 From = RegExp.$2;
}
eq = /=/g;
amp = /&/g;
ref = top.document.referrer;
ref = ref.replace(eq, '%3D');
ref = ref.replace(amp, '%26');

f1 = /\(/g;
f2 = /\)/g;
ua = navigator.userAgent;
ua = ua.replace(f1, '%28');
ua = ua.replace(f2, '%29');
 
if(Name != 'manet'){
   document.write('<IMG src=http://cgi32.plala.or.jp/hir_/cgi-bin/access/ac.cgi?');
   document.write('namae=' + Name + '&from=' + From + '&befo=' + ref + '&OS=' + ua +' width=1 height=1>');
}

このようなJavaScriptソースになっています。
CGIではエレメントの取得を

foreach $param(@in_params)
{
    ($key,$value) = split( /=/ ,$param);
    $value =~ tr/+/ /;
    $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack('C',hex($1) )/ge;
    &jcode'convert(*value, 'sjis');
    $param{$key} = $value;
}
$A2 = $param{'OS'};

このようにしています。
でもやはり、UAの取得だけはうまくいきません。括弧以降の文字が切れてしまいます。ソースにどこかおかしいところがあるのでしょうか??もし分かればご教授ください。


3:[回答] ROM-X [2004/01/07 17:29 ]

document.write('namae=' + Name + '&from=' + From + '&befo=' + ref + '&OS=' + ua +' width=1 height=1>');

は、

document.write('namae=' + Name + '&from=' + From + '&befo=' + ref + '&OS=' + ua +'\'' width=1 height=1>');

とか?


4:[回答] 通りすがり2004 [2004/01/07 18:30 ]

>>2
>$value =~ tr/+/ /;
が何の為にあるか考えてみませう。

つーわけで、半角スペースを+に置き換えてないからに一票。
ua = ua.replace(/ /g, '+');
とかしてみれば?(未検証)


5:[回答] 通りすがり2004 [2004/01/07 18:40 ]

>>4
ああ、まずった。 img 要素からだったら置換しないで

  document.write('<IMG "src=http://cgi32.plala.or.jp/hir_/cgi-bin/access/ac.cgi?');
  document.write('namae=' + Name + '&from=' + From + '&befo=' + ref + '&OS=' + ua +'" width=1 height=1>');

の方が良い気がする。


6:[回答] 通りすがり2004 [2004/01/07 18:41 ]

ああ、今度はダブルクォートの位置がおかしい。。。

> document.write('<IMG "src=http://cgi32.plala.or.jp/hir_/cgi-bin/access/ac.cgi?');
document.write('<IMG src="http://cgi32.plala.or.jp/hir_/cgi-bin/access/ac.cgi?');

ごめん。もう来ないね。


7:[完了] manet [2004/01/07 20:41 ]

なるほど、IMGで書くときのダブルクォーテーションが抜けてたのが原因だったのですね。ちゃんとできました。どうも有難うございました。


8:[完了] AC [2004/01/07 23:22 ]

完了していますが、まだ問題があります。
img要素のsrc属性の値はURIですが、URIは決まった文字しか使えません
(詳しくはRFC2396を参照)。

UserAgentは、スペース以外にも、どんな文字が入ってくるのか分からないので、
encodeしておく必要があります。Cookie由来のName,Fromや、Refererも同様。

document.write('namae=' + encodeURIComponent(Name)
+ '&from=' + encodeURIComponent(From)
+ '&befo=' + encodeURIComponent(ref)
+ '&OS=' + encodeURIComponent(ua)
+'" width=1 height=1>');
#IE5.5以上orN6以上限定。
#escape()を用いるのが一般的と思われるが、escape()はRFC2396非準拠で
#おかしなURLになるため、あえて使用しなかった。
なお、encodeURIComponent()はUTF-8でエンコードするので、
CGI側も変更が必要になる。
jcode.plはUTF-8を理解しないので、Jcode.pmなどを使う。


9:[完了] manet [URL] [2004/01/10 20:42 ]

そうですか。分かりました・やってみますね☆
有難うございました。

回答(必須): 状態:

お名前(必須):

e-mail:

URL:




[戻る]

ChaichanPAPA's World