hạn chế open_basedir có hiệu lực. Tệp (/) không nằm trong (các) đường dẫn được phép:


87

Tôi gặp lỗi này khi tải ảnh đại diện lên trang web của mình. Tôi chưa bao giờ mắc phải nó trước đây và không có gì được thay đổi gần đây khiến tôi bắt đầu gặp lỗi này ...

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

18
Bạn đã chấp nhận một câu trả lời không hoạt động.
sjas

Câu trả lời:


-22

Sửa đổi open_basedircài đặt trong cấu hình PHP của bạn (Xem Cấu hình thời gian chạy ).

Các open_basedirthiết lập chủ yếu được sử dụng để ngăn chặn kịch bản PHP cho một người dùng cụ thể truy cập vào các file trong tài khoản của người dùng khác. Vì vậy, thông thường, bất kỳ tệp nào trong tài khoản của bạn đều có thể đọc được bằng các tập lệnh của riêng bạn.

Cài đặt ví dụ thông qua .htaccessnếu PHP chạy dưới dạng mô-đun Apache trên hệ thống Linux:

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

2
@Nikesh này đã cho tôi một lỗi 500 sau khi tôi bỏ nó vào .htaccces của tôi và thay đổi các đường dẫn đến: /my/cutsom/dir/. Không chắc tại sao lại nghĩ.
hitautodestruct

79
Tuyệt vời, 12 phiếu ủng hộ cho đến nay cho một câu trả lời không chính xác. Bạn không thể sử dụng php_admin_valuetrong .htaccesstệp . Bạn không thể sử dụng DirectoryMatch trong các tệp .htaccess . (Những loại biện pháp an ninh sẽ open_basedirđược nếu nó chỉ có thể bị vô hiệu hóa?)
Álvaro González

1
@eoinoc - Cuộn xuống và xem câu trả lời của Andrei. Hoặc chỉnh sửa tệp php.ini toàn cầu.
Álvaro González

19
BẠN KHÔNG ĐƯỢC ĐẶT NÀY VÀO HTACCESS CỦA BẠN! NHƯNG RATHER VÀO TỆP CẤU HÌNH CẤU HÌNH CẤU HÌNH Tệp tin của bạn.
tfont

8
Bao gồm cả thư mục gốc trong open_basedir sẽ đánh bại hoàn toàn mục đích của open_basedir. Giải pháp này chỉ "hoạt động" theo nghĩa là nó về cơ bản vô hiệu hóa hạn chế.
Martin

113

Sửa đổi cài đặt open_basedir trong tài khoản lưu trữ của bạn và không đặt chúng thành không. Tìm cài đặt open_basedir được cung cấp trong khu vực 'Cài đặt PHP' của Plesk / cPanel của bạn. Đặt nó thành 'none' từ menu thả xuống ở đó. Tôi đã hiển thị chúng trong hình ảnh bảng điều khiển Plesk.

nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây


1
@yogihosting sau khi làm điều này tôi đã nhận lỗi - Không thể xác định vị trí các mô hình mà bạn đã xác định: Home_model
Heemanshu Bhalla

1
Hơi muộn đối với điều này, nhưng có cách nào để làm điều đó cho tất cả các trang web không? Tôi đã đặt nó thành không có trong toàn cầu php.ini cho phiên bản mà các trang web đang sử dụng: gyazo.com/dfffbe7f9b3a20ede97da72f1ddfc777 Nhưng họ vẫn gặp lỗi.
Matt Cowley

@MattCowley bạn phải thực hiện việc này cho từng và mọi trang web được lưu trữ trong bảng plesk.
yogihosting

1
Câu trả lời rất hữu ích, vấn đề của tôi được giải quyết Thumbs up :)
muhammadanish

1
Cảm ơn cho giải pháp này! Điều này làm việc hoàn hảo cho tôi trên Chia sẻ lưu trữ!
Smilefounder,

38

Để giải quyết lỗi này, bạn phải chỉnh sửa tệp httpd.conf. Cách trước khi nó có thể được nhìn thấy trong phpinfo trong chỉ thị phần apache2handler Server Root. Ví dụ, trong trường hợp của tôi theo cách này - / etc / httpd / httpd.conf. Mở tệp httpd.conf, tìm đề cập đến tham số open_basedir. Và đặt nó thành không. ( php_admin_value open_basedir none )


Cài đặt thành 'không có gì' phù hợp với tôi - sử dụng giao diện Plesk.
diggersworld

8
Tôi tìm thấy open_basedircấu hình trong của tôi php.ini. (Arch Linux trên Raspberry Pi với php 5)
dennisschagt

2
Cũng tìm thấy nó trong php.ini của tôi (cũng là Arch). Chỉ cần bình luận ra dòng để đạt được hiệu quả như câu trả lời này.
Ben Elgar

@BenElgar chỉ bằng cách bình luận dòng đã đề cập đến các tác phẩm, tôi chỉ hỏi là có rủi ro ở đó không
mwangaben

6

Nếu bạn đang chạy điều này với php file.php. Bạn cần chỉnh sửa php.ini Tìm tệp này:

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

Và nối đường dẫn của tệp vào thuộc open_basedirtính:

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


Đây là giải pháp duy nhất trỏ đến nhiều đường dẫn cụ thể thay vì chỉ bỏ qua bảo mật hoàn toàn.
mvreijn

5

Đối với tôi, vấn đề là các giá trị cấu hình bị lỗi / thiếu cho máy chủ Plesk đang chạy toàn bộ. Tôi chỉ làm theo hướng dẫn tại đây: http://davidseah.com/blog/2007/04/separate-php-error-logs-for-multiple-domains-with-plesk/

Bạn có thể định cấu hình PHP để có một tệp nhật ký lỗi riêng biệt cho từng định nghĩa VirtualHost. Bí quyết là biết chính xác cách thiết lập nó, vì bạn không thể chạm trực tiếp vào cấu hình mà không phá vỡ Plesk. Mỗi tên miền trên (dv) của bạn đều có thư mục riêng trong / var / www / vhosts. Một thư mục điển hình có các thư mục cấp cao nhất sau:

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

Bạn sẽ muốn tạo một tệp vhost.conf trong thư mục conf / của thư mục tên miền với các dòng sau:

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

Thay đổi giá trị đầu tiên để phù hợp với cài đặt thực tế của bạn (tôi đã sử dụng /tmp/phperrors.log). Sau khi bạn chỉnh sửa xong tệp vhost.conf, hãy kiểm tra cấu hình từ bảng điều khiển với:

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

/etc/init.d/httpd configtest

Và cuối cùng nói với Plesk rằng bạn đã thực hiện thay đổi này.

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

2

Đường dẫn bạn đang tham khảo là không tồn tại và không nằm trong thư mụcRoot của không gian làm việc của bạn. Hãy thử tạo một đường dẫn tuyệt đối cho tệp bạn muốn truy cập, nơi bạn có thể đang sử dụng một đường dẫn tương đối ...


Nó sử dụng một đường dẫn tuyệt đối. Nó hoạt động cho tất cả người dùng ngoại trừ người này.
Webnet

2

nếu bạn gặp sự cố như vậy với ispconfig3 và gặp lỗi như thế này

hạn chế open_basedir có hiệu lực. Tệp (/ var / www / client / client7 / web15) không nằm trong (các) đường dẫn được phép: .........

Để giải quyết vấn đề này (trong trường hợp của tôi), chỉ cần đặt PHP thành SuPHP trong bảng điều khiển ispconfig3 của Trang web

Hy vọng nó sẽ giúp ai đó :)


2

Tôi đã gặp sự cố này @ một trong các trang web wordpress của tôi sau khi cập nhật và / hoặc di chuyển :)

Kiểm tra bảng cơ sở dữ liệu 'wp_options' 'upload_path' và chỉnh sửa nó đúng cách ...


bạn đã đặt nó thành giá trị nào? /[...]/public_html/wp-content/uploads?
brett

1

Nếu sử dụng ispconfig3:

Đi tới phần Trang web -> Tùy chọn -> PHP open_basedir:

nhập mô tả hình ảnh ở đây

  • Trong trường này đã mô tả các đường dẫn được phép và mỗi đường dẫn được phân tách bằng ":"

/ var / www / client / client2 / web3 / image: / var / www / client / client2 / web3 / web: / var / www / ..., v.v.

  • Vì vậy, ở đây phải đặt đường dẫn mà bạn muốn có quyền truy cập, trong trường hợp của tôi là:

/ var / www / client / client2 / web3 / image:

  • Sự cố xuất hiện vì:

Khi một tập lệnh cố gắng truy cập vào hệ thống tập tin, chẳng hạn như sử dụng include hoặc fopen (), vị trí của tập tin sẽ được chọn. Khi tệp nằm ngoài cây thư mục được chỉ định, PHP sẽ từ chối truy cập nó.


0

Nếu bạn đang chạy một ngăn xếp PHP IIS và gặp lỗi này, đó thường là một bản sửa lỗi cấp phép nhanh chóng.

Nếu bạn tự quản lý máy chủ windows và có quyền truy cập, hãy thử điều này ĐẦU TIÊN:

Điều hướng đến thư mục đang khiến bạn phải đau đầu khi ghi và nhấp chuột phải vào thư mục đó> mở thuộc tính> bảo mật.

Xem những gì người dùng có quyền truy cập vào thư mục, những gì chỉ đọc và những gì có đầy đủ. Bạn có một nhóm đang chặn ghi?

Bản sửa lỗi sẽ dành riêng cho thiết lập IIS của bạn, bạn đang sử dụng Xác thực ẩn danh với IUSR của người dùng cụ thể hay với danh tính Nhóm ứng dụng?

Bằng mọi giá, bạn sẽ kết thúc việc thêm quyền ghi đầy đủ mới cho một trong các IUSR, IIS_IUSRS hoặc danh tính nhóm ứng dụng của bạn - như tôi đã nói, điều này sẽ thay đổi tùy thuộc vào thiết lập của bạn và cách bạn muốn thực hiện, bạn có thể đi xuống lỗ hổng của google về cái này (một bài đăng như vậy - quyền IIS_IUSRS và IUSR trong IIS8 ) Đối với tôi, tôi sử dụng anon với danh tính nhóm ứng dụng của mình để tôi có thể MACHINE_NAME\IIS_IUSRSđọc / ghi đầy đủ trên mọi thời điểm hoặc tải lên thư mục.

Tôi không cần thêm bất cứ điều gì bổ sung vào của tôi open_basedir =trong php.ini.


0

Ngoài câu trả lời của @ yogihosting , nếu bạn đang sử dụng DirectAdmin , hãy làm theo các bước sau:

  1. Truy cập trang đăng nhập của DirectAdmin. Thông thường, cổng của nó là 2222.
  2. Đăng nhập với tư cách quản trị viên. Tên người dùng của nó là admintheo mặc định.
  3. Từ "Cấp độ truy cập" trên bảng điều khiển bên phải, hãy đảm bảo rằng bạn đang ở "Cấp độ quản trị viên". Nếu không, hãy thay đổi nó.
  4. Từ phần "Tính năng bổ sung", nhấp vào "Cấu hình HTTPD tùy chỉnh".
  5. Chọn miền bạn muốn thay đổi.
  6. Nhập các cấu hình bạn muốn thay đổi trong vùng văn bản ở đầu trang. Bạn nên xem xét tệp cấu hình hiện có và sửa đổi các giá trị dựa trên nó. Ví dụ: nếu bạn thấy điều đó open_basedirđược đặt bên trong a <Directory>, có thể bạn nên đặt thay đổi của mình trong <Directory>thẻ có liên quan :

    <Directory "/path/to/directory">
        php_admin_value open_basedir none
    </Directory>
    
  7. Sau khi thực hiện các thay đổi cần thiết, hãy nhấp vào nút "Lưu".

  8. Bây giờ bạn sẽ thấy các thay đổi của mình được lưu vào tệp cấu hình nếu chúng hợp lệ.

Tuy nhiên, có một cách khác để chỉnh sửa tệp cấu hình:

Thận trọng : Hãy cẩn thận và tự chịu rủi ro khi sử dụng các bước sau vì bạn có thể gặp phải lỗi hoặc có thể dẫn đến thời gian chết. Cách được đề xuất là cách trước, vì nó ngăn bạn sửa đổi tệp cấu hình không đúng cách và hiển thị lỗi cho bạn.

  1. Đăng nhập vào máy chủ của bạn với tư cách là người chủ.
  2. Đi tới /usr/local/directadmin/data/users. Từ những người dùng được liệt kê, hãy chuyển đến một liên quan đến miền mà bạn muốn thay đổi.
  3. Đây, có một httpd.conftập tin. Tạo một bản sao lưu từ nó:

    cp httpd.conf httpd.conf.back
    
  4. Bây giờ hãy chỉnh sửa tệp cấu hình bằng trình chỉnh sửa của bạn. Ví dụ: chỉnh sửa hiện có open_basedirthành none. Đừng cố xóa mọi thứ, nếu không bạn có thể gặp phải thời gian chết. Lưu tệp sau khi chỉnh sửa.

  5. Khởi động lại máy chủ web Apache bằng một trong những cách sau (sử dụng sudonếu cần):

    httpd -k graceful
    apachectl -k graceful
    apache2 -k graceful
    
  6. Nếu bạn gặp bất kỳ lỗi nào, hãy thay thế tệp cấu hình chính bằng tệp đã sao lưu và khởi động lại máy chủ web.

Một lần nữa, giải pháp đầu tiên là giải pháp được ưu tiên hơn, và bạn không nên thử phương pháp thứ hai ở lần đầu tiên. Như đã lưu ý trong phần thận trọng, ưu điểm của cách đầu tiên là nó ngăn chặn việc lưu những thứ có cấu hình xấu của bạn.

Hy vọng nó giúp!


0

Tôi đang sử dụng Apache vhost -File để chạy PHP với các tùy chọn ini dành riêng cho ứng dụng trên máy chủ windows của tôi. Do đó tôi sử dụng tùy chọn -d của lệnh php.

Tôi đang đặt open_basedir cho mọi ứng dụng là một trong các tùy chọn này.

Tôi cần đặt nhiều url dưới dạng open_basedir, bao gồm cả UNC-Path và cú pháp cho trường hợp này hơi khó tìm. Bạn phải tách các đường dẫn bằng dấu chấm phẩy và nếu đường dẫn đầu tiên của bạn bắt đầu bằng dấu chấm phẩy , bạn cũng có thể phải bắt đầu danh sách bằng dấu chấm phẩy. Ít nhất đó là những gì hiệu quả với tôi.

Thí dụ:

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

-3

Chỉ cần tìm kiếm

open_basedir =

trong php.ini và vô hiệu hóa nó. Đó là giải pháp đơn giản nhất để giải quyết vấn đề này.

Trước khi thay đổi open_basedir =

Sau khi thay đổi ;open_basedir =

Ps - Sau khi thay đổi, đừng quên khởi động lại máy chủ của bạn.

Thưởng thức ;)


3
đừng làm điều này ... bảo mật là, tin hay không, quan trọng. :) Thời gian để đọc tài liệu về công cụ của bạn: php.net/manual/en/ini.core.php#ini.open-basedir
Adam Lenda
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.