Berkas yang tak bisa ditulisi server web biasanya diperbaiki dengan 777, dan itu berhasil. Artinya juga setiap proses di mesin itu - termasuk yang baru saja diunggah penyerang - bisa menulis ulang berkas itu. Pertanyaan yang sebenarnya bukan berapa izinnya, melainkan siapa pemilik berkasnya.

Susunan yang benar

sudo chown -R sara:www-data /var/www/site
sudo find /var/www/site -type d -exec chmod 2750 {} \;
sudo find /var/www/site -type f -exec chmod 640 {} \;

# only what genuinely must be written
sudo chmod -R 2770 /var/www/site/storage /var/www/site/uploads

Berkasnya milik Anda, grupnya milik server web; ia bisa membaca semuanya dan menulis hanya pada dua direktori yang memang memerlukannya.

Angka 2 di depan itulah jebakan grupnya

Itu setgid. Tanpanya, berkas yang dibuat di dalam direktori itu mengambil grup pembuatnya sendiri, sehingga berkas yang diunggah server web tak terbaca oleh Anda - dan yang Anda buat tak bisa ditulisinya. Semuanya berjalan sampai ada orang lain menambah sebuah berkas, dan itulah sebabnya kesalahannya tampak acak.

sudo chmod g+s /var/www/site/uploads
ls -ld /var/www/site/uploads      # drwxrws--- - the s is the setgid bit

umask menentukan apa yang didapat berkas BARU

umask            # 0022 typical: new files 644, new dirs 755
umask 0007       # files 660, dirs 770 - nothing for others

Setel di unit layanan untuk sebuah daemon, bukan di profil cangkang Anda, kalau tidak ia hanya berlaku untuk berkas yang Anda buat dengan tangan.

# /etc/systemd/system/app.service
[Service]
UMask=0007

Jangan pernah 777

777 pada direktori unggahan ditambah server web yang mau menjalankan PHP di sana adalah cara paling umum sebuah situs direbut. Lihat direktori unggahan: jangan pernah dapat dijalankan.

Temukan yang sudah telanjur salah

find /var/www -perm -o=w -not -type l | head -20