私はApache + PHPのカスタムコンパイルインストールを使用しており、ポートをリッスンしています80
。
Apacheは、正しい設定User
とGroup
ファイルを使用して通常のユーザーとして実行するように構成されていますhttpd.conf
。
Apacheをサービスとして実行した後、rootはapachectl
1つのプロセスをhttpd
実行し、通常のユーザーは残りの4つのプロセスを実行します。
問題はこれである:
- PHPを介して外部コマンドを実行すると(たとえば、または使用されている
exec
)passthru
、正しいプレーンユーザーが実行しますが、$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/bin
PHPプログラムの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>