PHPを使用したコマンドの実行:一般ユーザーを使用しますが、ホームディレクトリは/ rootです。

PHPを使用したコマンドの実行:一般ユーザーを使用しますが、ホームディレクトリは/ rootです。

私はApache + PHPのカスタムコンパイルインストールを使用しており、ポートをリッスンしています80

Apacheは、正しい設定UserGroupファイルを使用して通常のユーザーとして実行するように構成されていますhttpd.conf

Apacheをサービスとして実行した後、rootはapachectl1つのプロセスをhttpd実行し、通常のユーザーは残りの4つのプロセスを実行します。

問題はこれである:

  • PHPを介して外部コマンドを実行すると(たとえば、または使用されているexecpassthru、正しいプレーンユーザーが実行しますが、$HOME環境変数は/root

たとえば、次のような非常に単純なコードを使用します。

<?php
echo "Home: " . `echo \$HOME`;
echo "<br />";
echo "Id: " . `id`;

私は得る:

Home: /root
Id: uid=1000(normaluser) gid=100(users) groups=100(users),17(audio),33(video)

この方法で実行されるすべてのコマンドは実際には通常のユーザーによって実行されるため、セキュリティ上の問題はありません。主な問題は、外部コマンドを実行すると、そのコマンドがホームディレクトリから何かを書いたり読み込もうとしたりすることです。

答え1

私はシェルが起動されたもの(Apacheプロセス)によってecho $HOME設定された環境変数だけを読みたいと思います。httpd何も起こらない限り、export HOME=/home/whatever環境変数 HOME の値は変更されていません。

最後の段落が正しいかどうかはわかりません。セキュリティ上問題がない場合にPATH設定されていますかnormaluser? /home/normaluser/binに、システム上lsのすべてのファイルに対してダウンロード可能なHTTP出力を生成するなど、特別な操作を実行できる非常に特別な実行可能ファイルが含まれている場合はどうなりますか?私のApache / PHP設定で/usr/local/bin:/bin:/usr/bin:/u/bediger/binPHPプログラムのPATHは 。

主な問題、つまりホームディレクトリから何かを読み書きすることに対するあなたの主張も意味がありません。部分的に完全修飾されたファイル名の場合、HOME値は重要ではありませんが、現在の作業ディレクトリは重要です。httpd私のテストPHPプログラムに対して正しく設定されているようです。 My Apache / PHP設定は、現在の作業ディレクトリをMy PHPのあるドキュメントルートに設定します。

<html>
<head><title>Test</title></head>
<body>
<p>
<?php
    echo "Home: " . `echo \$HOME`;
    echo "<br />";
    echo "Id: " . `id`;
    echo "<br />";
    echo "PWD: " . `pwd`;
    echo "<br />";
    echo "PATH: " . `echo \$PATH`;
?>
</p>
</body>
</html>

関連情報