AN HTTPD ゲストブック/コメント集(2003年3月27日15:41)


中田昭雄 nakata@st.rim.or.jp 2003/03/30 20:02

Niimi さん、
その「勘違い」も、ありがちな「「&」記号のエスケープに関するトラブル」のひとつかもしれませんね。


Niimi niimi@gld.mmtr.or.jp 2003/03/30 09:12

あぁごめんなさい! 勘違いしてました。

あの勧告はURIの一部とした時のみ意味を持ちますから、
サーバが解釈するSSIの話であるなら、先の話は的外れとなります。
で、SSIの出力を含んだ上でのHTMLとしてのみ、
あの勧告は適用されることとなります。
ですから、今回の件は忘れて下さいまし。


中田昭雄 nakata@st.rim.or.jp 2003/03/29 19:49

Niimi さんへ追記
それと SSI は HTML文書を動的に出力するわけで、それ自体はHTML文書ではないという理屈もありそうですね。
HTML4.01の仕様では何か書いてありますか?


中田昭雄 nakata@st.rim.or.jp 2003/03/29 17:47

Niimi さん、
HTMLの仕様の話と、HTTP,CGI,SSIの各実装の話がからむのでちょっとややこしいですけど、
HTML4.01仕様の B2.2 の例のようなリンク用URIの場合はユーザエージェントが処理するので、2,3 の形でなんの問題もなく、HTTPサーバやCGIは関係しません。
SSI の #exec cgi は直接 HTTPサーバが処理しますから、問題があります。

現在の AN HTTPD の SSI の #exec cgi は、少し下で話が出たように不具合があるので、フォーム送信時のような = がある形で説明すると、
1. exec cgi="./foo.cgi?x=1&y=2"
2. exec cgi="./foo.cgi?x=1&y=2"
3. exec cgi="./foo.cgi?x=1&y=2"
のいずれでも動作はしますが、「正しく」は動作しないでしょう。
というのは、? 以下がそのまま QUERY_STRING にはいるので、あとは foo.cgi 次第になります。
普通、foo.cgi は "x=1&y=2" を "x=1", "amp;y=2" と処理するでしょうから、予期した通りには動作しないということになると思います。

ただし、HTML 4.01 の仕様では、2,3 では困ってしまうので
4. exec cgi="./foo.cgi?x=1;y=2"
とすることを求めているように読めます。(その求めに応じているかどうかは別問題ですけど。)
この 4 も AN HTTPD で動作しますが、これも foo.cgi が ; 区切りに対応していなければ「正しく」は動作しません。

HTML(SGML)の文字実態参照区切り子と衝突するからという理由で変更をせまられるCGIとしてはいい迷惑だ、という気がしないでもありません。
HTTPサーバも本来は関係がないのですが、SSIの #exec cgi だけ話に巻き込まれてしまいますね。

というわけで、#exec cgi で 2,3 の表記を使う人もいるでしょうから、CGIがそのままでも問題がないように AN HTTPD を(いずれ)修正します。
4 はCGIの問題になります。まあ、HTTPサーバで ; を & に戻す処理をすればいいのですが。。


Niimi niimi@gld.mmtr.or.jp 2003/03/29 10:28

おっと失礼しました。

1. exec cgi="./foo.cgi?name1&name2"
2. exec cgi="./foo.cgi?name1&name2"
3. exec cgi="./foo.cgi?name1&name2"

という形です。(要は実体参照の問題ですね)


Niimi niimi@gld.mmtr.or.jp 2003/03/29 10:26

HTMLの解説なんかを読むと、

1. exec cgi="./foo.cgi?name1&name2"
2. exec cgi="./foo.cgi?name1&name2"
3. exec cgi="./foo.cgi?name1&name2"

1は間違いで、2あるは3の形で書かないといけないみたいなんですが、
2あるいは3の形で書いても正しく動作しないのでしょうか?

W3CのHTML 4.01の勧告だと、「本仕様では、HTTPサーバの実装者、特にCGI実装者が、
「&」の代用としての「;」をサポートするよう推奨し、「&」記号のエスケープに関す
るトラブルを著者が避けられるよう求める。」となっている様ですね。
邦訳 : http://www.asahi-net.or.jp/~sd5a-ucd/rec-html401j/cover.html
「附属書 B: パフォーマンス上、実装上、設計上の注意」参照

AnHTTPDではいかがでしょうか?


rousho rousho 2003/03/28 09:26

中田様、回答有難うございます。そして、対策お願いします。
とりあえず、パラメータにスペースや'+'が入ることはないので、'+'でも区切るようにします。


中田昭雄 nakata@st.rim.or.jp 2003/03/27 21:36

rousho さん、
確かに、#exec cgi ではパラメータの扱いで不備がありますね。
直しますが、とりあえず、 & ではなくて + にすると回避できます。
つまり、?name1+name2 で動作すると思います。


rousho rousho 2003/03/27 15:41

SSIでCGIを起動するときにパラメータを渡したいのですが、Apacheではバージョンや設定などによりできない場合があるようです。
AN HTTPDではいろいろ試してみたのですが、?なところがあります。
exec cgi="./foo.cgi?name1&name2"は起動されず
exec cgi="./foo.cgi?name1=value1&name2=value2"は起動される
一般的には ?name1=value1&name2=value2 だとは思うのですが、?name1&name2 で起動してくれないのはなぜでしょうか?

AN HTTPD Ver 1.42hを使っています。