Memberi izin PHP untuk menulis ke file dan folder


13

DIPERBARUI UNTUK CLARITY LEBIH LANJUT:

Menurut http://expressionengine.com/user_guide/installation/installation.html , dikatakan:

Untuk sebagian besar host Unix, berikut ini adalah tipikal, tetapi Anda dapat memeriksa dengan host Anda untuk melihat apakah izin yang lebih ketat dapat digunakan untuk memungkinkan PHP menulis ke file (666) dan folder (777) . Pada server Windows hal-hal berikut tidak akan berlaku, tetapi Anda harus memastikan bahwa file dan folder dapat ditulis oleh ExpressionEngine. Anda mungkin perlu menghubungi tuan rumah Anda untuk ini.

Tidak yakin apa maksudnya. Saya dapat mengubah file dan folder tertentu masing-masing menjadi 666 dan 777 di mana saya adalah chown'er, tetapi di atas terdengar seperti saya perlu mengizinkan PHP untuk melakukan ini juga?

PERTANYAAN ASLI:

Saya perlu memastikan bahwa PHP dapat menulis ke file tertentu (666) dan folder (777).

Bagaimana saya melakukan ini?


2
Saya tidak yakin masalah apa yang Anda coba selesaikan? Jika Anda dapat mengakses direktori tempat file berada dan memiliki izin eksekusi di dalamnya, Anda dapat menulis ke file dan direktori dengan izin tersebut.
Karlson

Menambahkan rincian lebih lanjut di atas.
oshirowanen

1
Untuk sebagian besar host Unix, berikut ini adalah tipikal, tetapi Anda dapat memeriksa dengan host Anda untuk melihat apakah izin yang lebih ketat dapat digunakan untuk memungkinkan PHP menulis ke file (666) dan folder (777) - Apakah ada koma yang hilang? jika tidak, frasa ini tidak masuk akal. Kecuali jika direktori level yang lebih tinggi dibatasi, Anda tidak akan memiliki masalah dalam menulis ke file atau direktori dunia yang bisa ditulis
Karlson

Saya baru saja menyalin dan menempel dari dokumentasi. Plus, itu alasan mengapa saya memposting pertanyaan karena saya tidak mengerti apa arti kutipan itu ...
oshirowanen

1
Jika Anda melihat dokumentasi yang menyarankan bahwa Anda menggunakan 666 atau 777 dalam kaitannya dengan file web, Anda mungkin harus mengabaikannya kecuali ada alasan yang bagus untuk dijelaskan. Ini biasanya sesuatu yang ditulis oleh seseorang yang tidak tahu cara mengatur izin yang tepat, dan menyerah dan memberi semua orang akses baca atau tulis ke file.
jsbillings

Jawaban:


18

Saya akan menyelesaikan jawaban rahmu dan MV dengan solusi teknis. Segala sesuatu yang mengikuti ini hanya berlaku untuk sistem seperti UNIX.

Gulir melewati bagian chmod / chown untuk contoh menggunakan ACL - alat yang lebih kuat daripada mode file UNIX.

Menemukan nama pengguna server web Anda

Pertama, Anda harus mengetahui nama pengguna yang digunakan server web Anda. Jika Anda menggunakan Apache, dapat apacheatau httpd, www-data, dll Pada kebanyakan Debian-seperti sistem, Apache www-data. Untuk nginx, umumnya, itu juga www-data.

Untuk memeriksanya, cobalah:

ps aux | grep -E '[a]pache|[h]ttpd|[_]www|[w]ww-data|[n]ginx' | grep -v root | head -1 | cut -d\  -f1

Pastikan bahwa nama pengguna yang dikembalikan oleh perintah ini adalah koheren (misalnya, saya menggunakan nginx 99% waktu, tetapi perintah ini kembali tomcat7, server web Java yang saya pasang sekali) .


Memberikan izin ke server web: menggunakan chmoddanchown

Melakukan chmod666 atau 777 (solusi masuk untuk masalah semacam itu di dokumentasi / tutorial yang buruk) secara ajaib dapat membuat semuanya berfungsi, tetapi tidak aman. Memberikan izin 666 atau 777 akan memberikan akses ke "orang lain". Jadi bukan hanya Apache, tetapi juga grandmotherdan nsa(asalkan akun pengguna itu ada di komputer Anda - tetapi tidak juga, harap hindari melakukan ini kecuali itu hanya untuk pengujian / pemecahan masalah).

Lebih baik untuk lebih spesifik dan memberikan izin hanya untuk Anda dan Apache. Ubah grup file Anda untuk memberikan kontrol penuh pada file Anda ke server web. Untuk melakukan ini, ubah pemilik secara rekursif:

chown -R www-data:www-data your/folder/

Tetapi kemungkinan besar, Anda mungkin ingin menyimpan akses penuh pada file Anda dengan mengubah grup saja:

chown -R yourusername:www-data your/folder/

Kemudian, lakukan yang sesuai chmoduntuk memberi grup www-dataizin yang sama dengan Anda. Misalnya, jika mode saat ini adalah 640 (6 untuk Anda, 4 untuk www-data, 0 untuk orang lain, diterjemahkan ke -rw-r -----) , setel ke 660 (6 untuk Anda, 6 untuk www- data, 0 untuk yang lain, menerjemahkan ke -rw-rw ----) . Lihat jawaban rahmu untuk mempelajari lebih lanjut tentang mode file, ini adalah mekanisme yang lama, namun elegan.

Untuk menghindari memanipulasi angka misterius dengan chmod, Anda juga dapat menggunakan sintaks ini:

chmod -R g+rw your/folder/

Ini berarti "ke grup ( g), tambahkan ( +) baca dan tulis ( rw) izin pada folder your/folder/, secara rekursif ( -R)".

Dalam 90% kasus, ini sudah cukup.


Metode pilihan saya: menggunakan ACL (Access Control List)

Terkadang solusi pertama tidak cukup. Saya akan mengambil contoh Kerangka Symfony yang mencatat dan menyimpan banyak data. Jadi perlu akses tulis ke folder yang sesuai.

Dan metode chmod/ chownmungkin tidak mencukupi, ketika Anda menggunakan secara paralel Symfony Console di CLI (di bawah akun pengguna saya) dan Web (pengguna server web). Ini menyebabkan banyak masalah karena Symfony terus-menerus mengubah izin.

Dalam hal ini, kami akan menggunakan ACL (Access Control List), yang merupakan cara yang lebih maju untuk mengelola izin pada banyak sistem UNIX.

Di sini perintah yang diberikan oleh dokumentasi Symfony resmi ( silakan ubah app/cachedan app/logssesuai kebutuhan Anda ):

Pada sistem yang mendukung chmod +a(mis. Bukan Debian / Ubuntu)

sudo chmod +a "www-data allow delete,write,append,file_inherit,directory_inherit" app/cache app/logs
sudo chmod +a "`whoami` allow delete,write,append,file_inherit,directory_inherit" app/cache app/logs

Pada sistem yang tidak mendukung chmod +a(paling umum)

Anda akan membutuhkan setfaclalat tersebut; mungkin itu diinstal pada sistem Anda secara default, jadi cobalah setfacl -vuntuk melihat apakah perintah itu tersedia.

Jika perintah tidak tersedia, dan Anda menggunakan Ubuntu 14.04+, Anda hanya perlu menginstal alat ini:

sudo apt install acl

Jika tidak, ikuti dokumentasi OS Anda, karena Anda mungkin perlu mengubah cara partisi Anda dipasang ( dokumentasi Ubuntu di sini ).

Dan di sanalah kita:

sudo setfacl  -R -m u:"www-data":rwX -m u:`whoami`:rwX app/cache app/logs
sudo setfacl -dR -m u:"www-data":rwX -m u:`whoami`:rwX app/cache app/logs

Saya tidak pernah memiliki masalah dengan metode ini, puas atau uang Anda kembali.


1
+1 untuk 'ps aux | grep -E '[a] pache | [h] ttpd | [_] www | [w] ww-data | [n] ginx' | grep -v root | kepala -1 | cut -d \ -f1 '
Amar Pratap

4

Tidak peduli siapa pemilik file, 666 izin dan 777 akan cukup: digit terakhir memastikan bahwa setiap pengguna pada sistem memiliki akses. Meskipun ini adalah cara termudah untuk melakukannya, sudah pasti bukan yang paling aman untuk alasan yang tepat.

Cara yang lebih baik untuk melakukannya

Hal pertama yang perlu Anda pahami adalah cara kerja izin Unix . Untuk memahami jawaban yang saya berikan di tautan ini, harap perhatikan bahwa izin dapat diterjemahkan ke angka:

  • 0: ---
  • 1: --x
  • 2: -w-
  • 3: -wx
  • 4: r--
  • 5: r-x
  • 6: rw-
  • 7: rwx

A chmod 666kemudian setara dengan mengubah izin rw-rw-rw.

Selanjutnya Anda harus mencari tahu siapa pengguna yang mengeksekusi skrip PHP. Biasanya itu adalah pengguna yang menjalankan server web Anda. Berikut adalah contoh cara melakukan ini (Anda dapat mengganti Apache dengan nama server web Anda).

Setelah Anda tahu mana pengguna yang menjalankan skrip, dan pemilik file yang Anda sebutkan, terserah Anda untuk mengatur izin yang sesuai. Ingatlah bahwa memberikan akses tulis (bahkan dibaca) ke setiap pengguna di sistem Anda dapat berpotensi bencana.


0

Expression Engine sama seperti banyak aplikasi web PHP lainnya yang memerlukan akses baca + tulis ke beberapa file dan direktori. Misalnya, EE memerlukan akses tulis ke file config.php dan database.php, dan akses tulis ke direktori unggah file.

Apa yang dinyatakan oleh dokumentasi adalah bahwa, karena sebagian besar server menjalankan PHP sebagai mod_php (dan dijalankan dengan izin dari server web), dan karena Anda mungkin akan mengunggah file Anda dengan FTP (atau serupa) menggunakan pengguna Anda sendiri, file-file tersebut dan direktori perlu diberikan izin 666 (semua orang dapat membaca dan menulis) dan 777 (semua orang dapat membaca, menulis, dan menelusuri).

Itu bukan cara yang paling aman, tetapi tentu saja adalah yang termudah, khususnya jika Anda menggunakan layanan hosting.

Namun, seperti yang dinyatakan dalam instruksi EE, tanyakan penyedia hosting Anda, karena beberapa tidak menggunakan mod_php tetapi versi fastcgi, suphp atau yang berbeda. Server-server itu menjalankan PHP sebagai pengguna Anda sendiri, sehingga semua file yang Anda unggah sudah dapat dibaca dan ditulis oleh PHP dan oleh file apa pun yang dibuat oleh skrip EE. Dalam hal ini file dan direktori yang diakses oleh PHP perlu diberikan akses 600 dan 700. File lain yang dapat diakses langsung oleh server web (bukan runtime PHP) masih membutuhkan akses 666 dan 777).

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.