Tajuk ditulis semula sebagai: Fail yang dimuat naik tidak boleh dialihkan apabila kebenaran tidak mencukupi
P粉210405394
P粉210405394 2023-09-07 23:51:33
0
1
355

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.

P粉210405394
P粉210405394

membalas semua (1)
P粉564192131

move_uploaded_file memerlukan dua parameter. 1: Fail yang anda ingin muat naik 2: Letakkan laluan mutlak fail 3: Sila pastikan bahawa direktori muat naik mempunyai pemilikan dan kebenaran yang sesuai (Nota: Jika anda menggunakan Apache sebagai proksi, pemilikan direktori harus dimiliki oleh pengguna: kumpulan apache2).

示例:move_uploaded_file($_FILES['my_file_field_name']['tmp_name'], "/var/www/html/myproject/test/upload_dir/" . $_FILES['name']['tmp_name']);

Baca lebih lanjut:https://www.php.net/manual/pt_BR/function.move-uploaded-file.php

    Muat turun terkini
    Lagi>
    kesan web
    Kod sumber laman web
    Bahan laman web
    Templat hujung hadapan
    Tentang kita Penafian Sitemap
    Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!