SSIの#includeでCGIを実行する方法は?

[上に] [前に] [次に]
てちゅう 1999/11/03(水) 23:36:06
SSIのexecが使えないプロバイダで、includeで代用しようと思っているのですが、うまくいきません。
何か工夫が必要なのでしょうか。
ちなみに、execが使えるプロバイダでテストしたのを、そのまま流用しているのでCGIスクリプト自体にミスは無いはずです。
よろしくお願いします。

wa 1999/11/03(水) 23:55:24
../199909/99090148.htm
これなどが参考になるかも。いい結果じゃないけど
スクリプト作った人に聞いてみると改造方法を教えてくれるかもしれないですが。

ちなみにそのプロバイダ。cgiが別サーバーだったら代用は無理っぽいです
InterQがそうです…

きたむら 1999/11/04(木) 01:18:27
include virtualで取り込めるのは「CGIの出力」なので、
「いままで動作していたSSIの出力」にHTTPヘッダをつけ加える
必要があります。出力のいちばん最初に、

print "Content-Type: text/plain\n\n";

を追加して、プレインテキストのHTTPヘッダを付加してやると、
きっとオーケーだと思います。

B-Cus 1999/11/04(木) 01:30:09
「SSI の exec が使えるプロバイダ」なら確かにその通りだけど、
「SSI の exec が使えないプロバイダ」、つまり IncludeNoExec しか
許されていないプロバイダでは、「プログラムの実行結果を include する」
のは無理じゃないですかね。

きたむら 1999/11/04(木) 02:34:34
あれーそうでしたか…。というわけで、
自宅ローカルサーバ(FreeBSD-3.3R+Apache1.3.9)を
Options ExecCGI IncludesNoExec
の設定に変えて試してみました。
この設定ですと、execは禁止になるけれど、includeで
CGIスクリプトの実行結果がインクルードできました。
って、そうい問題じゃない?

B-Cus 1999/11/04(木) 02:46:14
あらら。
 http://japache.infoscience.co.jp/japanese_1_3/manual/mod/core.html#options
には
 IncludesNOEXEC
  サーバ側インクルード機能を許可しますが、#exeコマンドとCGIスクリプトの#include は含みません。
と書いてあり、なおかつ手元の FreeBSD+Aapache1.3.0 で
 Options ExecCGI IncludesNoExec
として、実行結果を include できないことを確認してから
上記の内容を書き込んだんですが、1.3.0 はちょっと古すぎたかな…。

きたむら 1999/11/04(木) 03:10:24
うわ。1.3.9のマニュアルにも同じことが書いてあります。
(manual/mod/core.html#options)

IncludesNOEXEC
 Server-side includes are permitted, but the #exec command and #include of CGI scripts are disabled.

なのに、なぜ動作するのだ…。>1.3.9
どなたか追試してみてくれませんか。

バーチャルヒューマン [HomePage] 1999/11/04(木) 14:40:35
きたむらさんは書きました:
>この設定ですと、execは禁止になるけれど、includeで
>CGIスクリプトの実行結果がインクルードできました。

うーん。試験はしていないのですが。。。
SSI 機能はサーバがコンテンツを読み込み、SSIの書式があればこれを
実行し、その結果をコンテンツに変換するのだと解釈しています。

でその書式が、exec ならば、その実行結果で、include ならばその
ファイルの内容そのものを吐き出すのだと。
ちなみに、<!--#include ???="ファイル名"-->を使った場合には
そのファイルそのものの内容(plain-textイメージ)に変換されるようです。

B-Cus 1999/11/04(木) 14:50:23
include でも、対象のファイルが CGI としてならば(*.cgi ならば)
ファイル自体ではなく、実行結果が取り込まれます。これは
明文化された機能です。
 http://japache.infoscience.co.jp/japanese_1_3/manual/mod/mod_include.html

で、今は IncludesNoExec の場合はどうか、という話をしているわけです。

ちなみに僕は、IncludesNoExec の意味から言って、1.3.9 の動作は
おかしい、バグではないか、と思うのですが、apache group で
そこらへんの方針転換があり、ドキュメント整備が追い付いて
いないだけなのかもしれません。

詳しい人教えて。

きたむら 1999/11/05(金) 02:37:55
>ちなみに僕は、IncludesNoExec の意味から言って、1.3.9 の動作は
>おかしい、バグではないか、と思うのですが、

ええ、言われてみると、そのとおりですねー。
IncludesNoExecを設定するのは、不用意に書かれたスクリプトが
サーバーに害を及ぼさないようにするといった意図があると
理解してます。

もしかしたら、Apache1.3.9は exec(3) の実行を、なにかうまい
方法で見つけて、その場合に限って実行禁止するのか、という
予想をたててみました。実験したところ、最初はいい線いってると
思ったんですが、どうも違う(あるいはバグってる)ようです。

以下に実験結果を示します。

------------------- test.shtml
<html>
<body>
<!--#include file="test1.cgi"--><br>
<!--#include file="test2.cgi"--><br>
<!--#include file="test3.cgi"--><br>
<!--#include file="test4.cgi"--><br>
</body>
</html>

------------------- test1.cgi
#!/usr/local/bin/perl
print "Content-Type: text/plain\n\n";
print "test1\n";

------------------- test2.cgi
#!/usr/local/bin/perl
print "Content-Type: text/plain\n\n";
exec "/bin/echo", "test2";

------------------- test3.cgi
#!/usr/local/bin/perl
print "Content-Type: text/plain\n\n";
system("/bin/echo test3");

------------------- test4.cgi
#!/usr/local/bin/perl
print "Content-Type: text/plain\n\n";
print `/bin/echo test4`;

この5つのファイルを用意して、test.shtmlにアクセスしてみた
結果、次のようになりました。

test1
[an error occurred while processing this directive]
[an error occurred while processing this directive]
test4

バッククォートを使ったtest4.cgiで、
/bin/echo が実行されちゃってます……。

きたむら 1999/11/05(金) 02:43:52
あ、上の実験のスクリプトまちがってた。
test2.cgiとtest3.cgiに「$| = 1;」を追加したら、
どちらもあっさりとincludeに成功してしまいました。
結局 exec(3) の実行とは関係ありませんでした。うー。

B-Cus 1999/11/05(金) 04:56:48
> IncludesNoExecを設定するのは、不用意に書かれたスクリプトが
> サーバーに害を及ぼさないようにするといった意図があると
> 理解してます。
ん〜、というより、IncludesNoExec は、
 ・任意のプログラムをサーバで実行させたくない
 ・でも、SSI の include は便利なので使いたい
という用途だと思うので、IncludesNoExec を使う前提としては
 ・CGI/SSI(exec)不可
ではないかと。

# 僕が管理者なら、+ExecCGI なら +Includes にするし、
# -ExecCGI なら -Includes にします。もしユーザから include を使いたい
# という要望があれば -ExecCGI +IncludesNoExec にします。

なので、我々の行った +ExecCGI +IncludesNoExec という設定は、
あまり考慮されていないのかもしれません。

apache group にバグレポートを送る気力もないので、とりあえず
1.4.0 が出ればバグかどうかわかるだろう、という他力本願的な
態度を取ることにします。

B-Cus 1999/11/05(金) 05:11:44
> なので、我々の行った +ExecCGI +IncludesNoExec という設定は、
> あまり考慮されていないのかもしれません。
書き忘れましたが、1.3.0 では -ExecCGI,+IncludesNoExec では
include flie="*.cgi" は、(当然ですが)実行結果でなく、
ファイル自体が include されました。1.3.9 でもそうですよね?>きたむらさん

> # 僕が管理者なら、+ExecCGI なら +Includes にするし、
ついでに質問ですが、僕には「CGI可/SSI不可」あるいは「CGI不可/SSI可」
という設定の利点がわかりません。何かよいことがあるんでしょうか?

てちゅう 1999/11/05(金) 09:37:11
たくさん回答ありがとうございます。質問者のてちゅうです。
まだ全部試していないんですが、なんとexecが実行できました。
1階層下げたところにCGIを置いたらできたんです。
でも、includeでの実行はまだ成功していません。
ファイルの内容をそのまま取り込んでしまいます。
書きこみを参考にもうちょっと頑張ってみます。

バーチャルヒューマン [HomePage] 1999/11/05(金) 09:51:05
みなさんお詳しいですね。参考になります。
で、個人的主観ですが、
>ついでに質問ですが、僕には「CGI可/SSI不可」あるいは「CGI不可/SSI可」
>という設定の利点がわかりません。何かよいことがあるんでしょうか?

端的には、ISPのサーバ管理者の怠慢(めんどうなのでどっちかだけで十分)とか・・・
もう少しひねると、ユーザ要望が多いし、また、あるとユーザ獲得の宣伝文句に、
でも、セキュリティ面を考慮してかなぁ。
ででで、もっとひねると、
「CGI可/SSI不可」:CGI ができるなら、SSI は不要だし、
SSI は、その設定にもよりますが、一般的に、".shtml" なる拡張子のファイルを
リクエストされるとSSI 機能が働きその分サーバに負荷が増しますね。素人さんとかで
面倒なので、全て、".shtml" で、UpLoad されたばあいとかの考慮でしょうか。

「CGI不可/SSI可」: SSI のみは、SSI でのPG実行も禁止すると思いますが、
#include/#flastmod などは有効ですね。例えば、少し長文なtext文書などを、HTMLに
貼り付けるとか、ファイルの最終更新日を自動的に挿入したいとか。

B-Cus 1999/11/05(金) 17:46:58
> なんとexecが実行できました。1階層下げたところにCGIを置いたらできたんです。
前にもここで、こういうことができたと報告した人がいたけど、
これはどういう状況なんですかねぇ。exec が実行できないなら、
どこに置いても実行できるはずはないと思うんですが。そもそも
> SSIのexecが使えないプロバイダで
これはなぜ「SSIのexecが使えない」と判断したのですか? プロバイダの
案内にそう書いてあったから?

~/public_html/test.html (test.shtml) に
 <!--#exec cmd="./foo.pl"-->
と書いて、~/public_html/foo.pl を
 #!/usr/local/bin/perl
 print "OK\n";
として、foo.pl に実行権限付けたら動かないんですか?

~/public_html/test2.html (test2.shtml) に
 <!--#exec cgi="./bar.pl"-->  (cmd->cgi)
と書いて、~/public_html/bar.pl を
 #!/usr/local/bin/perl
 print "Content-type: text/plain\n\n";
 print "OK\n";
として、bar.pl に実行権限付けたら動かないんですか?

なのに、1階層下げる、例えば ~/public_html/dir/test.html で
同じことをすると動くんですか?

あと、WWWサーバ名を教えて下さい(apache1.2.6とか)。
わからなければプロバイダのURLを教えて下さい
(http://www.so-net.ne.jp とか)。

> 端的には、ISPのサーバ管理者の怠慢(めんどうなのでどっちかだけで十分)とか・・・
まぁ、端的に言うとそうなのかもしれませんね。誰もが納得するような
理由を求めるのも変な気がしてきました。

> 「CGI不可/SSI可」: SSI のみは、SSI でのPG実行も禁止すると思いますが、
SSI のみでも、任意のプログラムが実行できるはずです。

アカゲ 1999/11/05(金) 18:38:36
>> なんとexecが実行できました。1階層下げたところにCGIを置いたらできたんです。
>前にもここで、こういうことができたと報告した人がいたけど

すいません、きっと自分です。(違うかな?)
僕の場合は設定ミスでした…
ディレクトリかえたときに
スクリプトの中身の設定が出来てなかったようです。

そのときいろんなところで聞いたんですが、
そんなことはないはずとしか言われなかったんで
きっと設定ミスかと…

B-Cus 1999/11/05(金) 19:38:30
アカゲさんは
 ../199910/99100085.htm
のスレッドで設定ミスだったことはわかりましたが、他にも
 ../199909/99090148.htm
という話もあります。Gさんはプロバイダを変えたので既に確認できないと。
opsさんは…?

アカゲ 1999/11/06(土) 00:16:03
僕の場合。スクリプトの中にLOGファイルの場所を指定しなくてはならないところがあって、
ディレクトリ変えたのにスクリプトをそのまま使ってたって言うのが原因でした。

B-Cusさんの言ってた文字を出力するだけのスクリプトって言うのを試してみるとわかるはずだと。
もしくはスクリプトをダウンロードしなおしてアップしなおすとか。

あと、てちゅうさんの発言からちょっと予測してプロバイダはインターQではないでしょうか?
(違ったらごめんなさい。)
あそこはexec使えます。ディレクトリ下げる下げないは別としてです。
逆にincludeで(SSIで)CGIが指定できないんで、
execしか使えないといううわさも…

てちゅう 1999/11/06(土) 00:18:02
あ、プロバイダのHPに書いてました。(^^;
http://home.hi-ho.ne.jp/home/service/rental_web.html
かなり申し訳ないです。
どうやら、cgi-binの下に置いたCGIでないと駄目らしいです。includeは。

それで、問題(?)のexecの方なんですが、ちゃんと動きます。
「使用できません」と書いてあるのに・・・。
ちなみに私が使ってるhi-hoのサーバは、http://www.dab.hi-ho.ne.jp/ です。

あと、1階層下というのは、SHTMLファイルではなく、CGIファイルのことです。
B-Cusさんの通りテストしてみた結果、
SHTML、CGI共にpublic_html直下の時は「#exec cmd」は動かない、「#exec cgi」は動く、でした。
で、SHTMLの階層はそのままで、CGIの階層をひとつ下げると、どちらも動きました。
includeは相変わらずpublic_htmlの下では動きませんでした。(というより内容を取り込むだけ)

と、こんな具合です。

hi-hoのHPに書いてある、「"#exec"は使用できません。」は、
「使用しないで下さい。」という事なんでしょうか?

てちゅう 1999/11/06(土) 00:23:22
[[解決]]
一応解決です。私的には。
サーバのことは良く分からないので・・・。

>アカゲさん
実はインターQを使っているお友達に、「SSIくれっ」とせがまれているので、よい参考になりました。
exec使えるんですね。(笑)

きたむら 1999/11/06(土) 00:33:27
>1.3.0 では -ExecCGI,+IncludesNoExec では
>include flie="*.cgi" は、(当然ですが)実行結果でなく、
>ファイル自体が include されました。1.3.9 でもそうですよね?>きたむらさん

はいー。Apache1.3.9でも、これは問題なく、ファイル自体が
インクルードされました。

しかし1.3.9のふるまいは、B-Cusさんがおっしゃってるように
どうもバグくさいので、わたしの書いたことは参考にしないで
ください>てちゅうさん

てちゅうさんの場合、SSIでexecが使えるということですから、
includeにこだわらず、execをお使いになったほうが絶対いいと
思います。

きたむら 1999/11/06(土) 00:45:24
おお。すでにてちゅうさんの解決マークが入っていた。
hi-hoネットの説明ページを見てきました。
複雑な仕様ですねー。これと同じ状態を自分で作ってみるのは
いい勉強になりそうです。こんどやってみよう。
でも、execの制限あたりは、なんとなく、Apache1.3.9の動作に
似ているような……。

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