Perlで作ったCGI、NetScape上の動作で悩んでおります。

[上に] [前に] [次に]
きょし [E-Mail] 2000/04/05(水) 11:13:33
先日、DMさんに以下のようなことを教えていただきました。

・NetScapeでは フォームで
 action=filename?get_string をサポートしていない

さらに下のような対応も教えていただきました。

<FORM ACTION=\"./test.cgi?$FileName\" METHOD=POST>
という記述でなく
<FORM ACTION=\"./test.cgi\" METHOD=POST>
<INPUT TYPE=HIDDEN NAME=\"FileName\" VALUE=\"$FileName\">
とする

この記述法で全く問題なくNetScapeでも使用できました。

しかし今度は
<FORM ACTION=\"./test.cgi?$FileName\" METHOD=POST>
ではなく
<A HREF=\"./test.cgi?$FileName\" METHOD=POST>
と指定しようとしてつまづいてしまいました。

<A HREF=\"./test.cgi\" METHOD=POST>
<INPUT TYPE=HIDDEN NAME=\"$FileName\" VALUE=\"$FileName\">
では、もちろんFileNameは渡ってくれませんでした。

何か良い方法は無いでしょうか。
しつこくて申し訳ないのですが、
ご存知の方、ご教授お願い致します。

ジャズ 2000/04/05(水) 11:19:22
A要素はリンクを張るために使います。
フォームの送信はJavascriptと組み合わせないとできません。

aaa 2000/04/05(水) 12:42:36
>・NetScapeでは フォームで
> action=filename?get_string をサポートしていない
本当ですか?
CGI側で処理していないだけでは?

<A HREF=\"./test.cgi?$FileName\">だけで行けませんか?
(AタグからのMETHODはGETオンリーです。)

きょし 2000/04/05(水) 13:05:08
ジャズさん、aaaさん、ありがとうございます。
AタグはGETオンリーでしたか。

<A HREF=\"./test.cgi?$FileName\">
と記述すると、IEではうまくいくのですが、
NetScapeではerror404となってしまいます。

$FileNameが
[./../../../../test/test01/test2/test.dat]
のように長いのですが、そこに原因があるのでしょうか。
何か対策があれば教えていただきたいのですが・・・

H&A 2000/04/05(水) 13:25:53
> <A HREF=\"./test.cgi?$FileName\">
> と記述すると、IEではうまくいくのですが、
> NetScapeではerror404となってしまいます。

おそらく、URI の query 部を正しく解釈できないか、「ユーザが間違った指定をしてもできるだけ親切に処理してあげよう」という動作の副作用だと思います。
URI の文法的には query に "/" "." などの文字を含むこともできるので、きょしさんの指定には間違いはないでしょう。

対策としては、$FileName をエスケープ("URL エンコード")してしまう方法が考えられますね。

きょし 2000/04/05(水) 13:42:39
H&Aさん、ありがとうございます。大変勉強になっております。
でも、「URLエンコード」の具体的な方法がわからず、
難儀しております。

また、実際CGIに渡す値は$FileNameだけではなく、その後に
ずらずらと続くのですが、
「URLエンコード」が対策として有効でしょうか。

初心者的な質問ばかりで申し訳ないのですが、
再度よろしくお願い致します。

aaa 2000/04/05(水) 13:45:03
>[./../../../../test/test01/test2/test.dat]
>のように長いのですが、そこに原因があるのでしょうか。

そうみたい!?
以下をみてみてください。
../200004/00040066.htm

たれ 2000/04/05(水) 13:45:25
>「URLエンコード」が対策として有効でしょうか。

バグの原因となり得る物は極力つぶしておいたほうが
いいですよ〜。

エンコードについては
http://www.tohoho-web.com/wwwcgi3.htm#CgiEncode

あたりに書いてあります。

きょし 2000/04/05(水) 15:14:19
aaaさん、たれさん、ありがとうございます。
エンコードのページも参考になりました。
試験的に手入力でエンコードした文字列を渡した所、
やっとNetScapeでも正常な結果が得られました。(T-T)

<A HREF=\"./test.cgi?$FileName\">
この$FileNameに無理やり
"..%2F..%2F..%2Ftest%2Ftest2%2Ftest.dat"
という文字列をあてがっただけなのですが・・・

任意の文字列をエンコードする場合、
やはりJavaScriptを使用するしかないのでしょうか。

その場合
<A HREF=\"./test.cgi?$FileName\">
でコールしていた"./test.cgi"も
JavaScript内でコールすることになるのでしょうか。

ヒソカ 2000/04/05(水) 15:35:27
URLエンコードがわからないなら
submitでPOSTする方法検討したほうがスッキリするんじゃ?

きょし 2000/04/05(水) 16:37:13
[[解決]]
ヒソカさん、ご意見ありがとうございます。
いろいろな所で勉強して、
何とかJavaScriptを使用せずに
エンコードすることができました。
(要はハードコーディングなのですが)

1日悩みましたがこれでうまくいきそうです。
今後は作成段階でNetScapeとIE、
両方に注意を払って作れるように心がけます。

今回、たくさんの方々に助言をいただき、本当に助かりました。
いろいろ挑戦して早くスキルアップし、皆さんのように
誰かのお役に立てれば、と思います。
本当にありがとうございました。

[上に] [前に] [次に]