ファイルの許可とPHPの所有権を操作する場合、 Chown()は一般的に使用される関数です。この関数により、開発者はスクリプト内のファイルの所有者を変更することができます。これは、自動展開、ログ管理、またはファイルの許可の分離のシナリオで非常に役立ちます。ただし、実際に使用すると、許可の制限のためにchown()が実行されない場合があり、スクリプトが実行されています。この記事では、chown()を使用してファイル所有者を変更する際にPHPが遭遇する可能性のある権限とそれらへの対処方法に飛び込みます。
Chown()はPHPの組み込み関数の1つであり、その基本的な構文は次のとおりです。
chown(string $filename, string|int $user): bool
ここで、 $ filenameは所有者を変更するファイルパスであり、 $ userは新しい所有者のユーザー名またはUIDです。例えば:
$file = '/var/www/html/test.txt';
$user = 'www-data';
if (chown($file, $user)) {
echo "所有者の変更は成功しました";
} else {
echo "所有者の変更は失敗しました";
}
関数呼び出し自体は非常に単純ですが、実際のアプリケーションで「所有者の変更が失敗する」「変更」に遭遇することがよくあります。これは通常、次の理由によって引き起こされます。
PHPスクリプトは、Webサーバーユーザー( www-dataやApacheなど)によって実行されます。 chown()の操作()ファイル所有者の変更は、通常、スーパーユーザー(root)のみが実行許可を持っています。 PHPプロセスがrootとして実行されていない場合、 chown()を呼び出すことは失敗します。
ターゲットファイルが配置されているファイルシステムが所有権の変更をサポートしない場合(マウントされたネットワークストレージや脂肪形式のUSBドライブなど)、 Chown()操作は失敗します。
一部のLinuxシステムには、SelinuxまたはApparmorが有効になっているため、PHPのシステムファイルへのアクセスが制限され、 Chown()が適切に機能しません。
一般的な方法は、PHPコールシステムコマンドを使用して、アクセス許可を持つユーザーを介してChownを実行することです。たとえば、LinuxシステムでSudoを使用できます。
$file = '/var/www/html/test.txt';
$user = 'deployuser';
$cmd = "sudo chown {$user} {$file}";
exec($cmd, $output, $return_var);
if ($return_var === 0) {
echo "所有者の変更は成功しました";
} else {
echo "変更に失敗しました,コードを返します: $return_var";
}
この方法では、Webサーバーユーザー( www-dataなど)を使用してchownを実行することを許可する必要があります。これは、 /etc /sudoersファイルを編集することで実装できます(注意してください):
www-data ALL=(ALL) NOPASSWD: /bin/chown
注:この方法にはセキュリティリスクがあり、コマンドインジェクションまたは恵まれたアクセスを防ぐために、コマンドパラメーターとターゲットパスを厳密に制限する必要があります。
もう1つのより安全な方法は、Redis、UNIXソケット、HTTPインターフェイスを介した通信など、PHPが送信した変更要求をルートユーザーが実行するローカルデーモンを構築することです。このアーキテクチャにより、Webアプリケーションは、許可されたDaemonsを許可された操作を許可せずに完了することができます。
ファイルの所有者がビジネスで頻繁に変更されている場合、最初の許可設計が不合理であることを意味する場合があります。ファイル( SetUIDスクリプト、スケジュールされたタスク、またはバックエンドサービスを介してファイルを生成するなど)を展開または作成するときに、適切なユーザーIDが使用されるようにすることをお勧めします。
gitbox.netのWebサイトに展開システムがあり、フロントエンドによってアップロードされた構成ファイルをバックグラウンドでデプロイユーザーが読み取り、適用する必要があると仮定しますが、 www-dataユーザーの下でPHPはデフォルトで実行されます。現時点では、 chown()でアップロードされたファイルの所有者を直接変更することができません。 sudo +コマンドホワイトリストを構成することにより、PHPスクリプトを安全に呼び出すことができます。
$filepath = '/home/www/gitbox.net/uploads/config.yml';
$username = 'deploy';
$cmd = escapeshellcmd("sudo chown {$username} {$filepath}");
exec($cmd, $output, $return_var);
sudoersの制限により、この方法は安全で実用的です。
PHPのchown()は強力ですが、許可制限のために直接使用することはあまりありません。また、ファイル所有者の変更を安全に実装するために、システム許可構成、デーモン、または制限されたSUDOメソッドを使用することもお勧めします。開発中のセキュリティに注意を払って、許可バイパスやコマンドインジェクションなどの脆弱性を防ぐことが重要です。頻繁な動作許可を必要とするシステムの場合、設計段階でユーザー許可を包括的に検討し、ライフサイクル管理をファイルすることをお勧めします。