プロが教えるわが家の防犯対策術!

自作のカウンターをSSIで設置するという前提では
『設置先のWebページ以外ではカウンターを作動
させない』または『設置先のWebページを経由して
いないアクセスにはエラーを返す』という方法は
無いでしょうか?

通常、出回っているカウンターはブラウザから
カウンターのURLを入力して直接カウンターCGIの
ファイルにアクセスしてもカウントされてしまい
ますが、このようなアクセスをカウントしない
カウンターを作りたいのです。

(実際にカウンターCGIファイルに直接アクセスして
 更新ボタンを押しまくるような人はまずいないと
 思いますが、自己満足のためにやってみようと
 思ったらできなかったため、気になって仕方が
 無いのです・・・。)

IFRAMEタグで設置するという前提では何とかなったの
ですが、SSIで設置する場合はブラウザからの直接
入力によるアクセスと設置先へのアクセスを見分ける
方法が思い付かず、どうにも上手くいきません。

SSIでも設置先のWebページでしか作動しない
カウンターCGIの組み方について、何か名案の
ある方がおりましたら、何卒ご指導いただけますよう
よろしくお願いします。

A 回答 (7件)

SSIなら <!--#exec cmd="~" --> として外部から見れないとこにスクリプトを置いとけばいいのでは?ドキュメントルート以下しか利用できない場合でも、CGIとして実行しないなら環境変数の中身が違うはずだから、その辺でチェックできると思います。

この回答への補足

回答ありがとうございます。

私が使っているレンタルサーバーではドキュメントルート以下でしか利用できませんでした。

「CGIとして実行しないなら環境変数の中身が違う」というのは具体的にどのような事なのでしょうか?
まだまだ勉強が足りないようで、せっかくお教えいただいたのに内容を今一つ理解できませんでした。

・カウンターCGIは実行しないとカウントアップも表示もできないのではないかと思うのですが、何か方法が
あるのでしょうか? 

・「実行しないなら環境変数の中身が違う」というのもそのメカニズムが分かりません。なぜ「実行しない
なら…」という限定が付くのでしょうか?

…自分でも色々と工夫してみますが、時間がありましたら上記2点についてお教えいただけると
助かります。よろしくご指導のほどお願いします。

補足日時:2005/11/14 18:18
    • good
    • 0

ちょっと調べてみたら、Windows用Apacheはバージョンによって、SSIのexec cmdでパスを認識しないバグ(セキュリティホール対策の仕様とも)があるらしいと書いてる掲示板がありました。

詳しくは分かりませんが。。。

で、もう僕も当てずっぽうですけど、パスの指定を
#exec cmd="C:\home\nexen\public_html\counterf\test.cgi"

#exec cmd="\home\nexen\public_html\counterf\test.cgi"
にしてみてはどうでしょうか?
また、shtmlファイルと同じディレクトリに置いて、パスなしでファイル名だけ指定したら動くかもしれません。
#exec cmd="test.cgi"

あるいは、
#exec cmd="perl C:\home\nexen\public_html\counterf\test.cgi"
と、実行するのをPerlにして、スクリプトはその引数にしてみるとか。
(ここでもPerl自体のパスやスクリプトのパスの指定方法を、いろいろ試してみてください。)

また、exec cmd自体が機能していないことも考えられるので、
#exec cmd="cd"
みたいにDOSコマンドを書いて確かめてみてください。

この回答への補足

長々とすみません。
毎回丁寧に対応していただきありがとうございます。

SSIタグの書き方については一通りやってみたのですがどれもNGでした。
古いバージョンのWindows用Apacheについては同様のことが書かれた掲示板を私も
見かけたのですが、"cd"でもNGだったので最新バージョンでもcmd自体は
使えないという線が濃いように思います。

最初にやろうとしていた事は現状では物理的に困難なようですが、まず可能か否かも
分からなかったし、不可能ならどこに原因があるのかも分からなかったので、
ここまで教えていただき痞えていたモノはスッキリ取れました。

本当にありがとうございます。

補足日時:2005/11/19 01:16
    • good
    • 0
この回答へのお礼

これほど丁寧に我慢強く対応していただいたことは今までありませんでした。
また、自分だけではどうにもならず本当に困り果てていたので、このように
アドバイスをもらえるありがたさも身に染みました。

これだけ人に頼らざるを得ないレベルで言うのもなんですが、今回の事を
忘れずにこれからもしっかり勉強して、いつか自分も困っている人を
助けてあげられるようになりたいと思います。

Hastyさん、本当にありがとうございました。

お礼日時:2005/11/19 19:35

> Perl.exeとPerl5.8.0.exeというのはあるのですが・・・。



それです。ActivePerlというのはディストリビューションで、インタプリタは上記のファイルになります。確か中身は一緒だったと思うので、Perl.exeを選べば大丈夫じゃないかと。

この回答への補足

毎回ありがとうございます。

関連付けはできたと思うのですが、やはりcmdはエラーのままです。

「あいうえお」と表示するスクリプト「test.cgi」を書いてカウンターの代わりに置いてみましたが、
<!--#exec cmd="C:/home/nexen/public_html/counterf/test.cgi"-->としても
『(OS 3)指定されたパスが見つかりません。Failed to read cgi file test.cgi for testing』
『(OS 3)指定されたパスが見つかりません。don't know how to spawn cmd child process: C:/home/nexen/public_html/test.shtml』
・・・という2行がエラーログに書き加えられるだけでした。

「test.shtml」のHTMLソースにはSSIタグは表示されていないのでSSIとしては
認識されているようです。

ちなみに、test.shtmlと同じディレクトリにcounterfというサブディレクトリを
用意し、そのサブディレクトリの中にCGI関連のスクリプトを置いているという状態です。

SSIタグの書き方やhttpc.confに間違いがあるのでしょうか?

補足日時:2005/11/18 16:48
    • good
    • 0

> XPでの.cgiのActivePerlへの関連付けの方法を詳しく教えていただけないでしょうか?



拡張子が.cgiのファイルを右クリックしてプロパティを開き、「プログラム」の右の方にある「変更」ボタンを押します。そこでActivePerlを選択すればいいように思うのですがどうでしょうか?

この回答への補足

それが・・・プロパティの変更ボタンからではActivePerlが見つからないのです。
C:\usr\local\binにPerl.exeとPerl5.8.0.exeというのはあるのですが・・・。

パソコン内で検索をかけてもActivePerlが見当たらないのです。
ActivePerlそのものは動いているのですが・・・。
全く・・・自分が情けなくなってきます。

あと少しだとは思うのですが、何とか辛抱強く教えていただけますよう、お願いします。

補足日時:2005/11/17 19:51
    • good
    • 0

> 実行できない場合、これを実行できるようにする方法はあるのでしょうか・・・?



Windowsだったらフォルダオプションのファイルの種類で、.cgiの規定のアクションをActivePerlでの実行にしてやればいいと思います。
Unix系だとしたら先頭に
#! /usr/bin/perl
などの行が入ってるはずですから、動かないとなるとちょっと分かりません。

この回答への補足

本当にありがとうございます。

少しは兆しが見えてきたと思ったのですが、Windowsのフォルダオプションで
.cgiの規定のアクションをActivePerlにすることができません。

フォルダオプション→ファイルの種類→新規として、cgiと入力→詳細を押して、
「関連付けられているファイルの種類」から「PERL」とか「PERL FILE」という
選択肢を選ぶというのが関連付けの方法として検索エンジンなどで調べたところ
分かったのですが、私のWindowsXPでやってみると「Perl script language」という
選択肢はあるのですが「PERL」と「PERL FILE」という選択肢は無いのです。

試しに「Perl script language」で関連付けてみたのですがNGで、ActivePerlに
問題があったかと思い、インストールし直したのですが
何も変わりませんでした。

Windows2000では関連付けの方法も検索できるのですが、XPで.cgiの規定の
アクションをActivePerlにする方法が見つかりません。

XPでの.cgiのActivePerlへの関連付けの方法を詳しく教えていただけないでしょうか?
頼りきりで本当に申し訳ありません。

補足日時:2005/11/17 16:58
    • good
    • 0

exec cmdはその名の通り「コマンドを実行する」ものなので、コマンドとして指定したパスはコンソール上から入力して実行できる必要があります。


絶対パスでもダメということは実行できないということなんじゃないかと思うので、その辺を確認してみて下さい。
(絶対パスってそのコンピュータ内のですよね?ドキュメントルートからのじゃないですよね?)

この回答への補足

度々ありがとうございます。

絶対パスはコンピュータ内のとドキュメントルートからの、両方試しましたがどちらもNGでした。
実行できない場合、これを実行できるようにする方法はあるのでしょうか・・・?

検索エンジンでも同じような質問が載っている掲示板はチラホラ見受けられるの
ですが、解決している掲示板は全く見当たらず途方に暮れています。

自力では何の収穫も得られないまま、ここまでお付き合いさせてしまい
申し訳ないのですが、寛容にお付き合いいただければ幸いです。

どうか宜しくお願いします。

補足日時:2005/11/17 09:58
    • good
    • 0

CGIとして実行しないだけで、スクリプトは実行します。


<!--#exec cgi="スクリプト名" --> とするとCGIとして実行されますが、
<!--#exec cmd="スクリプト名" --> とすればコマンドとして実行されます。
それぞれで環境変数の中身をファイルに書き出してみると良いと思います。

参考URL:http://www.tohoho-web.com/wwwssi.htm#Exec

この回答への補足

度々すみません。

「CGIとして実行しなければ」という意味は分かりました。
今までinclude virtual一本槍だったので目からウロコでした。ありがとうございます。

ただ、早速execコマンドで試してみたのですが、exec cgiなら正しく
実行されるのにexec cmdにするとエラーになってしまいます。

『(OS 3)指定されたパスが見つかりません。 : Failed to read cgi file・・・』
『don't know how to spawn cmd child process:・・・』
…という2行がセットになりエラーログに記されるという症状です。

<!--#exec cmd="スクリプト名">のスクリプト名の部分を絶対パスにしたり
相対パスにしたり、スクリプトをplファイルに書き変えてみたり…
参考URLを始めSSIについて書いてあるサイトを色々見ながら格闘してみたのですが
どうにもうまく行きません。

Apacheのhttpd.confも確認し、execコマンドは使えるようになっていたのですが、
exec cgiは使えてもexec cmdは使えないという事はあるのでしょうか?

ちなみに私の今のローカル環境はApache HTTP server2.0.45とActive Perl5.8です。
httpd.confは「http://127.0.0.1/~xxxx/」とブラウザに入力すればローカル環境で作った
サイトにアクセスできるよう設定してあります。

cmdがエラーになる原因として何か気になる点がありましたら
ご指摘いただけますよう、よろしくお願いします。

補足日時:2005/11/15 16:28
    • good
    • 0

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