open_basedir มีผลบังคับใช้ ไฟล์ (/) ไม่อยู่ในเส้นทางที่อนุญาต:


89

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

Warning: is_writable() [function.is-writable]: 
open_basedir restriction in effect. 
File(/) is not within the allowed path(s):

19
คุณยอมรับคำตอบที่ไม่ได้ผล
sjas

คำตอบ:


-23

แก้ไขการopen_basedirตั้งค่าในการกำหนดค่า PHP ของคุณ (ดูการกำหนดค่ารันไทม์ )

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

ตัวอย่างการตั้งค่า.htaccessหาก PHP ทำงานเป็นโมดูล Apache บนระบบ Linux:

<DirectoryMatch "/home/sites/site81/">
    php_admin_value open_basedir "/home/sites/site81/:/tmp/:/"
</DirectoryMatch>

2
@Nikesh นี้ให้ฉันข้อผิดพลาด 500 หลังจากที่ฉันลดลงมันลงไปใน .htaccces /my/cutsom/dir/ของฉันและเปลี่ยนเส้นทางไปที่: ไม่แน่ใจว่าทำไมถึงคิด
hitautodestruct

79
ยอดเยี่ยม 12 โหวตจนถึงตอนนี้สำหรับคำตอบที่ไม่ถูกต้อง คุณไม่สามารถใช้php_admin_valueใน.htaccessไฟล์ คุณไม่สามารถใช้ DirectoryMatch ในไฟล์ . htaccess (มาตรการรักษาความปลอดภัยจะopen_basedirเป็นแบบไหนถ้าสามารถปิดใช้งานได้)
ÁlvaroGonzález

1
@eoinoc - เลื่อนลงและดูเช่นคำตอบของ Andrei หรือแก้ไขไฟล์ php.ini ส่วนกลาง
ÁlvaroGonzález

19
คุณไม่ใส่สิ่งนี้ลงใน HTACCESS ของคุณ! แต่ RATHER เข้าไปในไฟล์ APACHE CONFIG ของคุณ
tfont

8
การรวมไดเร็กทอรีรูทใน open_basedir จะเอาชนะวัตถุประสงค์ของ open_basedir โดยสิ้นเชิง โซลูชันนี้ "ใช้ได้ผล" ในแง่ที่ปิดการใช้งานข้อ จำกัด เป็นหลัก
Martin

118

แก้ไขการตั้งค่า open_basedir ในบัญชีโฮสติ้งของคุณและตั้งค่าเป็นไม่มี ค้นหาการตั้งค่า open_basedir ที่ระบุในพื้นที่ 'การตั้งค่า PHP' ของ Plesk / cPanel ของคุณ ตั้งค่าเป็น 'ไม่มี' จากเมนูแบบเลื่อนลงที่ระบุ ฉันได้แสดงไว้ในภาพแผง Plesk

ป้อนคำอธิบายภาพที่นี่ ป้อนคำอธิบายภาพที่นี่


1
@yogihosting หลังจากทำสิ่งนี้ฉันได้รับข้อผิดพลาด - ไม่พบรุ่นที่คุณระบุ: Home_model
Heemanshu Bhalla

1
ช้าไปหน่อย แต่มีวิธีทำสำหรับไซต์ plesk ทั้งหมดหรือไม่? ฉันตั้งค่าเป็นไม่มีใน php.ini ส่วนกลางสำหรับเวอร์ชันที่ไซต์ใช้: gyazo.com/dfffbe7f9b3a20ede97da72f1ddfc777 แต่ยังคงได้รับข้อผิดพลาด
Matt Cowley

@MattCowley คุณต้องทำสิ่งนี้สำหรับแต่ละไซต์ที่โฮสต์ในแผง plesk
yogihosting

1
ขอบคุณสำหรับการแก้ปัญหานี้! การทำงานนี้เหมาะสำหรับฉันในโฮสติ้งที่ใช้ร่วมกัน!
Smilefounder

38

ในการแก้ไขข้อผิดพลาดนี้คุณต้องแก้ไขไฟล์ httpd.conf ก่อนที่จะเห็นใน phpinfo ในส่วน apache2handler directive Server Root ตัวอย่างเช่นในกรณีของฉันวิธีนี้ - / etc / httpd / httpd.conf เปิดไฟล์ httpd.conf ค้นหาการกล่าวถึงพารามิเตอร์ open_basedir และตั้งค่าเป็นไม่มี ( php_admin_value open_basedir ไม่มี )


การตั้งค่าเป็น 'ไม่มี' ใช้งานได้สำหรับฉัน - โดยใช้อินเทอร์เฟซ Plesk ด้วย
diggersworld

10
ฉันพบการopen_basedirกำหนดค่าในphp.iniไฟล์. (Arch Linux บน Raspberry Pi พร้อม php 5)
Dennis van der Schagt

2
นอกจากนี้ยังพบใน php.ini ของฉัน (รวมถึง Arch) เพียงแสดงความคิดเห็นในบรรทัดเพื่อให้ได้ผลเช่นเดียวกับคำตอบนี้
Ben Elgar

@BenElgar เพียงแค่แสดงความคิดเห็นบรรทัดได้กล่าวถึงการทำงานของฉันเพียงแค่ขอให้มีความเสี่ยงที่มี
mwangaben

6

หากคุณใช้สิ่งนี้ด้วยphp file.php. คุณต้องแก้ไขphp.ini ค้นหาไฟล์นี้:

: locate php.ini
/etc/php/php.ini

และต่อท้ายเส้นทางของไฟล์ไปยังopen_basedirคุณสมบัติ:

open_basedir = /srv/http/:/home/:/tmp/:/usr/share/pear/:/usr/share/webapps/:/etc/webapps/:/run/media/andrew/ext4/protected


นี่เป็นทางออกเดียวที่ชี้ไปยังเส้นทางเฉพาะหลาย ๆ เส้นทางแทนที่จะข้ามแค่การรักษาความปลอดภัยโดยสิ้นเชิง
mvreijn

5

สำหรับฉันปัญหาคือค่า config ไม่ถูกต้อง / ขาดหายไปสำหรับเซิร์ฟเวอร์ Plesk ที่เรียกใช้งานทั้งหมด ฉันเพิ่งทำตามคำแนะนำที่นี่: http://davidseah.com/blog/2007/04/separate-php-error-logs-for-multiple-domains-with-plesk/

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

cgi-bin/
conf/
error_docs/
httpdocs/
httpsdocs/
...and so on

คุณจะต้องสร้างไฟล์ vhost.conf ในโฟลเดอร์ conf / ของไดเร็กทอรีโดเมนด้วยบรรทัดต่อไปนี้:

php_value error_log /path/to/error_log
php_flag display_errors off
php_value error_reporting 6143
php_flag log_errors on

เปลี่ยนค่าแรกให้ตรงกับการติดตั้งจริงของคุณ (ฉันใช้ /tmp/phperrors.log) หลังจากแก้ไขไฟล์ vhost.conf เสร็จแล้วให้ทดสอบการกำหนดค่าจากคอนโซลด้วย:

apachectl configtest
…or if you don’t have apachectl (as Plesk 8.6 doesn’t seem to)…

/etc/init.d/httpd configtest

และในที่สุดก็บอก Plesk ว่าคุณได้ทำการเปลี่ยนแปลงนี้แล้ว

/usr/local/psa/admin/bin/websrvmng -a

2

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


มันใช้เส้นทางที่แน่นอน ใช้ได้กับผู้ใช้ทุกคนยกเว้นคนนี้
Webnet

2

หากคุณมีปัญหาประเภทนี้กับ ispconfig3 และมีข้อผิดพลาดเช่นนี้

open_basedir มีผลบังคับใช้ ไฟล์ (/ var / www / clients / client7 / web15) ไม่อยู่ในเส้นทางที่อนุญาต: .........

ในการแก้ปัญหา (ในกรณีของฉัน) เพียงตั้งค่า PHP เป็น SuPHP ในแผง ispconfig3 ของเว็บไซต์

หวังว่าจะช่วยใครสักคน :)


2

ฉันมีปัญหานี้ @ หนึ่งในไซต์ wordpress ของฉันหลังจากอัปเดตและ / หรือย้าย :)

ตรวจสอบในตารางฐานข้อมูล 'wp_options' the 'upload_path' และแก้ไขให้ถูกต้อง ...


คุณตั้งค่าเป็นค่าอะไร /[...]/public_html/wp-content/uploads
brett

1

หากใช้ ispconfig3:

ไปที่ส่วนเว็บไซต์ -> ตัวเลือก -> PHP open_basedir:

ป้อนคำอธิบายภาพที่นี่

  • ในช่องนี้ได้อธิบายเส้นทางที่อนุญาตและแต่ละเส้นทางจะถูกคั่นด้วย ":"

/ var / www / clients / client2 / web3 / image: / var / www / clients / client2 / web3 / web: / var / www / ... และอื่น ๆ

  • ดังนั้นที่นี่ต้องวางเส้นทางที่คุณต้องการเข้าถึงในกรณีของฉันคือ:

/ var / www / clients / client2 / web3 / image:

  • ปัญหาปรากฏขึ้นเนื่องจาก:

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


0

หากคุณใช้PHP IIS stackและมีข้อผิดพลาดนี้มักเป็นการแก้ไขการอนุญาตอย่างรวดเร็ว

หากคุณดูแลเซิร์ฟเวอร์ windows ด้วยตัวเองและสามารถเข้าถึงได้ให้ลองใช้ FIRST นี้:

ไปที่โฟลเดอร์ที่ทำให้คุณรู้สึกเศร้าใจกับการเขียนถึงและคลิกขวาที่มัน> เปิดคุณสมบัติ> ความปลอดภัย

ดูว่าผู้ใช้มีสิทธิ์เข้าถึงโฟลเดอร์ใดบ้างซึ่งผู้ใช้อ่านอย่างเดียวและโฟลเดอร์ใดมีข้อมูลครบถ้วน คุณมีกลุ่มที่บล็อกการเขียนหรือไม่?

การแก้ไขจะเฉพาะเจาะจงสำหรับการตั้งค่า IIS ของคุณคุณใช้การรับรองความถูกต้องแบบไม่ระบุชื่อกับผู้ใช้เฉพาะ IUSR หรือด้วยข้อมูลประจำตัว Application Pool หรือไม่

ไม่ว่าในกรณีใดคุณจะต้องเพิ่มสิทธิ์การเขียนแบบเต็มใหม่สำหรับหนึ่งใน IUSR, IIS_IUSRS หรือข้อมูลประจำตัวแอปพลิเคชันพูลของคุณ - อย่างที่ฉันพูดไปสิ่งนี้จะแตกต่างกันไปขึ้นอยู่กับการตั้งค่าและวิธีที่คุณต้องการ คุณสามารถลงไปที่หลุมกระต่ายของ Google ในโพสต์นี้ (หนึ่งโพสต์ดังกล่าว - สิทธิ์ IIS_IUSRS และ IUSR ใน IIS8 ) สำหรับฉันฉันใช้ anon กับข้อมูลประจำตัวแอปพูลของฉันเพื่อให้ฉันได้รับMACHINE_NAME\IIS_IUSRSอ่าน / เขียนแบบเต็มได้ในทุกอุณหภูมิหรืออัปโหลด โฟลเดอร์

ฉันไม่จำเป็นต้องเพิ่มอะไรเพิ่มเติมopen_basedir =ใน php.ini ของฉัน


0

นอกจากคำตอบของ @ yogihostingแล้วหากคุณใช้DirectAdminให้ทำตามขั้นตอนต่อไปนี้:

  1. ไปที่หน้าล็อกอินของ DirectAdmin โดยปกติพอร์ตของมันคือ 2222
  2. เข้าสู่ระบบในฐานะผู้ดูแลระบบ ชื่อผู้ใช้เป็นadminค่าเริ่มต้น
  3. จาก "ระดับการเข้าถึง" บนแผงด้านขวาตรวจสอบว่าคุณอยู่ใน "ระดับผู้ดูแลระบบ" ถ้าไม่ให้เปลี่ยนเป็น
  4. จากส่วน "คุณลักษณะพิเศษ" คลิกที่ "การกำหนดค่า HTTPD ที่กำหนดเอง"
  5. เลือกโดเมนที่คุณต้องการเปลี่ยน
  6. ป้อนการกำหนดค่าที่คุณต้องการเปลี่ยนแปลงในพื้นที่ข้อความที่ด้านบนสุดของหน้า คุณควรพิจารณาไฟล์คอนฟิกูเรชันที่มีอยู่และแก้ไขค่าตามมัน ตัวอย่างเช่นหากคุณเห็นว่าopen_basedirมีการตั้งค่าภายใน a <Directory>คุณอาจจะต้องล้อมรอบการเปลี่ยนแปลงใน<Directory>แท็กที่เกี่ยวข้อง:

    <Directory "/path/to/directory">
        php_admin_value open_basedir none
    </Directory>
    
  7. หลังจากทำการเปลี่ยนแปลงที่จำเป็นแล้วให้คลิกปุ่ม "บันทึก"

  8. ตอนนี้คุณควรเห็นการเปลี่ยนแปลงของคุณที่บันทึกไว้ในไฟล์กำหนดค่าหากถูกต้อง

มีวิธีอื่นในการแก้ไขไฟล์กำหนดค่าอย่างไรก็ตาม:

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

  1. เข้าสู่ระบบเซิร์ฟเวอร์ของคุณในฐานะรูท
  2. /usr/local/directadmin/data/usersไปที่ จากผู้ใช้ที่อยู่ในรายการให้ไปที่โดเมนที่เกี่ยวข้องกับโดเมนที่คุณต้องการเปลี่ยนแปลง
  3. ที่นี่มีhttpd.confไฟล์ ทำการสำรองข้อมูลจากมัน:

    cp httpd.conf httpd.conf.back
    
  4. ตอนนี้แก้ไขไฟล์การกำหนดค่าด้วยตัวแก้ไขที่คุณเลือก ยกตัวอย่างเช่นการแก้ไขที่มีอยู่เพื่อopen_basedir noneอย่าพยายามนำสิ่งต่างๆออกไม่เช่นนั้นคุณอาจพบปัญหาเครื่องขัดข้อง บันทึกไฟล์หลังจากแก้ไข

  5. รีสตาร์ทเว็บเซิร์ฟเวอร์ Apache โดยใช้วิธีใดวิธีหนึ่งต่อไปนี้ (ใช้sudoหากจำเป็น):

    httpd -k graceful
    apachectl -k graceful
    apache2 -k graceful
    
  6. หากคุณพบข้อผิดพลาดให้แทนที่ไฟล์คอนฟิกูเรชันหลักด้วยไฟล์สำรองและรีสตาร์ทเว็บเซิร์ฟเวอร์

อีกครั้งวิธีแก้ปัญหาแรกเป็นวิธีที่ต้องการและคุณไม่ควรลองวิธีที่สองในครั้งแรก ตามที่ระบุไว้ในข้อควรระวังข้อดีของวิธีแรกคือป้องกันไม่ให้บันทึกสิ่งที่กำหนดค่าไม่ดีของคุณ

หวังว่าจะช่วยได้!


0

ฉันใช้ Apache vhost -File เพื่อเรียกใช้ PHP ด้วยตัวเลือก ini เฉพาะแอปพลิเคชันบนเซิร์ฟเวอร์ windows ของฉัน ดังนั้นฉันจึงใช้-dอ็อพชันของ php-command

ฉันกำลังตั้งค่าopen_basedirสำหรับทุกแอปพลิเคชันเป็นหนึ่งในตัวเลือกเหล่านี้

ฉันต้องการตั้งค่า URL หลายรายการเป็น open_basedir รวมถึงUNC-Pathและไวยากรณ์สำหรับกรณีนี้หายากเล็กน้อย คุณต้องแยกเส้นทางด้วยอัฒภาคและหากเส้นทางแรกของคุณเริ่มต้นด้วยตัวอักษรไดรฟ์คุณอาจต้องเริ่มรายการด้วยเครื่องหมายอัฒภาคด้วย อย่างน้อยนั่นคือสิ่งที่เหมาะกับฉัน

ตัวอย่าง:

php.exe -d open_basedir=;d:/www/applicationRoot;//internal.unc.path/ressource/

-3

เพียงแค่ค้นหา

open_basedir =

ใน php.ini และปิดการใช้งาน นั่นเป็นทางออกที่ง่ายที่สุดในการแก้ปัญหานี้

ก่อนการเปลี่ยนแปลง open_basedir =

หลังการเปลี่ยนแปลง ;open_basedir =

Ps - หลังจากการเปลี่ยนแปลงอย่าลืมรีสตาร์ทเซิร์ฟเวอร์ของคุณ

สนุก ;)


3
อย่าทำแบบนี้ ... ความปลอดภัยเชื่อหรือไม่สำคัญ :) เวลาอ่านเอกสารบนเครื่องมือของคุณ: php.net/manual/en/ini.core.php#ini.open-basedir
Adam Lenda
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.