shtmlファイル内に埋め込んだ<!--"exec cmd="./***.cgi"-->なんですが、
正常に実行されれば、この場所には実行結果しか返りませんが、
DLツールやその他行為で、SHTMLファイルをSSIの実行なしに落とすことはできりでしょうか?
要は、shtml内に埋め込んだ「***.cgi」などのファイル名を取得されないか、
という不安があるのです。

このQ&Aに関連する最新のQ&A

A 回答 (1件)

結論から言えば、必ず SSI を評価してから HTML を送信しますので、大丈夫です。



ただし、サーバの設定が変わった等々という場合はこの限りでは無いでしょうが、安定運用しているのなら、大丈夫でしょう。
プロバイダも、そうコロコロ設定を変更する場合も無いでしょうし。

ところで、どうして名前を取得されるとまずいのでしょう?
    • good
    • 0

このQ&Aに関連する人気のQ&A

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

このQ&Aと関連する良く見られている質問

QSSIの『#exec cmd』と『#exec cgi』の違いがよくわかりません

SSI初心者の者です。
参考書(CGIプログラミング入門/翔泳社)を見ながらCGIとSSIの勉強をしてるのですが、SSIの『#exec cmd』と『#exec cgi』の違いがよくわかりません。
本には前者はPerlスクリプトで後者はCGIスクリプトの場合に使うって書いてあるのですが、この2つってどう違うのですか?
前後の文脈から察するにCGIスクリプトは『print "Content-Type: text/html"』があって、
Perlスクリプトはこれが無いものと読み取れるのですが
そうなのでしょうか?
初心者向けに御回答していただけますよう、よろしくお願いいたします。

Aベストアンサー

補足受けましたhyde-laです
結論から言いますと、無視されるようなことはありません。
飽くまで「結果」をどう扱うかという話ですので。
この場合の結果とは、プログラムの標準出力へ出力されたものという意味です。
#EXEC CMDでは、プログラムの「標準出力」を結果としてブラウザに表示するだけです。

UNIXやDOS等、多くの環境には「標準出力」という考え方があります。
これはPRINT文などで出力される場所で、つまりデフォルトでは画面です。
(標準出力はリダイレクトという操作を用いて、出力先を変えることが出来ます)

QSSI で #exec 以外で Perl-CGI を実行する方法は?

最近 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 が使えるのでしょうか?
この辺も知りたいです。
分かる方お願いします。
教えて下さい。

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

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

無料サーバーは infoseek で CGI/SSI は使えると書かれていたので
試してみました。それでもう一度確認の為に読んで見ると『#exec』は
セキュ...続きを読む

Aベストアンサー

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 かな? でもフレーム内にも宣伝が入ってくるのであんまり実用的ではないですけどね。

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

あと、#includeに限らず#flastmodなどでもvirtualで絶対パス指定でいけるんですけど、そのshtmlファイ...続きを読む

QSSI(

QSSI対応じゃないCGIをSSI対応に…

ホームページに更新記録CGIを設置しているところです。
それ自体はIFRAMEでページに表示させるタイプで、現在ちゃんと動作しています。
しかし1つ問題が…ちょっとページデザインを換えようと思っているのです。
素材配布ページなんですけど、上に一覧の入り口を表で作り、その表の幅を600に設定しました。
その下に同じようなデザインで更新記録CGIをIFRAME表示させようとしました。
しかし、なぜか微妙に左にずれています。更新記録CGIの表はもちろん600に設定しています。IFRAMEの方はスクロールバー分ずれるだろうと思いちょっと広め(680)にして、IFRAME自体はセンターへ、中の表示も中央に設定しました。でも、ずれてしまいます。
この方法をどうにかする方法があればうれしいのですが、どうせならSSIで表示できないかと考えました。これだとセンター表示されるのでは?でも、スクロールはどうなるのかな…際限なく(CGIの表示設定数)表示されるんですかね。
で、現在使っている物がSSI対応じゃないCGIのようです。これをSSI表示させることは可能でしょうか?
サーバのほうは、SSI表示OKでした。
私自身はCGIを0から作ることは出来ませんが、ある程度の改造をすることは可能です。私が出来る(理解できる)かどうかは逐一答えて行きたいと思っています。
何か良い方法がありましたら教えてください。

ホームページに更新記録CGIを設置しているところです。
それ自体はIFRAMEでページに表示させるタイプで、現在ちゃんと動作しています。
しかし1つ問題が…ちょっとページデザインを換えようと思っているのです。
素材配布ページなんですけど、上に一覧の入り口を表で作り、その表の幅を600に設定しました。
その下に同じようなデザインで更新記録CGIをIFRAME表示させようとしました。
しかし、なぜか微妙に左にずれています。更新記録CGIの表はもちろん600に設定しています。IFRAMEの方はスクロールバー分ずれ...続きを読む

Aベストアンサー

> htmlになんと書けばいいのですか?

<!--#exec cmd="プログラムのパス"-->

↑これを書いたところに、プログラムから出力される文字が表示されます。

ただ、SSI対応のサーバでは、ファイル名を ○○.html ではなく、
○○.shtml にしなければならない場合がありますので
その辺りはパーミッション云々も含めて、
サーバの設定に従ってください。

インクルードされるプログラムの方は ○○.cgi でも動く場合がありますし、
○○.pl にしないと動かない場合もあります。
その辺もサーバの設定で。


> 何か法則があるのなら…と思って質問してみました。

print "Content-type: text/html;\n\n";

↑これを削除する理由は、
HTML側ですでに、text/htmlが出力されることになっているからです。

なので、この文章は要らない、という意味で、1行かどうかは分かりません。
2、3行あったら全部削除して下さい。(笑

QSSIで,CGIを実行するときに引数を渡したい

/*hello.exeのソース*/
#include <stdio.h>
int main (int argc,char* argv[])
{
int i;
printf("Content-type: text/html\n\n");
printf("Hello");
for(i=1;i<argc;i++) printf(" %s",argv[i]);
return 0;
}

上記のC言語で書いた実行ファイルをCGIにしています。いろいろ勉強して経験値を積んでいるところです。このCGIについて,次のように引数を付けて読んでみると,
<!--#exec cgi="/cgi-bin/hello.exe?ryo+kei+yoko"-->
<!--#exec cgi="/cgi-bin/hello.exe ryo kei yoko"-->
[an error occurred while processing this directive]というエラーになります。そもそも,SSIでCGIを実行するとき引数は付けられないのでしょうか?実は,練習用にカウンタを自作したのですが,その書式を引数で渡そうと考えて行き詰まりました。別の方法でもいいので,ブラウザ訪問者のアクション(クリックなど)なしで,引数を渡せないものでしょうか。

/*hello.exeのソース*/
#include <stdio.h>
int main (int argc,char* argv[])
{
int i;
printf("Content-type: text/html\n\n");
printf("Hello");
for(i=1;i<argc;i++) printf(" %s",argv[i]);
return 0;
}

上記のC言語で書いた実行ファイルをCGIにしています。いろいろ勉強して経験値を積んでいるところです。このCGIについて,次のように引数を付けて読んでみると,
<!--#exec cgi="/cgi-bin/hello.exe?ryo+kei+yoko"-->
<!--#exec cgi="/cgi-bin/hello.exe ryo kei yoko"-...続きを読む

Aベストアンサー

サーバーの種類が書かれていないので、Apacheで説明します。

cgiではなくvirtualを指定してみてください。
<!--#exec virtual="/cgi-bin/hello.exe?ryo+kei+yoko"-->
環境変数"QUERY_STRING"に入りますので、

#include <stdlib.h>
getenv('QUERY_STRING')

で受け取ることが出来ると思います。

> int main (int argc,char* argv[])
この書き方をするなら、
exec cmdで記述するとmain()の引数として受け取れます。
<!--#exec cmd="/cgi-bin/hello.exe ryo kei yoko"-->
という記述になります。
(コマンドプロンプトから起動するときの引数と同じ記法です)
Apache Foundationではcmdでの起動は推奨(virtualのほうが十分なテストを行われているため)されていませんし、
一部のホスティングサービスではcmdを禁止しています。

サーバーの種類や設定にも関係しますので、
それらも書いた方がより的確な答えが得られると思います。

サーバーの種類が書かれていないので、Apacheで説明します。

cgiではなくvirtualを指定してみてください。
<!--#exec virtual="/cgi-bin/hello.exe?ryo+kei+yoko"-->
環境変数"QUERY_STRING"に入りますので、

#include <stdlib.h>
getenv('QUERY_STRING')

で受け取ることが出来ると思います。

> int main (int argc,char* argv[])
この書き方をするなら、
exec cmdで記述するとmain()の引数として受け取れます。
<!--#exec cmd="/cgi-bin/hello.exe ryo kei yoko"-->
という記述になります。
...続きを読む


このカテゴリの人気Q&Aランキング

おすすめ情報