phpがどのユーザーとして実行されているかを確認する方法は?


115

PHPが実行されていないかどうかを検出する必要があります。どうすればよいですか?

「誰も」の他の名前はありますか?「アパッチ」?他のもの?


「他に名前はありますか?」という質問とはどういう意味ですか?システム管理者は、好きな名前でユーザーを作成できます。
アルバロゴンサレス

サーバーと見なされる可能性のあるその他のデフォルト名。apacheの、誰もいない、WWW-データ、など。
ウェスリー

1
私が正しく思い出せば、システムユーザーは通常、小さいUID(1024未満?)を持っています。それはあなたが達成しようとしているもののためのより良い手がかりかもしれません。
アルバロゴンサレス


9
get_current_user()は、phpが現在実行されているユーザーではなく、現在のスクリプトの所有者を返します。
Dima L.

回答:


85

利用可能な場合は、現在のユーザーアカウントをプローブしてposix_geteuid、でユーザー名を取得できます posix_getpwuid

$username = posix_getpwuid(posix_geteuid())['name'];

ただし、セーフモードで実行している場合(execが無効になっている場合がよくあります)、PHPプロセスがデフォルトwww-dataまたはapacheアカウント以外で実行されていることはほとんどありません。


10
このアプローチを示すマンページにコメントget_current_user()があります。:PHP 5.4の時点で、それはこれに短縮することが可能print posix_getpwuid(posix_geteuid())['name'];
Palec

209

<?php echo exec('whoami'); ?>


1
exec、system、またはそのようなパススルー関数を実際に使用することはできません。
ウェズリー、

ちょうど私が必要としたものでした。get_current_user()は、私が絶対に必要なものではありませんでした。
dgig

5
一部のユーザーに役立つ場合があります。これをコマンドラインインターフェースから実行すると、PHPユーザーではなく、コマンドを実行するユーザーが取得されます。
Bram Vanroy 2016

@BramVanroyでは、どこで実行する必要がありますか?= |
Andrew

@BramVanroy-コメントを理解したいのですが、理解できません。あなたがcliからそれを実行するならば、あなたは現在のphpプロセスを所有していませんか?この場合、あなた以外のPHPユーザーは誰ですか?
Billynoah 2018

72

一種の逆方向の方法ですが、exec / systemなし:

file_put_contents("testFile", "test");
$user = fileowner("testFile");
unlink("testFile");

ファイルを作成する場合、所有者はPHPユーザーになります。

これはtempnam()、一時ディレクトリにランダムファイルを作成し、そのファイルの名前を返すなどの一時ファイル関数で実行することもできます。アクセス許可open_basedirやセーフモードなど、ファイルの書き込みを妨げる問題が発生した場合でも、通常、一時ディレクトリは引き続き許可されます。


2
非常に賢いクロスプラットフォームソリューション。ボー!
Matt Fletcher

3
ニース:PHPが実行されているグループを見つけるための、ここでは唯一の非特権ソリューション。
tanius 14

2
価値のあるハック、高い場所に値する
アブラハムフィリップ

1
@RavinderPayal私が提案したようにtempnam関数を使用しない限り。ユーザーが誰であるかに関係なく、ユーザーが一時ディレクトリに書き込むことができることがほぼ保証されています。一時ディレクトリに書き込むことができない場合、一時的にフォルダーに777のアクセス許可を与えることができ、有効になっている場合は、そのパスのselinuxを無効にします。
Jonathan Kuhn

1
@RavinderPayal一時パスを返す追加の関数があります。したがって$temp_file = tempnam(sys_get_temp_dir(), 'TMP');、ほとんどすべてのシステムの一時ディレクトリに一時ファイルが作成されます。その後、そのファイルを使用してユーザー/グループを取得できます。その一部をユーザーに任せて理解しました。
Jonathan Kuhn

20

詳細は有用ですが、それがLinuxシステムであり、phpがapacheの下で実行されていると仮定すると、ユーザーapacheと同じように実行されます。

チェックする簡単な方法(UNIXのような環境を想定している)は、次のようにphpファイルを作成することです。

<?php
    print shell_exec( 'whoami' );
?>

これはユーザーに与えます。

私のAWSインスタンスでは、apacheこのスクリプトを実行すると出力として取得されます。


16

次のようにバックティックを使用してみることができます:

echo `whoami`;

7
上記の質問の複製です。
volter9 2014

2
一部のユーザーに役立つ場合があります。これをコマンドラインインターフェースから実行すると、PHPユーザーではなく、コマンドを実行するユーザーが取得されます。
Bram Vanroy 2016

12

私は使うだろう:

lsof -i
lsof -i | less
lsof -i | grep :http

これらのいずれか。sshコマンドラインにemと入力すると、どのユーザーがどのサービスをリッスンしているかがわかります。

このファイルにアクセスして確認することもできます。

more /etc/apache2/envvars

これらの行を探します:

export APACHE_RUN_USER=user-name
export APACHE_RUN_GROUP=group-name

envvarsファイルのデータを除外するには、grepを使用できます。

 more  /etc/apache2/envvars |grep APACHE_RUN_

1
grep "APACHE_RUN_" /etc/apache2/envvarsありがとうございます。
Tarik

11

exec('whoami') これを行います

<?php
echo exec('whoami');
?>

exec、system、またはそのようなパススルー関数を実際に使用することはできません。
ウェズリー、

@ウェズリー:それは不可能です。
ジェネシス

2
一部のユーザーに役立つ場合があります。これをコマンドラインインターフェースから実行すると、PHPユーザーではなく、コマンドを実行するユーザーが取得されます。
Bram Vanroy 2016


1

info.phpファイルを次のディレクトリに追加します-デフォルトのhttp / apacheディレクトリ-通常は/ var / www / html

以下の内容で

<?php                                                                           
phpinfo();                                                                    
?>  

次にhttpd / apacheを再起動して、デフォルトのhtmlディレクトリに移動します http://enter.server.here/info.php

PHPの系譜全体をお届けします!


3
そして、その出力のどの変数/値を探していますか?
Andrew

あなたはすでにこれを見つけたはずですが、そのページで「ユーザー」を検索しますか?
CRTLBREAK

0

私のセットアップでは、プロセスを開始する前に、現在のプロセスにフォルダー、サブフォルダー、およびファイルを作成する権限があるかどうかを確認し、できない場合は解決策を提案します。stat(<file>)アクセス許可が実行中のプロセスのアクセス許可と一致することを確認するために、さまざまなもので実行したいと思いました(php-fpmを使用しているため、プールによって異なります)。
マリオが上記で提供したposixベースのソリューションは完璧に見えますが、posix拡張が--disabledであるため、上記を実行できずwhoami、別のシェルで実行されているstat()を実行した結果と比較したいのでどちらも役に立ちません(ユーザー名ではなく、uidとgidが必要です)。

しかし私は、有益なヒントを見つけた私ができたstat(/proc/self)stat(/proc/self/attr)し、ファイルのuidとgidを参照してください。

それが他の誰かを助けることを願っています


0

次のコマンドを使用できます。

<? system('whoami');?>

または

<? passthru('whoami');?>

または

<? print exec('whoami');?>

または

<? print shell_exec('whoami');?>

または

<? print get_current_user();?>

get_current_user()は現在のユーザーを返しませ。これは、関数がで呼び出されたスクリプトの所有者を返します。
andsens

-1

私は通常使用します

<?php echo get_current_user(); ?>

お役に立てれば幸いです


これは質問の下のコメントですでに言及されており、スクリプトが実行されているユーザーとはほとんど関係がありません。
Palec 2016年

get_current_user() - Gets the name of the owner of the current PHP script- ではない PHPのプロセスを実行しているユーザー。
フランシスコサラボソ2017

-1
$_SERVER["USER"]

$_SERVER["USERNAME"] 

echo $_SERVER["USER"];機能しますが、SSHで現在ログインしているユーザー名が表示されます。
Tarik

-1

提案

少し遅れましたが、以下は回避策ですが、これは問題なく機能するため、要件を解決します。

<?
    function get_sys_usr()
    {
        $unique_name = uniqid();  // not-so-unique id
        $native_path = "./temp/$unique_name.php";
        $public_path = "http://example.com/temp/$unique_name.php";
        $php_content = "<? echo get_current_user(); ?>";
        $process_usr = "apache";  // fall-back

        if (is_readable("./temp") && is_writable("./temp"))
        {
            file_put_contents($native_path,$php_content);
            $process_usr = trim(file_get_contents($public_path));
            unlink($native_path);
        }

        return $process_usr;
    }


    echo get_sys_usr();  // www-data
?>


説明

上記のコードの強調表示は正確ではありません。お気に入りのエディターにコピーして貼り付け、PHPコードとして表示するか、自分で保存してテストしてください。

おそらくご存知のとおりget_current_user()、「現在実行中のスクリプト」の所有者を返します。つまり、サーバー上のスクリプトをweb-server-userに「chown」しなかった場合は、おそらく「nobody」、または開発者がユーザーが同じOS上に存在する場合は、そのユーザー名が表示されます。

これを回避するために、現在実行中のプロセスを含むファイルを作成します。もしあなただけのrequire()この現在実行中のスクリプトに述べたように、それは親スクリプトと同じように返されます。そのため、有効にするために別のリクエストとして実行する必要があります。

プロセスフロー

これを効果的にするために、「実行モード」を組み込んだ設計パターンを実行することを検討してください。サーバーが「開発モードまたはテストモード」の場合、サーバーだけがこの機能を実行してインクルードのどこかに出力を保存できます。 、またはプレーンテキストかデータベース、またはいずれか。

もちろん、より動的にするために、上記のコードの一部を変更できますが、ロジックは次のとおりです。

  • 他のユーザーとの干渉を制限する一意の参照を定義する
  • 一時ファイルを書き込むためのローカルファイルパスを定義する
  • このファイルを独自のプロセスで実行するためのパブリックURL /パスを定義します
  • スクリプトの所有者名を出力する一時的なphpファイルを書きます
  • リクエストを送信して、このスクリプトの出力を取得します
  • 不要になったファイルを削除します-必要に応じてそのままにします
  • リクエストの出力を関数の戻り値として返す

-1
<?php phpinfo(); ?>

info.phpとして保存し、

ブラウザでinfo.phpを開きます

次にctrl + fで次のいずれかを入力します。

APACHE_RUN_USER
APACHE_RUN_GROUP
user/group

ユーザーとグループapacheが実行されているのを確認できます。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.