Tajuk ditulis semula sebagai: Fail yang dimuat naik tidak boleh dialihkan apabila kebenaran tidak mencukupi
Saya mempunyai skrip PHP yang melaluinya saya boleh memuat naik fail dan cuba mengalihkannya dari /tmp ke test/ (laluan relatif, terletak dalam folder projek saya, contohnya /var/www/html/myproject/test akan menjadi mutlak laluan). Apabila ini berlaku saya mendapat ralat berikut.
move_uploaded_file(test/test.csv): Tidak dapat membuka strim: Kebenaran ditolak di /var/www/html/myproject/import.php, line .php
Skrip ini dijalankan oleh pengguna apache, yang mempunyai pemilikan /test (kedua-dua pemilik apache dan kumpulan apache memiliki direktori ini), dengan kebenaran rwx.
Saya telah menyemak perkara berikut:
- safe_mode dilumpuhkan.
- open_basedir tidak ditetapkan.
- fail_muat naik didayakan.
- upload_max_filesize ialah 2MB, saiz fail ialah ~50KB.
- post_max_size ialah 8MB dan permintaan POST saya tidak hampir dengan ini.
- Gunakan laluan mutlak dan bukannya laluan relatif.
- is_dir("test/") mengembalikan benar.
- is_writable("test/") mengembalikan palsu.
- Dalam skrip php: cetak pemilik fail (fail untuk dipindahkan), pemilik folder (ujian/), kebenaran fail dan kebenaran folder. Pemilik fail/folder ditunjukkan sebagai apache. Kebenaran fail ialah 600, jadi pemilik boleh membaca dan menulis. Kebenaran folder ialah 755, jadi pemilik boleh membaca, menulis dan melaksanakan.
- ps -aux |. Padankan PID dalam log ralat apache dengan proses berjalan yang dimiliki oleh pengguna apache. Jadi ini mengesahkan bahawa proses itu berjalan di bawah apache.
- getcwd() dan
__DIR__
kedua-duanya mengembalikan direktori yang betul /var/www/html/myproject.
- dirname(
__FILE__
) mengembalikan laluan mutlak yang betul ke fail
- Semak file_exists($_FILES['fail']['tmp_name']) kembali benar
- Menyemak $_FILES['file']['error'] (fail yang saya mahu alihkan) mengembalikan 0, tiada masalah memuat naik.
- Gunakan is_writable("/tmp") untuk menyemak sama ada folder sumber (/tmp) boleh ditulis dan kembali benar.
- Cuba untuk sementara menggunakan chmod -R 777 pada ujian/, masih menunjukkan kebenaran ditolak dan tidak boleh ditulis.
- Antivirus/EDR dilumpuhkan buat sementara waktu
- Semak konteks keselamatan "test/". Hasil pulangan ialah: "unconfined_u:object_r:httpd_sys_content_t:s0". Tiada satu pun daripada ini adalah masalah (diterangkan dalam jawapan di bawah).
- Semak sama ada anda telah memasang aplikasi berkaitan keselamatan yang mungkin menyekat fail bergerak. Aplikasi ini tidak dipasang: AppArmor, grsecurity, Tomoyo Linux dan Smack.
- Menggunakan fungsi fopen()/flock() dalam skrip php untuk mengesahkan bahawa fail yang ingin saya alihkan tidak dikunci.
- Menggunakan fungsi is_uploaded_file() mengesahkan bahawa saya cuba mengalihkan fail yang dimuat naik (saya menjadi gila pada ketika ini hanya mencuba apa sahaja yang boleh saya fikirkan). Sudah tentu, ini kembali benar.