ให้สิทธิ์ PHP ในการเขียนไฟล์และโฟลเดอร์


13

อัปเดตสำหรับ CLARITY เพิ่มเติม:

อ้างอิงจากhttp://expressionengine.com/user_guide/installation/installation.htmlก็กล่าวว่า:

สำหรับโฮสต์ Unix ส่วนใหญ่ต่อไปนี้เป็นเรื่องปกติ แต่คุณสามารถตรวจสอบกับโฮสต์ของคุณเพื่อดูว่าสามารถใช้สิทธิ์ที่ จำกัด เพื่ออนุญาตให้ PHP เขียนไฟล์ (666) และโฟลเดอร์ (777)ได้หรือไม่ บนเซิร์ฟเวอร์ Windows ข้อมูลต่อไปนี้จะไม่นำมาใช้ แต่คุณจะต้องตรวจสอบให้แน่ใจว่า ExpressionEngine ไฟล์และโฟลเดอร์นั้นสามารถเขียนได้และไฟล์ คุณอาจต้องติดต่อโฮสต์ของคุณสำหรับสิ่งนี้

ไม่แน่ใจว่าสิ่งนี้หมายถึงอะไร ฉันสามารถเปลี่ยนไฟล์และโฟลเดอร์เฉพาะเป็น 666 และ 777 ตามลำดับที่ฉันเป็น chown'er แต่เสียงข้างต้นดูเหมือนว่าฉันต้องอนุญาตให้ PHP ทำเช่นนี้?

คำถามเดิม:

ฉันต้องการตรวจสอบให้แน่ใจว่า PHP สามารถเขียนไฟล์เฉพาะ (666) และโฟลเดอร์ (777)

ฉันจะทำสิ่งนี้ได้อย่างไร


2
ฉันไม่แน่ใจว่าคุณกำลังพยายามแก้ไขปัญหาอะไร หากคุณสามารถเข้าถึงไดเรกทอรีที่มีไฟล์อยู่และมีสิทธิ์ในการดำเนินการคุณสามารถเขียนไปยังไฟล์และไดเรกทอรีที่มีสิทธิ์เหล่านั้น
Karlson

เพิ่มรายละเอียดเพิ่มเติมข้างต้น
oshirowanen

1
สำหรับโฮสต์ Unix ส่วนใหญ่ต่อไปนี้เป็นเรื่องปกติ แต่คุณสามารถตรวจสอบกับโฮสต์ของคุณเพื่อดูว่าสามารถใช้สิทธิ์ที่ จำกัด เพื่ออนุญาตให้ PHP เขียนไฟล์ (666) และโฟลเดอร์ (777) - มีอาการโคม่าหายไปหรือไม่? มิฉะนั้นวลีนี้ไม่สมเหตุสมผล หากไม่มีการ จำกัด ไดเรกทอรีระดับสูงกว่าคุณจะไม่มีปัญหาในการเขียนไฟล์หรือไดเรกทอรีที่เขียนได้ทั่วโลก
Karlson

ฉันเพิ่งคัดลอกและวางจากเอกสาร นอกจากนี้ยังเป็นเหตุผลที่ฉันโพสต์คำถามเพราะฉันไม่เข้าใจความหมายของคำพูดที่ว่า ...
oshirowanen

1
หากคุณเห็นเอกสารที่แนะนำให้คุณใช้ 666 หรือ 777 ในส่วนที่เกี่ยวข้องกับไฟล์เว็บคุณอาจไม่สนใจมันเว้นแต่จะมีเหตุผลที่ดีที่อธิบายไว้ มักจะเป็นสิ่งที่เขียนโดยคนที่ไม่สามารถหาวิธีตั้งค่าการอนุญาตที่ถูกต้องและยอมแพ้และให้ทุกคนสามารถอ่านหรือเขียนการเข้าถึงไฟล์
jsbillings

คำตอบ:


18

ฉันจะตอบคำถาม rahmu และ MV ด้วยโซลูชันทางเทคนิค ทุกสิ่งที่ตามมาใช้ได้สำหรับระบบที่เหมือน UNIX เท่านั้น

เลื่อนผ่านส่วน chmod / chown สำหรับตัวอย่างโดยใช้ ACL - เครื่องมือที่ทรงพลังกว่าโหมดไฟล์ UNIX

ค้นหาชื่อผู้ใช้เว็บเซิร์ฟเวอร์ของคุณ

ก่อนอื่นคุณจะต้องรู้ชื่อผู้ใช้ที่ใช้งานเว็บเซิร์ฟเวอร์ของคุณ หากคุณกำลังใช้ Apache ก็สามารถapacheหรือhttpd, www-dataฯลฯ ในที่สุด Debian เหมือนระบบ Apache www-dataคือ สำหรับ nginx โดยทั่วไปก็เป็นเช่นwww-dataกัน

หากต้องการตรวจสอบลอง:

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

ตรวจสอบให้แน่ใจว่าชื่อผู้ใช้คำสั่งนี้ผลตอบแทนเป็นที่สอดคล้องกัน(ตัวอย่างเช่นผมใช้ Nginx 99% ของเวลา แต่คำสั่งนี้ผลตอบแทนที่tomcat7เป็นเว็บเซิร์ฟเวอร์ Java ผมติดตั้งครั้งเดียว)


ให้สิทธิ์กับเว็บเซิร์ฟเวอร์: การใช้chmodและchown

การทำchmod666 หรือ 777 (โซลูชัน go-to สำหรับปัญหาแบบนั้นในเอกสาร / บทแนะนำที่ไม่ดี) สามารถทำให้สิ่งต่าง ๆ ใช้งานได้อย่างน่าอัศจรรย์ แต่ไม่ปลอดภัย การให้สิทธิ์ 666 หรือ 777 จะทำให้สามารถเข้าถึง "others" ดังนั้นไม่ใช่แค่ Apache แต่ยังgrandmotherและ nsa(หากมีบัญชีผู้ใช้เหล่านั้นอยู่ในเครื่องของคุณ - แต่ไม่จริง ๆ โปรดหลีกเลี่ยงการทำเช่นนี้ยกเว้นว่าเป็นการทดสอบ / การแก้ไขปัญหาเท่านั้น)

มันจะดีกว่าที่จะเจาะจงมากขึ้นและให้สิทธิ์เพียงคุณและ Apache เปลี่ยนกลุ่มไฟล์ของคุณเพื่อให้การควบคุมไฟล์ของคุณกับเว็บเซิร์ฟเวอร์เป็นไปอย่างสมบูรณ์ หากต้องการทำสิ่งนี้ให้เปลี่ยนเจ้าของซ้ำ:

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

แต่ส่วนใหญ่คุณอาจต้องการเข้าถึงไฟล์ของคุณอย่างเต็มที่โดยการเปลี่ยนกลุ่มเท่านั้น:

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

จากนั้นทำสิ่งที่เหมาะสมchmodเพื่อให้กลุ่มwww-dataมีสิทธิ์เช่นเดียวกับคุณ ตัวอย่างเช่นหากโหมดปัจจุบันคือ 640 (6 สำหรับคุณ, 4 สำหรับ www-data, 0 สำหรับผู้อื่น, แปลเป็น -rw-r -----)ให้ตั้งเป็น 660 (6 สำหรับคุณ, 6 สำหรับ www- ข้อมูล, 0 สำหรับคนอื่น ๆ ที่จะแปล -rw-RW ----) ดูคำตอบของ rahmu เพื่อเรียนรู้เพิ่มเติมเกี่ยวกับโหมดไฟล์มันเป็นกลไกที่เก่า แต่สวยงาม

เพื่อหลีกเลี่ยงการจัดการกับตัวเลขอาร์เคนด้วยchmodคุณสามารถใช้ไวยากรณ์นี้:

chmod -R g+rw your/folder/

มันหมายถึง "ไปยังกลุ่ม ( g), เพิ่ม ( +) อ่านและเขียน ( rw) สิทธิ์ในโฟลเดอร์your/folder/ซ้ำ ( -R)"

ใน 90% ของกรณีนี้ควรจะเพียงพอ


วิธีที่ฉันชอบ: การใช้ ACL (Access Control List)

บางครั้งวิธีแก้ปัญหาแรกไม่เพียงพอ ฉันจะใช้ตัวอย่างของSymfony Frameworkที่บันทึกและแคชข้อมูลจำนวนมาก ดังนั้นจึงต้องการการเข้าถึงเพื่อเขียนไปยังโฟลเดอร์ที่เหมาะสม

และวิธีchmod/ chownอาจไม่เพียงพอเมื่อคุณใช้ควบคู่กับ Symfony Console ใน CLI (ภายใต้บัญชีผู้ใช้ของฉัน) และเว็บ (ผู้ใช้เว็บเซิร์ฟเวอร์) นี่เป็นสาเหตุของปัญหามากมายเนื่องจาก Symfony กำลังแก้ไขสิทธิ์อย่างต่อเนื่อง

ในกรณีนี้เราจะใช้ ACL (Access Control List) ซึ่งเป็นวิธีการขั้นสูงในการจัดการสิทธิ์บนระบบ UNIX หลายระบบ

นี่คือคำสั่งที่ได้รับจากเอกสาร Symfony อย่างเป็นทางการ ( โปรดเปลี่ยนapp/cacheและapp/logsต้องการของคุณ ):

บนระบบที่รองรับchmod +a(เช่นไม่ใช่ 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

บนระบบที่ไม่รองรับchmod +a(ทั่วไป)

คุณจะต้องใช้setfaclเครื่องมือ อาจจะติดตั้งไว้ในระบบของคุณเป็นค่าเริ่มต้นดังนั้นให้ลองsetfacl -vดูว่าคำสั่งนั้นมีให้หรือไม่

หากคำสั่งไม่พร้อมใช้งานและคุณใช้ Ubuntu 14.04+ คุณเพียงแค่ต้องติดตั้งเครื่องมือ:

sudo apt install acl

มิฉะนั้นให้ปฏิบัติตามเอกสารระบบปฏิบัติการของคุณเพราะคุณอาจต้องเปลี่ยนวิธีติดตั้งพาร์ติชันของคุณ ( เอกสาร Ubuntu ที่นี่ )

และที่นั่นเรา:

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

ฉันไม่เคยมีปัญหากับวิธีนี้พอใจหรือคืนเงินของคุณ


1
+1 สำหรับ 'ps aux | grep -E '[a] pache | [h] ttpd | [_] www | [w] ww-data | [n] ginx' | grep -v root | หัว -1 | cut -d \ -f1 '
Amar Pratap

4

ไม่ว่าใครจะเป็นเจ้าของไฟล์การอนุญาต 666 และ 777 ก็เพียงพอแล้ว: หลักสุดท้ายทำให้แน่ใจได้ว่าผู้ใช้ทุกคนในระบบสามารถเข้าถึงได้ ในขณะที่วิธีนี้เป็นวิธีที่ง่ายที่สุดที่จะทำมันไม่แน่นอนที่ปลอดภัยที่สุดสำหรับเหตุผลที่แน่นอน

วิธีที่ดีกว่าที่จะทำ

สิ่งแรกที่คุณต้องเข้าใจคือวิธีการทำงาน Unix สิทธิ์ เพื่อให้เข้าใจถึงคำตอบที่ฉันให้ที่ลิงค์นี้โปรดทราบว่าสิทธิ์สามารถแปลเป็นตัวเลขได้:

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

แล้วเทียบเท่ากับการเปลี่ยนแปลงสิทธิ์ในการchmod 666rw-rw-rw

ถัดไปคุณต้องคิดออกว่าเป็นผู้ใช้ที่รันสคริปต์ PHP โดยปกติจะเป็นผู้ใช้ที่ใช้งานเว็บเซิร์ฟเวอร์ของคุณ นี่คือตัวอย่างของวิธีการทำเช่นนี้ (คุณสามารถแทนที่ Apache ด้วยชื่อของเว็บเซิร์ฟเวอร์ของคุณ)

เมื่อคุณทราบว่าผู้ใช้คนใดกำลังเรียกใช้งานสคริปต์และเจ้าของไฟล์ใดที่คุณพูดถึงมันขึ้นอยู่กับคุณว่าจะตั้งค่าการอนุญาตที่เหมาะสม โปรดทราบว่าการให้สิทธิ์การเขียน (อ่านแล้ว) แก่ผู้ใช้ทุกคนในระบบของคุณอาจทำให้เกิดความเสียหายได้


0

Expression Engine นั้นเหมือนกับเว็บแอปพลิเคชั่น PHP อื่น ๆ ที่ต้องการการเข้าถึงแบบอ่านและเขียนในไฟล์และไดเรกทอรี ตัวอย่างเช่น EE ต้องการสิทธิ์การเขียนไปยังไฟล์ config.php และ database.php และการเข้าถึงเพื่อเขียนไปยังไดเร็กทอรีอัพโหลดไฟล์

สิ่งที่เอกสารระบุว่าเป็นเพราะเซิร์ฟเวอร์ส่วนใหญ่ใช้ PHP เป็น mod_php (และเรียกใช้ด้วยสิทธิ์ของเว็บเซิร์ฟเวอร์) และคุณอาจอัปโหลดไฟล์ของคุณด้วย FTP (หรือคล้ายกัน) โดยใช้ผู้ใช้ของคุณไฟล์เหล่านั้นและ ไดเรกทอรีจะต้องได้รับอนุญาต 666 (ทุกคนสามารถอ่านและเขียน) และ 777 (ทุกคนสามารถอ่านเขียนและเรียกดู)

นั่นไม่ใช่วิธีที่ปลอดภัยที่สุด แต่แน่นอนว่าเป็นวิธีที่ง่ายที่สุดโดยเฉพาะหากคุณใช้บริการโฮสติ้ง

อย่างไรก็ตามตามที่คำแนะนำของ EE ให้สอบถามผู้ให้บริการโฮสต์ของคุณเพราะบางคนไม่ใช้ mod_php แต่เป็น fastcgi, suphp หรือรุ่นอื่น เซิร์ฟเวอร์เหล่านั้นใช้ PHP ในฐานะผู้ใช้ของคุณเองดังนั้นไฟล์ทั้งหมดที่คุณอัปโหลดสามารถอ่านและเขียนได้โดย PHP และไฟล์ใด ๆ ที่สร้างโดยสคริปต์ EE ในกรณีที่ไฟล์และไดเรกทอรีที่เข้าถึงโดย PHP จะต้องได้รับการเข้าถึง 600 และ 700 ไฟล์อื่น ๆ ที่สามารถเข้าถึงได้โดยตรงจากเว็บเซิร์ฟเวอร์ (ไม่ใช่ PHP runtime) จะยังคงต้องมีการเข้าถึง 666 และ 777)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.