• ベストアンサー

パーミッション600でもブラウザからアクセス出来る

いつもお世話になります。 1.FTPでtest.lzhというファイルをアップし、パーミッションを600にしたもの 2.perlで組んだファイルアップロードCGIを使ってtest.lzhを1と同様の場所にアップしたもの(perlでchmodで600に) ブラウザ上から1の場合はアクセス拒否されるのですが、2の場合は普通にアクセス出来てしまいます。 所有者が異なると、同じパーミッションでも違う動きをするのでしょうか? 2のケースでもアクセス拒否させる方法はあるのでしょうか? 基本的な考え方を間違えていたら済みません。 宜しくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

SuEXECモジュールが Apache に組み込まれている場合、 CGI に限り、そのスクリプトの所有者が実行する形となります。 質問者さまのサーバでは、SuEXECが導入されていないようです。 つまり、1の場合、test.lzh のパーミッションは 600 なので、 “所有者”しか読み込みと変更ができません。 ウェブサーバを介すると、ウェブサーバが読み込むので、 “その他”に分類されるアクセスであり、弾かれるということです。 2の場合は、スクリプトがウェブサーバによって実行された為、 アップロードされた test.lzh の所有者はウェブサーバと同一になります。 そうなると、600 というパーミッションで制御していても、 所有者であるウェブサーバを介すると読み込めてしまいます。 対処法ですが、SuEXEC 環境でない限り、 パーミッションでの制御は難しいと思います。 アップロード先のディレクトリを public_html より上にする等、 工夫をすれば良いかもしれません。

mm666
質問者

お礼

tamahiro22さま、ありがとうございます。 > 2の場合は、スクリプトがウェブサーバによって実行された為、 > アップロードされた test.lzh の所有者はウェブサーバと同一になります。 > そうなると、600 というパーミッションで制御していても、 > 所有者であるウェブサーバを介すると読み込めてしまいます。 このあたりが全く理解出来ていませんでした。 今回教えて頂き、駄目だった理由を知る事が出来ました。 ありがとうございます。 教えて頂いたように、アップロード先をwebからアクセス出来ない階層とする事で対応したいと思います。

その他の回答 (2)

回答No.3

他の方も書かれているようにSuEXECでは無いとして FTPなど(或いは読むための専用CGI)だけで読めてwebからは読めなくするには 1. #2さんの書かれた公開ディレクトリ以外の場所に保存する 2. file名の頭に . をつけると通常はアクセス出来ません 3. fileを暗号化する http://www.sea-bird.org/doc/Solaris8/Perl_1.html 例えば ユーザー:tarou other:apache で質問のような形でアップロードされたFileは SuEXECの場合 所有者:tarou パーミッション:600 ですが SuEXECでない場合 所有者:apache パーミッション:600 となり  FTPなどでユーザーtarouでログインして見た場合   パーミッションが逆に 006 になってしまうと思います。 またother権限で動いているCGIによってfileを 所有者:tarou にすることも出来ないはずです

mm666
質問者

お礼

umasikajiroさま、ありがとうございます。 今回、webからアクセス出来ないところに保存する方法を取ろうと思いますが、ファイルの先頭に「.」を付ける方法、暗号化の方法などもあると分かり、とても助かります。 また、SuEXECの場合とそうでない場合の説明も大変分かりやすく、 動きが理解出来ました。ありがとうございます。 > またother権限で動いているCGIによってfileを 所有者:tarou にすることも出来ないはずです 当初所有者を変えればいいと思ってchownを試していたのですが、おっしゃる通り所有者を変える事は出来ませんでした。 沢山のアドバイスをありがとうございました。

  • shimix
  • ベストアンサー率54% (865/1590)
回答No.1

CGIがsuExecで動作するサーバであれば、2のケースでも1と同様のownerになるのではなかったでしょうか・・。 サーバの設定がわからないので、そのあたりの情報を書いていただけるといいかもしれません。

mm666
質問者

お礼

shimixさま、ありがとうございます。 情報が少なくて申し訳ありませんでした。 サーバはsuExecではないという事でした。 suExecならば上手く行ったはずなのですね…残念です。 でも駄目な理由が分かってスッキリしました。

関連するQ&A

専門家に質問してみよう