SGID'yi PHP'de nasıl ayarlarım?
SGID bitini PHP'den ayarlayamıyorum.
Bu dizine sahibim:
4 drwxrwsr-x 12 www-data mygroup 4096 Oct 7 16:05 mydir
SGID bitine dikkat edin. Dolayısıyla, ile kabuktan içine bir dizin oluşturursam mkdir test,
4 drwxr-sr-x 2 myuser mygroup 4096 Oct 7 16:22 test
SGID bitinin miras alındığına dikkat edin. Ancak grup yazılabilir olmasını isterdim (ki umask 22buna izin vermez), böylece basitçe yapabilirim chmod 02775 testve tamamen mutluyum:
4 drwxrwsr-x 2 myuser mygroup 4096 Oct 7 16:22 test
Şimdi aynısını bir PHP betiğinden yapmak istiyorum. Doğal olarak, bunun işe yaramasını bekliyorum:
mkdir("/mydir/test2");
chmod("/mydir/test2", 02775);
Ama olmuyor ve bunun yerine bunu alıyorum (SGID sıfırlandı):
4 drwxrwxr-x 2 www-data mygroup 4096 Oct 7 16:30 test2
İşte birkaç faydalı deney:
mkdir("/mydir/test3");
mkdir("/mydir/test4");
passthru("chmod 02775 '/mydir/test4'");
mkdir("/mydir/test5");
passthru("chmod g+w '/mydir/test5'");
Sonuçlar
4 drwxr-sr-x 2 www-data mygroup 4096 Oct 7 16:39 test3
4 drwxrwxr-x 2 www-data mygroup 4096 Oct 7 16:39 test4
4 drwxrwxr-x 2 www-data mygroup 4096 Oct 7 17:06 test5
İlginç bir şekilde, mkdir()SGID'yi tek başına korudu, ancak baştan sona chmod()sıfırladı passthru().
PHP kılavuzunun chmodkomutun yalnızca üç sekizlik basamak beklediğini söylediğini biliyorum , ancak bu stackoverflow sorusunu da okudum ve kılavuzda eski bilgiler var ve diğerleri SGID'yi etkileyebilir gibi görünüyor. Ayrıca passthru()versiyonları etkilememeli değil mi? Aynı stackoverflow sorusu , chmod()"en son çağrılan" olması gerektiğinden bahsediyor chown()ve chgrp()ben bunların hiçbirini kullanmıyorum.
Neyi yanlış yapıyorum?
Yanıtlar
Bu bir web sunucusunda mı yoksa sadece bir CLI komut dosyası olarak mı çalışıyor? CLI, kullanıcı mı yoksa kök mü?
Ayrıca neden dizinler? SGID, bir kullanıcının bir programı / komut dosyasını "sudo" gibi başka bir kullanıcı olarak çalıştırmasına izin vermek için program dosyalarında kullanılır. Bunu dizinler yerine dosyalarda test etmeyi denediniz mi?
Sonunda, ihtiyacım olan izinleri elde etmenin tek yolu, doğru davranıştan yararlanmak mkdir()ve chmod()ne olursa olsun SGID bitini sıfırlıyor gibi görünen arama yapmaktan kaçınmaktır . Bunu yapmanın düşünüyorum tek yolu değiştirmektir izin maskesini ile umask():
$myumask = umask(2); mkdir("/mydir/test6"); umask($myumask);
Bu iyi çalışıyor gibi görünüyor:
4 drwxrwsr-x 2 www-data mygroup 4096 Oct 9 14:22 test6
Bu beni şu notta belirtilen sorunla baş başa bırakıyor https://www.php.net/manual/en/function.umask.php: çok iş parçacıklı bir web sunucusunun tüm iş parçacıkları aynı umask'ı paylaşır ve bu açıkça istenmeyen ve öngörülemez davranışlara yol açar. Şans eseri, benim durumumda, tüm dizin yaratımlarının tek aşamalı bir bağlamda (esasen, bir betiğin ilk deneme çalıştırmasında) yapıldığından emin olabilirim ve bu yüzden kendimi güvende hissediyorum. Bu nedenle, bu yararlı bir çözümdür, ancak genel bir çözüm değildir .