アプリ版:「スタンプのみでお礼する」機能のリリースについて

最近 CGI に興味をもち Perl を始めました。
簡単なサンプルを無料サーバーにアップロードして cgi だけを
直接実行すると問題なく実行されます。

ですが SSI の #exec を使って HTML ソースに
<!--#exec cgi="/cgi-bin/sample.cgi" -->
と記述してページを開くと
[an error occurred while processing this directive]
と表示されてエラーになりました。

無料サーバーは infoseek で CGI/SSI は使えると書かれていたので
試してみました。それでもう一度確認の為に読んで見ると『#exec』は
セキュリティ強化のため利用できないことが判明しました。
http://help.www.infoseek.co.jp/isweb/20602.html#7

質問内容:
(1)CGI/SSI は使えるが #exec は使えない状況でどうやって Perl-CGI を
  HTML ソースに記述して実行すればよいのか?
(2)CGI は cgi-bin に置きパーミッションを 755 に設定しています。
  設定は infoseek さんの指示通りです。他に設定すべき点ありますか?
(3)Perl-CGI の1行目ではちゃんと『#!/usr/local/bin/perl』と記述しています。
  こちらも infoseek さんの指示通りです。
  Perl の記述で何か気をつけるべき点はありますか?バグ以外で。
(4)HTML ソースの拡張子は shtml にしています。
  SSI を使うにはサーバーが対応していれば拡張子を変えるだけで使えるのですか?

今回の質問は Perl-CGI を HTML ソースに記述して実行する?には
どうすべきかをお聞きしたいです。infoseek さんの情報は次のリンクです。
http://help.www.infoseek.co.jp/isweb/20601.html
またネット検索していたら次のページを発見しました。
http://cocohome.hp.infoseek.co.jp/ssi/
ここの人は私と同じ infoseek で SSI 入門を書いています。
なぜこの方は SSI の #exec が使えるのでしょうか?
この辺も知りたいです。
分かる方お願いします。
教えて下さい。

A 回答 (7件)

infoseekのフリーサーバーを利用している者です。


SSI #execが不可になったときに、#include を試してみましたが、その時はプログラムソースがそのままincludeされてましたが、それではあんまりだと、今はエラー表示になったようですね。
No.5でご呈示のHTTP_REFERER編集まではやってませんが、たぶん無理かと思います。
SSIでユーザープログラムを実行させることそのものを排除しているように思います。

あと、#includeに限らず#flastmodなどでもvirtualで絶対パス指定でいけるんですけど、そのshtmlファイルが存在するディレクトリーより上位にさかのぼる位置のファイルは指定出来ないようです。

No.2補足のところでご呈示の方法ですけど、<img src>で一旦呼び出してファイル作成だと、ブラウザがファイルを読みに行くタイミングが前後することがあるので、<script src="sample.cgi"> で直接呼び出してしまう方がよいと思います。
その場合、cgiでのheader記述は以下のようにしないとよけいな宣伝タグ挿入されてJavaScriptエラーになります。
print qq(Content-type: application/x-javascript;\n\n);

修正版 ●HTMLソース(sample.shtml)
----------
<HTML>
<HEAD><TITLE>CGIテスト</TITLE></HEAD>
<BODY>
<!--[JavaScriptファイルの読み込み]-->
<script type="text/javascript" src="/cgi-bin/sample.cgi">
</SCRIPT>
<noscript>
JavaScriptがオフのため表示出来なくて済みません。
</noscript>
</BODY>
</HTML>
----------
修正版 ●Perl-CGI(sample.cgi)
----------
#!/usr/local/bin/perl
print qq(Content-type: application/x-javascript;\n\n);

&sample;
exit;
sub sample{
  $format = "%04d/%02d/%02d %02d:%02d:%02d";
  my($sec, $min, $hour, $day, $month, $year, $week, $yday, $isdst) = localtime();
  print "document.write('";
  print sprintf ($format, $year+1900, $month+1, $day, $hour, $min, $sec);
  print "');\n";
}
----------
全角空白のindentはそのままです。コピー時は注意して下さい。
JavaScriptがオフだと実行されないのは致し方ないかな?

アクセス時刻でなくカウンターなら<img src>呼び出しの書き込みファイルでは「次番号」にしておけば、前回書き込んだファイルを#includeしても違和感はないように思います。
つまり、初期値を1から初めて先に表示用sample.datファイルを作っておきます。
で、No.2補足に有る方のsample.shtmlのscriptタグを以下に置き換えます。
<!--#include virtual="/cgi-bin/sample.dat" -->

SSIの替わりになる対策としては、たぶんこの2つくらいでしょうね。
あと、iframe かな? でもフレーム内にも宣伝が入ってくるのであんまり実用的ではないですけどね。
    • good
    • 0
この回答へのお礼

同サーバーからの回答有り難うございます。

>SSI #execが不可になったときに、#include を試してみましたが、
>その時はプログラムソースがそのままincludeされてましたが、
>それではあんまりだと、今はエラー表示になったようですね。
これは拡張子が .html や .htm が原因なのでしょうか?

これをヒントに拡張子を変えたら内容が HTML ソースでも include が出来ました。
やりたい事が一歩前進しました。
有り難うございます。

>あと、#includeに限らず#flastmodなどでもvirtualで絶対パス指定でいけるんですけど、
>そのshtmlファイルが存在するディレクトリーより上位にさかのぼる位置の
>ファイルは指定出来ないようです。
これは SSI の virtual のルールですよね。
Unix系のパスの指定ルールと同じかな。

><script src="sample.cgi"> で直接呼び出してしまう方がよいと思います。
<SCRIPT>タグでもできるのですね。
>全角空白のindentはそのままです。コピー時は注意して下さい。
これ有り難うございます。
うっかりそのままコピー&ペーストしそうになりました。

>JavaScriptがオフだと実行されないのは致し方ないかな?
了解。

>アクセス時刻でなくカウンターなら<img src>呼び出しの書き込みファイルでは
>「次番号」にしておけば、前回書き込んだファイルを#includeしても違和感は
>ないように思います。
このアイディアも良いですね。
アクセス・カウンタなら使えそうです。

>SSIの替わりになる対策としては、たぶんこの2つくらいでしょうね。
本当に参考になりました。
修正版の HTML ソース、Perl-CGI は正常に動いています。
<IMG>タグよりも<SCRIPT>タグを利用することに決めました。


この質問は一通りこれで解決になります。
また何か良いアイディアが浮かびましたら回答を書き込んで下さい。
しばらくは締め切らずにこのままにしておきます。

お礼日時:2007/09/23 20:07

っと、、まだ閉じられてないようですね。



SSIからの実行そのものが禁止されてるとどうしようもないですけど、
iswebライトのアカウント登録メールが届いたので、実験してみましたが、動くみたいです。

ANo.5のHTTP_REFERERを入れるコードを使ってますが、
HTTP_REFERERを入れても入れなくても動いてるようです。
ANo.4の回答のところで問い合わせたらしいですけど、設定が変わったんでしょうか?(そう簡単なことじゃないはず何ですが、、、)
上位ディレクトリへのアクセスも試してみましたが、これも動きました。
なんかよくわかりません。。。(´・ω・`)

http://*****infoseek.co.jp/cgi-bin/hello.cgi
#!/usr/local/bin/perl
print "Content-Type: text/html\n\n";
print "Hello\n";

http://*****infoseek.co.jp/index.shtml
http://*****infoseek.co.jp/test/hoge.shtml
ともに <!--#include virtual="/cgi-bin/hello.cgi" -->

これでHelloと表示されました。
(念のため、index.shtmlとhoge.shtmlの2種類)
    • good
    • 0
この回答へのお礼

回答有り難うございます。

>実験してみましたが、動くみたいです。
今、回答 No.3 さんの補足と同じ内容を試したら virtual のパス指定が
正しく実行されました。どうやら設定を変えてくれたようです。
でもメールはまだ届いていませんが…。

>これでHelloと表示されました。
確かに出来ました。
設定が変った気がします。
メールを送ったのが良かったのかな?

ポイントは <SCRIPT> タグの方法を教えてくれた方に入れちゃいます。
この質問はこれでスッキリです。
有り難うございました。

お礼日時:2007/09/26 19:48

いまさらですが、


http://isweb.www.infoseek.co.jp/Icont?sv=IW&pg=i …
/header.txt というファイルは特に作らなくても、表示されるということで、
virtualで指定したときのパスが、通常のパスとは違う所にマッピングされてるのかな、とも思ったんですが、


http://www.akiyan.com/cc1linebbsv2#infoseek_isweb
検索にちょっと時間がかかりましたが、見つかりました。
別の細工がしてあるみたいです。

トップページ以外のページでは普通にできるとかなんとか。
対処法は考えてみます。まぁ、REFEREを入れるだけですが
アカウントを取るのに2日ほどかかるとか、、、

試す予定のコード
index.shtml
<!--#if expr="!$HTTP_REFERER" -->
<!--#set var="HTTP_REFERER" value="http://自分のURL" -->
<!--#endif -->
<!--#include virtual=cgi-bin/example.cgi" --><br>

これでできなかったらお手上げです。
逆にこれで動けば、リファラーを出さない設定のブラウザでも動かすことができると思います。


> ANo.4
くだらない回答をしてしまったみたいで、すみません。
    • good
    • 0
この回答へのお礼

再回答待っていました。

>検索にちょっと時間がかかりましたが、見つかりました。
>別の細工がしてあるみたいです。
貼られていたリンクを読んでみました。
どうやらエラーになる細工をしているようですね。

>試す予定のコード…
>これでできなかったらお手上げです。
試してみました。
エラー表示はされませんでしたが、今度は画面が真っ白のままで
何も表示されなくなりました。つまり、試したコード4行以降に
記述したメッセージなどが全く表示されませんでした。
Perl-CGI で書き出す sample.dat の内容も変化がないようです。
試した結果、無理でした。残念。

>アカウントを取るのに2日ほどかかるとか、、、
アカウントを取ってまで試してくれるとは嬉しいですね。

検索して見つけて下さったリンクは参考になりました。
いろいろと有り難うございました。

お礼日時:2007/09/23 19:36

> #include virtualで全滅


http://********/cgi-bin/sample.cgi
にアクセスして、正常に表示されます?

ANO.2の書き方から邪推ですが、標準出力になにか出力しないとエラーになります。
SSIで実行するなら
print "Content-Type: text/plain\n\n"
という"おまじない"だけでもいいと思います。

HTMLファイルに入れられるのはテキストだけです。
Windowsアプリでstdoutにバイナリデータを出力するって言うのはそうそうないと思いますけど、
CGIの場合は画像を作成してそのままstdoutに出力することもあります。
それが<img src="sample.cgi">という使い方です。
これを
<p><!--#include virtual="sample.cgi" --></p>
としても、画像ファイルをnotepad.exeで開く様な状態になりますので、
[an error occured~]は表示されないかも知れませんが、ブラウザで表示できないかもです。

もし<img src="sample.cgi">のまま実行するなら、
1ピクセルの透明GIFか何かを作って、それを読み込み、
"Content-Type: image/gif\n\n"という"おまじない"つきで
標準出力に出力しておけばいいと思います。

ちなみに、<img src="sample.cgi"> はSSIじゃないです。
SSIは <!--#コマンド 何か --> こういうのです。

この回答への補足

★補足情報とお礼。

http://********/cgi-bin/sample.cgi
>にアクセスして、正常に表示されます?
これは質問の最初に記述しています。
cgi だけを直接実行すると問題なく実行されます。正常です。

>ANO.2の書き方から邪推ですが、標準出力になにか出力しないとエラーになります。
これは標準出力が SSI で出来なかったのでその解決策としてファイルに書き出して
JavaScript で標準出力と同じ仕組みを作り上げたのです。→taloo さんのアドバイスより。
最初は標準出力をするタイプを試しています。つまり『おまじない行』と『print』です。

>CGIの場合は画像を作成してそのままstdoutに出力することもあります。
>それが<img src="sample.cgi">という使い方です。
この方法は既に知っていますが画像ですよね。この方法はさ。
私が今回やりたいことは CGI でテキスト文字を標準出力してそれを HTML の一部で
受け取れるようにしたいのです。

理由はテキスト・カウンタを作りたいのです。
他にもサーバーに置かれたデータをソートして表示するとかにも使えると思いますので
今、一生懸命 CGI、SSI、Perl を平行してお勉強とテストしている段階です。

>ちなみに、<img src="sample.cgi"> はSSIじゃないです。
>SSIは <!--#コマンド 何か --> こういうのです。
SSI に関しては次のリンク先でお勉強しました。
http://www.scollabo.com/banban/ssi/index.html
最近 CGI、SSI を始めましたがしっかりと区別は出来ています。

ちなみに私の使っているレンタル・サーバー(infoseek)さんは SSI の便利な
『<!-- #exec 何か -->』だけが使えません。それ以外は回答者 No.3 さんの
お礼に書いたとおり使えました。がパスの指定がおかしいのです。

★今日の朝(深夜) infoseek さんにパス指定の問題を『お問い合わせ』しています。
まだ返事はないです。最初は私の SSI の知識不足で上手くいっていないのかと
こちらで質問したわけです。

★タイトルにある
『SSI で #exec 以外で Perl-CGI を実行する方法は?』はというのは
Perl-CGI で標準出力した内容を SSI の #exec 以外でどうやって HTML ソースに
取り込むかの方法を教えて欲しいのです。#exec が利用できれば簡単なのですが
セキュリティ強化の為に SSI の #exec だけが利用できない設定のようです。残念。

何か良いアイディアがありましたら教えて下さい。
今は回答者 No.2 さんの『補足』に書いたように JavaScript 形式のファイルに
書き込み、HTML ソースでは JavaScript を利用して標準出力の結果を受け取っています。

この方法が妥当なのか分かりませんが、これなら上手くいきます。
この方法以外で良いアイディアがあるのか、
この方法以外にはないのかをお聞きしたいのです。

以上。

補足日時:2007/09/22 16:56
    • good
    • 0
この回答へのお礼

taloo さん。
回答有り難うございます。→『C/C++カテゴリで回答側の人です。』覚えてる?

回答者 No.1 さんとのやり取りから
順番に読んで頂き有り難うございます。

文字数の関係で補足にすべて書き込みます。
2、3日前にお礼への文字数が減った。
前は2000文字(4000バイト)だったかな?
今は1000文字(2000バイト)です。
ちなみに補足は
今は2000文字(4000バイト)です。

お礼日時:2007/09/22 16:55

infoseekでしたね。


制限とか、クセとかわからないんで的確なアドバイスはできそうもないです。

同じ階層のファイルの読み込み
file="sample.txt"

CGIの実行結果の受け取り
file="cgi-bin/sample.cgi"
(Content-Type は text/html ではなく text/plain )

で、動かなければよくわからないです。

この回答への補足

●sample.shtml 内で
<P>(1)<!--#include file="sample.txt" --></P>
<P>(2)<!--#include file="/sample.txt" --></P>
<P>(3)<!--#include file="./sample.txt" --></P>
<P>(4)<!--#include virtual="sample.txt" --></P>
<P>(5)<!--#include virtual="/sample.txt" --></P>
<P>(6)<!--#include virtual="./sample.txt" --></P>
を記述してみました。その結果は
(1)インクルード文字列
(2)[an error occurred while processing this directive]
(3)インクルード文字列
(4)インクルード文字列
(5)インクルード文字列
(6)インクルード文字列
となりました。
ちなみに『sample.txt』の内容は『インクルード文字列』です。
(2)がエラーになるのは file 指定なので分かります。正常。

次に cgi-bin についても調べました。
<P>(1)<!--#include file="cgi-bin/sample.cgi" --></P>
<P>(2)<!--#include file="/cgi-bin/sample.cgi" --></P>
<P>(3)<!--#include file="./cgi-bin/sample.cgi" --></P>
<P>(4)<!--#include virtual="cgi-bin/sample.cgi" --></P>
<P>(5)<!--#include virtual="/cgi-bin/sample.cgi" --></P>
<P>(6)<!--#include virtual="./cgi-bin/sample.cgi" --></P>
すると全てにおいて
(1)[an error occurred while processing this directive]
(2)[an error occurred while processing this directive]
(3)[an error occurred while processing this directive]
(4)[an error occurred while processing this directive]
(5)[an error occurred while processing this directive]
(6)[an error occurred while processing this directive]
上記のエラーになりました。
ちなみに cgi-bin のパーミッションは -rwxr-xr-x[755] です。
sample.cgi のパーミッションも同じく -rwxr-xr-x[755] です。
なぜ?virtual 指定ではエラーになるの?分かりますか?

補足日時:2007/09/22 02:17
    • good
    • 0
この回答へのお礼

再回答有り難うございます。

Perl-CGI よりも SSI に問題があるような気がしてきました。
そこで SSI 命令についていろいろとテストしてみました。
その結果次のものは正常に使えました。→#exec は使えない設定です。
(1)#config(errmsg,sizefmt,timefmt)
(2)#fsize
(3)#echo(Data_Local,Date_GMT,Document_Name,…,残りすべて正常)
(4)#flastmod
(5)#include
上記の命令は一応動作しますが、ちょっとおかしい動作もあります。
それが #include 命令などのパスの指定です。
文字数の関係で『補足』に続きを貼り付けます。

お礼日時:2007/09/22 02:16

http://www.tohoho-web.com/wwwssi.htm#Include
Includeでもfileにスクリプトを指定すれば実行後、挿入されたと思います。

この回答への補足

次は補足情報です。

●HTMLソース(sample.shtml)
----------
<HTML>
<HEAD><TITLE>CGIテスト</TITLE></HEAD>
<BODY>

<!--[CGIの実行]-->
<IMG SRC="http://********.hp.infoseek.co.jp/cgi-bin/sample … WIDTH="0" HEIGHT="0">

<!--[JavaScriptファイルの読み込み]-->
<SCRIPT LANGUAGE="JavaScript" SRC="http://********.hp.infoseek.co.jp/cgi-bin/sample …
</SCRIPT>

<!--[JavaScriptで表示]-->
<SCRIPT LANGUAGE="JavaScript">
<!--
document.write( msg );
// -->
</SCRIPT>

</BODY>
</HTML>
----------

●Perl-CGI(sample.cgi)
----------
#!/usr/local/bin/perl
$file_sample = "sample.dat";

&sample;
exit;

sub sample{
 if ( open(OUT,">$file_sample") ){
  $format = "%04d/%02d/%02d %02d:%02d:%02d";
  ($sec, $min, $hour, $day, $month, $year, $week, $yday, $isdst) = localtime();
  print OUT "var msg=\"[";
  print OUT sprintf ($format, $year+1900, $month+1, $day, $hour, $min, $sec);
  print OUT "]\";\n";
  close OUT;
 }
}
----------

今は JavaScript と組み合わせて上記の方法で CGI を動かしています。
これなら正常に動かせるようです。この方法が一般かどうかは分かりません。

上記以外で Perl-CGI の print 結果を HTML ソースに表示させる方法を
探しています。良い方法があれば教えて下さい。

補足日時:2007/09/21 23:08
    • good
    • 0
この回答へのお礼

回答有り難うございます。

SSI の #include が上手く働かないのです。
この質問の後に #include がなぜ使えないか質問しようと思っていました。
『とほほのSSI入門』は既に読みました。
その後に次のリンクを参考にしました。
http://www.scollabo.com/banban/ssi/ssi_005.html
これらの情報より #include 使い方は分かりました。

そこで試しに次のリンクの一番下にある
http://isweb.www.infoseek.co.jp/info/iw_spec.html
<!--#include virtual="/header.txt" -->
<!--#include virtual="/footer.txt" -->
の2行を HTML ソースに記述すると見事に宣伝広告が表示されました。

ここまではよいのですが次のように同サーバーにある index.html を
<!--#include virtual="/index.html" -->
と指定すると[an error occurred while processing this directive]という
エラーが表示されます。

一応、ディレクトリ構造は
◆home
├index.html ←トップページ
├sample.shtml ←テスト用のページ(ここに#includeを記述)
└cgi-bin
 ├sample.cgi[755]⇒-rwxr-xr-x
 └sample.dat[666]⇒-rw-rw-rw-

広告用のページらしき header.txt、footer.txt は表示されるのに
なぜ index.html は取り込めないのでしょうか?
私にはもう全く理解できません。
拡張子は txt にしないとまずいですか?

お礼日時:2007/09/21 23:03

>なぜこの方は SSI の #exec が使えるのでしょうか?


http://cocohome.hp.infoseek.co.jp/ssi/exec.html
使えなくなった事を後で知ったと書かれている。
つまり動作するものを件の場所には置いて折らず#execを使える場所でしか使っていないという事になる。
    • good
    • 0
この回答へのお礼

こちらの回答も有り難うございます。

貼ってくれたリンクに確かに書かれているね。
まだ隅々まで読んでいなかったです。

それで本題の #exec 以外で Perl-CGI はどう実行すればよいのでしょうか?
ここが一番お聞きしたいのです。
何か情報をお持ちでしたら再回答をお願いします。
お待ちしています。

お礼日時:2007/09/21 20:19

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!