2012-03-05 8 views
1

suPHPのPHPセッションを設定しようとしています(here参照)。 suPHPが起動したときに正しいユーザーのために実行するように、私は自分のPHP検証ファイルを所有する必要があります。しかし、私はまた、ユーザーがそのファイルo.wにアクセスすることを望まない。実際にはデータベースをチェックするのではなく、単にtrueを返すように編集することができます。他のユーザーのフォルダに入ることを許可しない

私の最初の試みは、(Apacheはユーザーwww-dataとして実行)このようなもの

/etc/validate 
├── [drwx------ www-data ] user1 
│   └── [-rwx------ user1 ] validate.php 
/var/www/ 
└── [drwx------ user1 ] user1 
    └── [-rwx------ user1 ] index.html 

が続いてWebページが/var/www/user1/index.html

RewriteCond %{REQUEST_URI} !^/xyz 
RewriteRule ^(.*) /etc/validate/user1/validate.php?uri=$1 
を返し、その後、検証します検証ページにリダイレクトしていました

しかし、suPHPは私のdocroot(/var/www/user1)の外に何かにアクセスしていると訴えています。 docrootをに設定し、check_vhost_docroot=falseが更新されないように​​3210ファイルを更新しないようにしたいと思います(これを修正するつもりはありません)。そのため、代わりに私はドキュメントルート内だから今検証ファイルが

  1. である(それは私が知っている、少し厄介だ)ので、同じよう/var/wwwにuser1の
  2. が所有
  3. /var/www/ 
    └── [drwx------ user1 ] user1 
        ├── [-rwx------ user1 ] index.html 
        └── [dr-x------ www-data ] validate 
         └── [-rwx------ user1 ] validate.php 
    

    /etc/validateを移動しましたuser1で編集できない

しかし、今ページを読み込もうとすると、 e。次のエラー

Directory /var/www/user1/validate is not owned by user1 

私がロードしようとすると、この時点で私は私の忍耐を失っていますので、ファイル構造がそう

/var/www/ 
└── [drwx------ user1 ] user1 
    ├── [-rwx------ user1 ] index.html 
    └── [dr-x------ www-data ] validate 
     └── [drwx------ user1 ] dummy 
      └── [-rwx------ user1 ] validate.php 

のように見えるので、私はそこに別のダミーのフォルダを貼り付けApacheは、「あなたはこのサーバ上のxyzにアクセスする権限がありません」と言っています。ここでxyzは私のドメイン名の後ろのものです。私はではないので、はファイル/フォルダとして末尾の値にアクセスしようとしているので、なぜApacheが私に言っているのかわかりません。私は、リダイレクトは失敗していると思うし、Apacheは単にそれが失敗しているハードリンクだと仮定します。

私が間違っていることを教えてくれる人や、ユーザーがファイルを編集できないようにする別の方法を教えてもらえますか?ディレクトリdummyにアクセスできませんでした。そのアクセス許可はrwx------で、user1しかcdになりませんでした。アクセス許可を0700から0755に変更したとき、suPHPエラーに戻りました。ですから、疑問は次のようになります。舞台裏ディレクトリの1つが他の誰かによって所有されている場合、suPHPにスクリプトを実行させるにはどうすればよいですか?


EDIT: Apacheが文句を言った理由を私は今、実現しています。

答えて

0

私は間違っている可能性がありますが、もしsuPHPが覚えているとしたら、PHPはユーザ(この場合はuser1)の下でApache(www-data)データ)は、検証ファイルへの読み取りおよび書き込みアクセス権を持つ唯一のものであり、user1はwww-dataではありません。

解決策は、すべてのユーザーにwww-dataの検証と書き込みの許可を与えることだけです。したがって:

/var/www/ 
└── [drwx------ user1 ] user1 
    ├── [-rwx------ user1 ] index.html 
    └── [dr-x---r-- www-data ] validate 
     └── [-rwx------ user1 ] validate.php 
上記を使用して、user1は検証ファイルを編集することはできません。

あなたはまた、しようとする場合があります:

/var/www/ 
└── [drwx------ user1 ] user1 
    ├── [-rwx------ user1 ] index.html 
    └── [dr-x-----x www-data ] validate 
     └── [-rwx------ user1 ] validate.php 

私はいつもどのように動作するかを正確に「実行」に混乱が、私はアイデアは、ファイルがユーザーによって(実行)を実行することができるということであると信じて、ではありません読んだり書いたりする。しかし、これにはvalidateが実行可能である必要があります。したがって、スクリプトの場合は動作しない可能性があります。ここの誰かが確認できるかもしれません。私はこのための公式のリンクを見つけることが、thisサイトによるとすることはできません

+0

私はsuPHPがrootとして実行されていることを確認してから、実行する前にファイルのユーザーに切り替えます。どちらの場合でも、 'chmod 0777 validate /'を実行しても問題は解決されませんでした。所有者を 'user1'に戻してから、他人(' 0755')の書き込み権限を取り除くと問題は解決します(*私の*問題ではありません) – puk

1

すべてのファイル&ディレクトリは「誰」またはいくつかの他の名前/番号ユーザー名が所有していない、とないしなければなりません。あなたが所有していない場合、suPHPはスクリプトの実行を拒否し、 "Internal Server Error 500"を生成します。

私はファイルを理解することができますが、あなたの所属するディレクトリが必要ないとは限りません。私は1つのパッチをオンラインで見つけましたが(here参照)、まだ動作しているかどうかはわかりません。

EDIT:ユーザが(suPHP_GlobalDocRoot経由で)docroot以外のスクリプトにアクセスできるようにする方法があります。私はそれが私のために働くようにすることはできません、Apacheは構文エラーと主張しています。いずれにせよ、たとえそれが動作したとしても、少なくともまでのすべてのディレクトリに対して、少なくとも0111のアクセス権(および可能であれば0555)を実行する必要があります。

したがって、私は確かに私の問題の解決策があると確信しています。私はこれを答えとして受け入れています。もし誰かがそれを提供してくれたら、私は別の答えを選択します。

+0

suphp開発者のDLに従えば、そうしないと、悪用可能な脆弱性に晒されます。他のツリーに書き込み可能なディレクトリがあると、そのファイルを編集してシンボリックリンクをURIとして実行します。他の人の資格情報で実行しています。 Nahhhh - これが起こるのを許可したくないのですか? – TerryE

+0

@TerryEあなたは「他の人の資格情報」であなたが本当に走っていますか?あなたはまだ自分自身でスクリプトを実行しているので、例えば自分のファイルを削除することはできません – puk

+0

[mod_suphp.c code](https://ssl.marsching.biz/subversion/suphp/trunk/src/)を見てください。 apache2/mod_suphp.c)。 'suPHP_GlobalDocRoot'はありません。あなたは「自分」という意味ですか? Apacheはwww-dataとして動作します。 '/ usr/lib/suphp'はルート所有のSUIDビットファイルです。 「あなた」は、スクリプトを発行した人ではなく、スクリプトのUIDによってのみ確立されます。 – TerryE

0

suPHPにはいくつかの設定オプションがありますが、それらがなければ私は正確な答えを出すことができませんので、あなたが設定していないとかなり標準的な設定をしていると仮定します。非常に厳密には、非常に多くの悪用可能な穴を導入して、それを使用する際にはあまり意味がありません。

  • PHPスクリプトが非特権UID
  • 後方へのパスが所有しなければならない/同じUIDまたはルートによって自身でなければなりません。
  • スクリプトまたは任意の親ディレクトリに他のユーザーのUIDが書き込み可能な場合。
  • スクリプトはユーザーのUIDで実行されます。

これはsuPHPの正式保証モデルの一部です。変更する場合は、suPHPを使用しないでください。

ユーザーはPHP.iniを読み込むための独自のパスを定義できます。デフォルトでは、ユーザーはカスタムphp.iniとIIRCを指定できます。suPHP_ConfigPathオプションを無効にすることはできません。結局のところ、一日の終わりには、ユーザーUIDでphp-cgiを実行しています。つまり、auto_prepend_file(rootが所有し、UIDによって書き込み可能ではない)を設定しても、知識のあるユーザーはこれをバイパスすることができます。

私の単純なQは、あなたがここで達成しようとしていることを実行するためにPHPを使用しているのですか、または少なくともsuPHPがPHPハンドラを確立していますか?ユーザとユーザ特権​​機能のためにPHPを使用してください。これらの "systemy"関数には、CGIスクリプト、またはRewriteMapとprg:オプションを使用してください。これがあなたの好みの言語であれば、PHPでこれを簡単に実装することもできます。これはphp-cliを使って実行されるからです。マップのprg関数の記述方法に関するチュートリアルがたくさんあります。彼らは実装がかなり簡単です。

+0

最後の段落で私を失った。 「ユーザ特権​​機能」とは何ですか? "RewriteMap"または "systemy関数"とは何ですか? suPHP上でCGIを使うのはなぜですか?またはphp-cli?また、「Map Prg関数」とは何ですか? – puk

+0

私の動機はこれらのサイトで説明されています:http://stackoverflow.com/questions/9542263/need-help-implementing-php-sessions-in-suphp and http://stackoverflow.com/questions/9533150/is-there -any-security-with-suphpとhttp://stackoverflow.com/questions/8032140/implementing-log-in-alongside-suphp – puk

+0

@puk、以下のコメントは、あなたがサーバーを持っていないことを示しています人。 "あなた"は存在しません。 ApacheのUID、ルート、およびスクリプトのUIDがあります。他のすべてのUIDは攻撃者です。スクリプトdirから/へのパスは、スクリプトUIDまたはrootによって所有されている必要があります。私はRewriteMapなどのApacheのドキュメントへのリンクを下の答えで与えています。私は他の質問を見てみましょう – TerryE

関連する問題