ファイルをアップロードできる PHP スクリプトがあり、それを /tmp から test/ に移動しようとしています (プロジェクト フォルダーにある相対パス。たとえば、/var/www/html/myproject/test は絶対パス)。これが発生すると、次のエラーが発生します。
move_uploaded_file(test/test.csv): ストリームを開けません: /var/www/html/myproject/import.php、行 /import2.php
で権限が拒否されました。
このスクリプトは、/test の所有権 (Apache 所有者と Apache グループの両方がこのディレクトリを所有) と rwx 権限を持つ Apache ユーザーによって実行されます。
以下のことを確認しました:
- safe_mode が無効になっています。
- open_basedir が設定されていません。
- file_uploads が有効になっています。
- upload_max_filesize は 2MB で、ファイル サイズは ~50KB です。
- post_max_size は 8MB ですが、私の POST リクエストはこれに近くありません。
- 相対パスの代わりに絶対パスを使用してください。
- is_dir("test/") は true を返します。
- is_writable("test/") は false を返します。
- PHP スクリプト内: ファイル所有者 (移動するファイル)、フォルダー所有者 (test/)、ファイル権限、フォルダー権限を出力します。ファイル/フォルダーの所有者は apache として表示されます。ファイルのアクセス許可は 600 であるため、所有者は読み取りと書き込みができます。フォルダーのアクセス許可は 755 であるため、所有者は読み取り、書き込み、実行が可能です。
- ps -aux | grep apache。 Apache エラー ログ内の PID を、Apache ユーザーが所有する実行中のプロセスと照合します。これにより、プロセスが Apache で実行されていることを確認できます。
- getcwd() と
__DIR__
はどちらも正しいディレクトリ /var/www/html/myproject を返します。
- dirname(
__FILE__
) はファイルの正しい絶対パスを返します
- file_exists($_FILES['file']['tmp_name']) を確認すると true が返されます
- $_FILES['file']['error'] (移動したいファイル) をチェックすると 0 が返され、アップロードには問題ありません。
- is_writable("/tmp") を使用して、ソース フォルダー (/tmp) が書き込み可能かどうかを確認し、true を返します。
- test/ で chmod -R 777 を一時的に使用しようとすると、依然としてアクセス許可が拒否され、書き込み不可と表示されます。
- ウイルス対策/EDR が一時的に無効になっています
- 「test/」のセキュリティコンテキストを確認してください。返される結果は「unconfined_u:object_r:httpd_sys_content_t:s0」です。これはどれも問題ありません(以下の返信で説明されています)。
- ファイルの移動をブロックする可能性のあるセキュリティ関連のアプリケーションがインストールされていないか確認してください。次のアプリケーションはインストールされていません: AppArmor、grsecurity、Tomoyo Linux、Smack。
- PHP スクリプトで fopen()/flock() 関数を使用して、移動したいファイルがロックされていないことを確認します。
- is_uploaded_file() 関数を使用して、アップロードされたファイルを移動しようとしていることを確認します (この時点で、思いつく限りのことを試してみるだけで気が狂ってしまいます)。もちろん、これは true を返します。
move_uploaded_file には 2 つのパラメータが必要です。 1:アップロードしたいファイル 2: ファイルの絶対パスを置く 3: アップロード ディレクトリに適切な所有権と権限があることを確認してください (注: Apache をプロキシとして使用している場合、ディレクトリの所有権は apache2 の user: グループに属している必要があります)。
リーリー詳細: https://www.php.net/manual/pt_BR/function.move-uploaded-file.php