1

suPHP 用の PHP セッションをセットアップしようとしています (こちらを参照)。suPHP が開始されたときに正しいユーザーに対して実行されるように、php 検証ファイルをユーザーが所有する必要があります。ただし、ユーザーがそのファイルにアクセスできるようにしたくありません。実際にデータベースをチェックするのではなく、true を返すように編集できるからです。

私の最初の試みは次のようなものでした(Apacheが user として実行される場合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 を に設定してファイル/を更新したくないので、修正されません (これを修正するつもりはありません)。したがって、代わりに私はそのように移動しました(少し面倒です、私は知っています)suphp.confcheck_vhost_docroot=false/etc/validate/var/www

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

したがって、検証ファイルは

  1. docroot 内
  2. user1 が所有
  3. user1 は編集できません

しかし、ページを読み込もうとすると、次のエラーが表示されます

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たためです。権限を から に変更する07000755、suPHP エラーに戻りました。そこで問題は次のようになります: suPHP のアップステージ ディレクトリの 1 つが他の誰かによって所有されている場合、どのようにすれば suPHP にスクリプトを実行させることができるでしょうか?


編集: Apacheが不平を言っている理由がわかりました。入り込めなかった

4

3 に答える 3

1

これに関する公式リンクは見つかりませんが、このサイトによると:

すべてのファイルとディレクトリは、「nobody」やその他の名前/番号ではなく、ユーザー名によって所有されている必要があります。あなたが所有していない場合、suPHP はスクリプトの実行を拒否し、「Internal Server Error 500」を生成します。

ファイルは理解できますが、ディレクトリがあなたのものである必要はないと思います。オンラインで 1 つのパッチを見つけました (こちらを参照)。ただし、まだテストしていないため、機能するかどうかはわかりません。

編集:ユーザーが docroot の外部のスクリプトにアクセスできるようにする方法があります (経由suPHP_GlobalDocRoot)。私はそれを機能させることができません.Apacheはそれが構文エラーであると主張しています. いずれ0111にせよ、それが機能したとしても、少なくとも.0555/

したがって、私の問題に対する解決策は絶対にないと確信しています。したがって、私はこれを答えとして受け入れています。誰かがなんとか答えてくれた場合は、別の答えを選択します。

于 2012-03-05T03:38:13.767 に答える
0

私は間違っている可能性がありますが、suPHPが私の覚えているように機能する場合、PHPはApache(www-data)としてではなく、ユーザー(この場合はuser1)の下で実行されています。検証ファイルへの書き込みアクセス権があり、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実行可能である必要があるため、スクリプトの場合は機能しない可能性があります。ここにいる他の誰かが確認できるかもしれません。

于 2012-03-05T03:00:08.723 に答える
0

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

  • PHP スクリプトは、特権のない UID によって所有されている必要があります
  • / に戻るパスは、同じ UID またはルートによって所有されている必要があります。
  • スクリプトまたは親ディレクトリが他のユーザー UID によって書き込み可能でない場合。
  • スクリプトはユーザー UID で実行されます。

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

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

私の簡単な質問は、なぜあなたはここで達成しようとしていることを行うために、PHP、または少なくとも suPHP で確立された PHP ハンドラーを使用しているのですか? ユーザーおよびユーザー特権関数用に PHP を保持します。これらの「体系的な」関数には、CGI スクリプトまたは RewriteMap と prg: オプションを使用します。これはphp-cliを使用して実行されるため、これが好みの言語である場合は、PHPで簡単に実装することもできます。Map prg 関数の書き方に関するチュートリアルはたくさんあります。それらは非常に簡単に実装できます。

于 2012-03-06T00:17:37.177 に答える