掲示板が特定環境でのみ動作しない。対処法は?

[上に] [前に] [次に]
殿下 [E-Mail] [HomePage] 1999/08/02(月) 14:20:48
Cで掲示板CGIを作っております。まだ初心者なのですが不具合が改善せず、困っています。
現象を以下に示しますので、なにかお気づきの方がいらっしゃいましたらご指摘お願い致します。

1. MacのIE4.5にて、あるフォームデータを送信すると意図しない文字列が書き込まれる。
2. 1をもう一度繰り返すと、意図しない別の文字列が書き込まれる。
3. 1を何度もも繰り返しているとたまにjavascriptの一部が出力される。CGIの不具合で意図しないメモリ領域を操作していることが想像される。
4. しかし他の主要なブラウザでは、1と同じフォームデータが正常に書き込まれる。(WINのIE、NN、MACのNN)
5. MacのIE4.5でも、正常に書き込まれることの方が多い。

関係ないかも知れませんが、以下のJavaScriptがマックのIEでのみ動作しません。
これは書き込みCGIへ送るフォームをチェックするもので、真っ先に疑いましたが削除しても改善しません。
上記の3で現れるJavaScriptはこれではなく、全く関係ないページのものです。
function check(){
if  (document.forms['f'].elements['name'].value.length==0) return false;
if  (document.forms['f'].elements['message'].value.length==0) return false;
return true;
}

ふじ 1999/08/02(月) 16:23:47
MacのIE4.5のバグで、フォームのエレメントの名前に
id や title という名前を付けると JavaScript で参照できない、
というものがあります。もしかして name という名前でも
同様の症状が出るのかも知れません。
#酷いバグだが・・・

意図しない文字列、てのは具体的にどういうものか示されれば
何か手掛かりが得られるかも知れません。

ウンジャマラミー 1999/08/02(月) 22:00:55
ちなみに、フォーム送信のメソッドは何でしょう?
GETなら環境変数QUERY_STRING、POSTなら標準入力から
取り込んだデータを調べてみてはどうでしょうか。
(POSTならCONTENT_LENGTHの値もね)
もし不具合が再現するとき、フォームデータは正しく入力されてきて
いるなら、CGI側の問題かもしれませんね。

殿下 [E-Mail] 1999/08/03(火) 00:23:16
お返事ありがとうございます。
なんとふじさんのおっしゃるとおり、NAMEという名前が動作しない原因でした。どうもありがとうございます。
しかし、CGIの不具合は引き続き解決しておりません。
ウンジャマラミさんのおっしゃる様に調べてみた結果、おそらくCGIへ送られる時点でデータが壊れているらしいことが判りました。メソッドはPOSTです。引き続きアドバイスをお願いいたします。
以下書き込み文字列
---------------------------------
調整中。書き込み不可。
いじわるして書き込んでもいいですが、まともに書き込まれない可能性があります。
書き込みは下記へ。
↓仮掲示板
---------------------------------
注)意地悪でも書き込めない様にしてあります。

標準入力文字列
例1)name=t&mail=&url=http%3A%2F%2F&message=%043%2F4%3FP
例2)name=t&mail=&url=http%3A%2F%2F&message=%04%3F%27%3F%04%3F%3F
例3)name=t&mail=&url=http%3A%2F%2F&message=%04%83%D3%3F%3F%3F
例4)name=t&mail=&url=http%3A%2F%2F&message=%04%3F%3F%041%2F4j%3FgL
例5)name=t&mail=&url=http%3A%2F%2F&message=%04%3F%81N%04%3F

以上をCGIに渡しているform(もちろん実際はその他の入力欄もあります)
<form name="f" method="post" action="Board_J/writeDB.cgi">
<textarea name="message" rows=4 cols=60 wrap=hard></textarea>
</form>

Cソース(標準入力の調査の部分のみ)
char *query;
int len;
len=atoi(getenv("CONTENT_LENGTH"));
query=(char *)malloc(len+1);
scanf("%s",query);
query[len]='\0';
printf("Content-type: text/plain\n\n"
"%s",query);
長くなって申し訳有りません。よろしくお願いします。

うふ! 1999/08/03(火) 00:32:41
マックだと改行の文字コードが違うというのは原因になるかな?
あと、もし、書き込みフォームのあるHTMLをJavaScriptでかき出しているとしたら、
IEの場合は文字コードがunicodeになってしまったような気がしますが
いかがでしょう?

殿下 [E-Mail] [HomePage] 1999/08/03(火) 00:38:11
みなさま、ご助言どうもありがとうございました。
原因がわかりました。
前回の発言直後にピンと来まして、フォームの
wrap="hard"
という下りを削除したところ、書き込み不可だった文字列が書き込まれました。
というわけで解決したわけですが、引き続き関連する情報をご存じの方がいらっしゃいましたら、ぜひとも教えていただきたいです。
例えば、wrap事態が不可なのか、hardだからだめなのか、など。
調べれば済むことですが、情報を共有させてください。
よろしくお願いします。

殿下 [E-Mail] 1999/08/03(火) 00:42:35
うふ!さんもありがとうございました。
HTMLはJavaScriptからではありませんでした。
改行コードについては全く無知です。
おっしゃる問題をもう少しくわしく教えて頂けないでしょうか。
後学のために。

殿下 1999/08/03(火) 01:41:43
wrapをvirtualとしても動作しました。
IEはデフォルトでsoftだそうなのでこの二つは動作するということです。
しかし、virtualって何なのか知りません。
サービス掲示板で見かけたので試してみました。
他との違いを教えてください。(どこを調べても載ってませんでした)

うふ! 1999/08/03(火) 02:14:13
wrap=virtualって使った事ないですねえ。
wrap=softは良く使いますけど。
改行文字は
Windows CR + LF
UNIX LF
Max CR
でしたよね。

ウンジャマラミー 1999/08/03(火) 09:25:04
ちょっと気になったので...
>scanf("%s",query);
CONTENT_LENGTH分読みこむなら、例えばこんな感じのほうが良いのでは?
fread( query, 1, len, stdin );
今のままでも問題無いでしょうけどね。

殿下 [E-Mail] 1999/08/03(火) 14:07:40
[[解決]]
>うふ!さん
その辺も今後勉強しないとならなそうです。頑張ります。

>ウンジャマラミーさん
実はC言語もまだ初心者ですのでfreadという関数は知りませんでした。
調べて使って見ることにします。

では、とりあえず「解決」をチェックすることにします。
本当にみなさん、どうもありがとうございました。
また、何かありましたらよろしくお願いします。
では。

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