PHP'ye dosyalara ve klasörlere yazma izni verme


13

DAHA FAZLA AÇIKLAMA İÇİN GÜNCELLENDİ:

Http://expressionengine.com/user_guide/installation/installation.html'ye göre diyor ki:

Çoğu Unix ana makinesi için aşağıdakiler tipiktir, ancak PHP'nin dosyalara (666) ve klasörlere (777) yazmasına izin vermek için daha kısıtlayıcı izinlerin kullanılıp kullanılamayacağını öğrenmek için ana makinenize danışabilirsiniz . Windows sunucularında aşağıdakiler uygulanmaz, ancak dosya ve klasörlerin ExpressionEngine tarafından yazılabilir olduğundan emin olmanız gerekir. Bunun için sunucunuzla görüşmeniz gerekebilir.

Bunun ne anlama geldiğinden emin değilim. Belirli dosyaları ve klasörleri sırasıyla chown'er olduğum için sırasıyla 666 ve 777 olarak değiştirebilirim, ancak yukarıdaki gibi PHP'nin de bunu yapmasına izin vermeliyim?

ORİJİNAL SORU:

PHP'nin belirli dosyalara (666) ve klasörlere (777) yazabilmesini sağlamalıyım.

Bunu nasıl yaparım?


2
Hangi sorunu çözmeye çalıştığınızdan emin değilim? Dosyanın bulunduğu dizine erişebilir ve içinde yürütme iznine sahipseniz, bu izinlere sahip dosyalara ve dizinlere yazabilirsiniz.
Karlson

Yukarıda daha fazla ayrıntı eklendi.
oshirowanen

1
Çoğu Unix ana bilgisayarı için aşağıdakiler tipiktir, ancak PHP'nin dosyalara (666) ve klasörlere (777) yazmasına izin vermek için daha kısıtlayıcı izinlerin kullanılıp kullanılamayacağını öğrenmek için ana makinenize danışabilirsiniz - Eksik bir koma var mı? aksi halde bu cümlenin bir anlamı yok. Üst düzey dizin kısıtlanmadığı sürece, dünya yazılabilir dosyalarına veya dizinlerine yazma konusunda sorun yaşamazsınız.
Karlson

Belgelerden bir kopyalayıp yapıştırdım. Ayrıca, bu teklifin ne anlama geldiğini anlamadığım için soruyu yayınlamamın nedeni ...
oshirowanen

1
Web dosyalarıyla ilgili olarak 666 veya 777 kullandığınızı gösteren belgeler görürseniz, iyi bir neden açıklanmadığı sürece büyük olasılıkla yoksaymalısınız. Genellikle doğru izinlerin nasıl ayarlanacağını anlayamayan ve vazgeçip herkese dosyalara okuma veya yazma erişimi veren biri tarafından yazılmış bir şeydir.
jsbillings

Yanıtlar:


18

Rammu ve MV'nin cevaplarını teknik bir çözümle tamamlayacağım. Aşağıdaki her şey yalnızca UNIX benzeri sistemler için geçerlidir.

UNIX dosya modlarından daha güçlü bir araç olan ACL'leri kullanarak bir örnek için chmod / chown bölümünü kaydırın.

Web sunucusu kullanıcı adınızı bulma

İlk olarak, web sunucunuzun altında çalıştığı kullanıcı adını bilmeniz gerekir. Apache kullanıyorsanız, bu olabilir apacheya httpd, www-dataDebian benzeri sistemlerde, Apache en On vb www-data. Nginx için genellikle aynıdır www-data.

Kontrol etmek için şunu deneyin:

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

Bu komutun döndürdüğü kullanıcı adının tutarlı olduğundan emin olun (örneğin,% 99 oranında nginx kullanıyorum, ancak bu komut tomcat7bir kez yüklediğim bir Java web sunucusu döndürüyor ) .


Web sunucusuna izin verme: chmodve kullanmachown

Bir yaparak chmodşeyleri yapmaya çalışıyordum sihirli yapabilirsiniz 666 veya 777 (kötü dokümantasyon / öğreticiler sorunların bu tür yöneldiği bir çözelti) ki, ama güvensiz olduğunu. 666 veya 777 izinleri vermek "diğerlerine" erişim sağlayacaktır. Bu yüzden sadece Apache değil, aynı zamanda grandmotherve nsa(bu kullanıcı hesaplarının makinenizde bulunması şartıyla - ancak gerçekten hayır, lütfen sadece test / sorun giderme için olmadıkça bunu yapmaktan kaçının).

Daha spesifik olmak ve sadece size ve Apache'ye izin vermek daha iyidir. Web sunucusunda dosyalarınız üzerinde tam kontrol sağlamak için dosya grubunuzu değiştirin. Bunu yapmak için sahibini tekrar tekrar değiştirin:

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

Ancak büyük olasılıkla, yalnızca grubu değiştirerek dosyalarınıza tam erişim sağlamak isteyebilirsiniz:

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

Ardından, chmodgruba www-datasizinle aynı izinleri vermek için uygun olanı yapın. Örneğin, geçerli mod 640 ise (sizin için 6, www verileri için 4, diğerleri için 0, -rw-r -----'ye çeviri) 660 (sizin için 6, www- için 6 ) olarak ayarlayın. veri, diğerleri için 0, -rw-rw ---- 'ya çeviri) . Dosya modları hakkında daha fazla bilgi edinmek için rahmu'nun cevabına bakın, eski ama zarif bir mekanizmadır.

Gizli sayıları ile işlemekten kaçınmak için chmod, bu sözdizimini de kullanabilirsiniz:

chmod -R g+rw your/folder/

" Klasöre ( ), klasörde okuma ve yazma ( ) izinlerini özyinelemeli olarak ( ) gekleyin ") anlamına gelir .+rwyour/folder/-R

Vakaların% 90'ında bu yeterli olmalıdır.


Tercih ettiğim yöntem: ACL'leri kullanma (Erişim Kontrol Listesi)

Bazen ilk çözüm yeterli olmaz. Çok fazla veri kaydeden ve önbelleğe alan Symfony Framework örneğini alacağım . Bu yüzden uygun klasöre yazma erişimi gerekir.

Ve CLI (kullanıcı hesabım altında) Symfony Konsolu ve Web (web sunucusu kullanıcısı) paralel kullanıyorsanız chmod/ chownyöntemi yeterli olmayabilir. Symfony sürekli izinleri değiştirdiği için bu birçok soruna neden oluyor.

Bu durumda, birçok UNIX sistemindeki izinleri yönetmenin daha gelişmiş bir yolu olan ACL'yi (Erişim Kontrol Listesi) kullanacağız.

Burada resmi Symfony belgeleri tarafından verilen komutlar ( lütfen ihtiyaçlarınıza app/cacheve app/logsihtiyaçlarınıza göre değiştirin ):

Destekleyen bir sistemde chmod +a(yani Debian / Ubuntu değil)

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

Desteklemeyen bir sistemde chmod +a(en yaygın)

setfaclAraca ihtiyacınız olacak ; belki de sisteminizde varsayılan olarak yüklüdür, bu yüzden setfacl -vkomutun mevcut olup olmadığını kontrol etmeyi deneyin .

Komut kullanılamıyorsa ve Ubuntu 14.04+ kullanıyorsanız, aracı yüklemeniz yeterlidir:

sudo apt install acl

Aksi takdirde, bölümünüzün nasıl monte edileceğini değiştirmeniz gerekebileceğinden işletim sistemi belgelerinizi takip edin ( Ubuntu belgeleri burada ).

Ve işte buradayız:

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

Bu yöntemle hiç problem yaşamadım, memnunum ya da paranız geri.


1
Ps aux için +1 + | grep -E '[a] önbellek | [h] ttpd | [_] www | [w] ww-data | [n] ginx' | grep -v kökü | kafa -1 | cut -d \ -f1 '
Amar Pratap

4

Dosyaların sahibi kim olursa olsun, 666 izin ve 777 yeterli olacaktır: son basamak sistemdeki her kullanıcının erişime sahip olmasını sağlar. Bunu yapmanın en kolay yolu olsa da, kesinlikle bu nedenle en güvenli değildir.

Bunu yapmanın daha iyi bir yolu

Anlamanız gereken ilk şey Unix izinlerinin nasıl çalıştığıdır . Bu bağlantıda verdiğim yanıtı anlamak amacıyla, izinlerin sayılara çevrilebileceğini lütfen unutmayın:

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

Bu chmod 666durumda A , izinlerin değiştirilmesine eşdeğerdir rw-rw-rw.

Daha sonra PHP betiğini çalıştıran kullanıcının hangisi olduğunu bulmalısınız. Normalde web sunucunuzu çalıştıran kullanıcı budur. Bunun nasıl yapılacağına dair bir örnek ( Apache'yi web sunucunuzun adı ile değiştirebilirsiniz).

Komut dosyalarını yürüten kullanıcının hangisini ve bahsettiğiniz dosyaların sahibi olduğunu öğrendikten sonra, uygun izinleri ayarlamak size kalmıştır. Sisteminizdeki her kullanıcıya yazma erişimi vermenin (hatta okunan) potansiyel olarak felaket olabileceğini unutmayın.


0

Expression Engine, bazı dosya ve dizinlere okuma + yazma erişimi gerektiren diğer birçok PHP web uygulaması gibidir. Örneğin, EE, config.php ve database.php dosyalarına yazma erişimi ve dosya yükleme dizinlerine yazma erişimi gerektirir.

Belgelerin belirttiği gibi, çoğu sunucu PHP'yi mod_php olarak çalıştırdığından (ve böylece web sunucusunun izinleriyle çalıştığından) ve muhtemelen dosyalarınızı kendi kullanıcınızı kullanarak FTP (veya benzeri) ile yükleyeceğinizden, bu dosyalar ve dizinlere 666 (herkes okuyabilir ve yazabilir) ve 777 (herkes okuyabilir, yazabilir ve göz atabilir) izinleri verilmelidir.

Bu güvenli bir yol değil, ama özellikle bir barındırma hizmeti kullanıyorsanız, kesinlikle en kolay yoludur.

Ancak, EE talimatlarının belirttiği gibi, barındırma sağlayıcınıza sorun, çünkü bazıları mod_php değil bir fastcgi, suphp veya farklı bir versiyon kullanır. Bu sunucular PHP'yi kendi kullanıcı olarak çalıştırır, böylece yüklediğiniz tüm dosyalar PHP ve EE komut dosyaları tarafından oluşturulan herhangi bir dosya tarafından zaten okunabilir ve yazılabilir. Bu durumda, PHP tarafından erişilen dosya ve dizinlere 600 ve 700 erişim izni verilmesi gerekir. Doğrudan web sunucusu tarafından erişilecek diğer dosyalara (PHP çalışma zamanı değil) yine de 666 ve 777 erişim gerekir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.