2

おそらく、php の chmod() 関数がどのように機能するかを理解していませんが、TRUE (成功を示す) を返しているにもかかわらず、実際にはアクセス許可を変更していません。

Web サーバーの tmp ディレクトリにアップロードされたファイルを操作しています。

    $fn = $value["tmp_name"];
    $fps = fileperms($fn);

    $testMsg .= "file permissions are $fps\n";        
    $testMsg .= "(which is " .  substr(sprintf('%o', $fps), -4) . ")\n";

    $arr = posix_getpwuid(fileowner($fn));
    $testMsg .= "file owner is " . $arr["name"] . "\n";

    $testMsg .= "running as: " . trim(shell_exec('whoami')) . "\n";


    //can i chmod it?
    $didChmod = chmod($fn, 0644);
    $testMsg .= "chmod: $didChmod\n";
    $fps = fileperms($fn);
    $testMsg .= "NEW file permissions are $fps\n";        
    $testMsg .= "(which is " .  substr(sprintf('%o', $fps), -4) . ")\n";

上記の出力は次のとおりです。

file permissions are 33152
(which is 0600)
file owner is www-data
running as: www-data
chmod: 1
NEW file permissions are 33152
(which is 0600)

ご覧のとおり、chmod() は成功を報告しましたが、パーミッションは変更されませんでした。

ありがとう

4

1 に答える 1

0

説明書より

現在のユーザーは、PHP を実行するユーザーです。通常のシェルや FTP アクセスに使用するユーザーとは異なる可能性があります。モードは、ほとんどのシステムでファイルを所有するユーザーのみが変更できます。

このスクリプトが Web サーバーによって実行されている (つまり、ブラウザー経由でアクセスされている) 場合、この PHP スクリプトは間違ったユーザーとして実行されます。ファイルの所有者 (またはルート) のみが chmod を使用できます。Web サーバーはおそらく www-data または何かとして実行されているため、chmod へのアクセス許可がありません。

于 2013-08-28T15:34:46.507 に答える