プロが教える店舗&オフィスのセキュリティ対策術

こんにちは。
perlのCGIでファイルをオープンする際のパス指定で悩んでいます。
cgiとは別のディレクトリにあるファイルをオープンしたいのですが、

このとき、
open(IN,"/home/XXX/YYY/ZZZ.dat");
というふうに絶対パスでオープンしようとすると、オープンできません。
一方、
open(IN,"../../../home/XXX/YYY/ZZZ.dat");
といった感じに相対パスにすると、オープンできます。
ファイルの場所は/home/XXX/YYY/ZZZ.datで間違いありませんし、
cgiとしてではなく、シェルから直接cgiプログラムを起動すると、
絶対パスでもオープンできます。

これはいったいどういうことが起こっているのでしょうか?
ご存知の方、ご解説願えないでしょうか。

A 回答 (3件)

> それに、アクセス権の問題なら、パスの指定方法で違いは出ないように思えるのですが、そういった可能性もあるのでしょうか?


それもそうですね。すみません。

とりあえず、$!などのエラーメッセージはどうなってますか?
ほかには -e でファイルを見つけることが出来るのかどうか、とか。
原因もわからずに対応は出来ませんので。

この回答への補足

>とりあえず、$!などのエラーメッセージはどうなってますか?

そうですね。基本的なことをやっていませんでした。
表示させてみたところ、エラーは"Permission denied"でした。

・・・・ということはやっぱりアクセス権?
で、調べてみましたところ、パスの途中のディレクトリ(この場合XXX)に読み込み許可がないものがありました。
drwxr-x---
原因はきっとこれだと思います。ありがとうございました。

でも・・・・指定方法によってアクセスできたりできなかったりと、これってセキュリティホールじゃないんでしょうか???

それとも、アクセス権の設定って、所詮この程度なのでしょうか?
また疑問が生じてしまいました。

OSはSolarisです。
/etc/releaseは
Solaris Express Developer Edition 1/08 snv_79b X86
Copyright 2008 Sun Microsystems, Inc. All Rights Reserved.
Use is subject to license terms.
Assembled 24 January 2008

です。なにかわかりますでしょうか?

補足日時:2008/08/01 18:10
    • good
    • 0
この回答へのお礼

この件については、おそらくCGIとは別カテゴリになるかと思いますでので、
ひとまず締め切ることとします。
ありがとうございました。

お礼日時:2008/08/06 10:00

シェルからは大丈夫なのにCGIスクリプトからはダメということは


サーバ(Apache?)が動いているコンピュータとシェルが動いている
コンピュータとが異なってマウントの位置が違っているとか...。
本当に合っているか

use File::Spec;
print File::Spec->rel2abs('../../../home/XXX/YYY/ZZZ.dat');

として調べてみたらどうでしょうか。
サーバの設定などによってはCGIの実行するディレクトリの起点が
ファイルのある場所と違う場合があります。
    • good
    • 0
この回答へのお礼

ありがとうございます。
コンピュータは一台だけです。
そういう可能性もあるのですね。

ひとまず原因はわかったのですが、新たな疑問が生じてしまいました・・・。

お礼日時:2008/08/01 18:36

ZZZ.datのアクセス属性は、CGIで実行されるユーザーでアクセスできるようになってますか?


nobody(非SuExec)なら0606または0666になると思います。

あと、この場合は絶対パスではなくフルパスと呼びます。
相対パスという呼び方はURLでもシェルでも同じです。

この回答への補足

>ZZZ.datのアクセス属性は、CGIで実行されるユーザーでアクセスできるようになってますか?

はい、なってます。
ls -lで見ると、
-rw-r--r--
と、表示されています。
それに、アクセス権の問題なら、パスの指定方法で違いは出ないように思えるのですが、そういった可能性もあるのでしょうか?

補足日時:2008/08/01 16:07
    • good
    • 0

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