Cho phép PHP ghi vào tệp và thư mục


13

CẬP NHẬT CHO CÂU HỎI THÊM

Theo http://expressionengine.com/user_guide/installation/installation.html , nó nói:

Đối với hầu hết các máy chủ Unix, điều sau đây là điển hình, nhưng bạn có thể kiểm tra với máy chủ của mình để xem có thể sử dụng các quyền hạn chế hơn để cho phép PHP ghi vào tệp (666) và thư mục (777) không . Trên các máy chủ Windows, những điều sau đây sẽ không được áp dụng, nhưng bạn sẽ cần đảm bảo rằng các tệp và thư mục có thể ghi được bằng ExpressionEngine. Bạn có thể cần liên hệ với chủ nhà của bạn cho điều này.

Không chắc điều này có nghĩa là gì. Tôi có thể thay đổi các tệp và thư mục cụ thể thành 666 và 777 tương ứng trong đó tôi là người bắt đầu, nhưng những âm thanh trên có vẻ như tôi cũng cần cho phép PHP thực hiện điều này?

CÂU HỎI GỐC:

Tôi cần đảm bảo rằng PHP có thể ghi vào các tệp cụ thể (666) và các thư mục (777).

Làm thế nào để tôi làm điều này?


2
Tôi không chắc vấn đề gì bạn đang cố gắng giải quyết? Nếu bạn có thể truy cập vào thư mục chứa tệp và có quyền thực thi trong đó, bạn có thể ghi vào tệp và thư mục có các quyền đó.
Karlson

Đã thêm thông tin chi tiết ở trên.
oshirowanen

1
Đối với hầu hết các máy chủ Unix, điều sau đây là điển hình, nhưng bạn có thể kiểm tra với máy chủ của mình để xem có thể sử dụng nhiều quyền hạn chế hơn để cho phép PHP ghi vào tệp (666) và thư mục (777) - Có bị hôn mê không? nếu không thì cụm từ này không có nghĩa gì cả. Trừ khi thư mục cấp cao hơn bị hạn chế, bạn không gặp vấn đề gì khi ghi vào các tệp hoặc thư mục có thể ghi trên thế giới.
Karlson

Tôi chỉ làm một bản sao và dán từ tài liệu. Ngoài ra, đó là lý do tại sao tôi đăng câu hỏi vì tôi không hiểu câu trích dẫn đó có nghĩa là gì ...
oshirowanen

1
Nếu bạn thấy tài liệu gợi ý rằng bạn sử dụng 666 hoặc 777 liên quan đến các tệp web, có lẽ bạn nên bỏ qua nó trừ khi có lý do chính đáng được giải thích. Nó thường là thứ được viết bởi một người không thể tìm ra cách thiết lập quyền, và từ bỏ và cho mọi người đọc hoặc ghi quyền truy cập vào các tệp.
jsbillings

Câu trả lời:


18

Tôi sẽ hoàn thành câu trả lời của rahmu và MV bằng một giải pháp kỹ thuật. Mọi thứ sau đây chỉ hợp lệ cho các hệ thống giống như UNIX.

Cuộn qua phần chmod / chown cho một ví dụ sử dụng ACL - một công cụ mạnh hơn các chế độ tệp UNIX.

Tìm tên người dùng máy chủ web của bạn

Trước tiên, bạn sẽ cần biết tên người dùng mà máy chủ web của bạn chạy. Nếu bạn đang sử dụng Apache, nó có thể được apachehoặc httpd, www-datavv Trên hầu hết các Debian giống như các hệ thống, Apache là www-data. Đối với nginx, nói chung, nó cũng là www-data.

Để kiểm tra, hãy thử:

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

Đảm bảo rằng tên người dùng mà lệnh này trả về là mạch lạc (ví dụ: tôi sử dụng nginx 99% thời gian, nhưng lệnh này trả về tomcat7, một máy chủ web Java tôi đã cài đặt một lần) .


Cấp quyền cho máy chủ web: sử dụng chmodchown

Thực hiện chmod666 hoặc 777 (giải pháp khắc phục cho loại vấn đề đó trong tài liệu / hướng dẫn xấu) có thể làm cho mọi thứ hoạt động một cách kỳ diệu, nhưng không an toàn. Cho phép 666 hoặc 777 sẽ cấp quyền truy cập cho "người khác". Vì vậy, không chỉ Apache, mà còn grandmothernsa(miễn là các tài khoản người dùng đó tồn tại trên máy của bạn - nhưng thực sự không, xin vui lòng tránh làm điều này trừ khi chỉ để kiểm tra / khắc phục sự cố).

Tốt hơn là nên cụ thể hơn và cấp quyền cho chỉ bạn và Apache. Thay đổi nhóm các tệp của bạn để cung cấp toàn quyền kiểm soát các tệp của bạn cho máy chủ web. Để làm điều này, thay đổi chủ sở hữu đệ quy:

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

Nhưng rất có thể, bạn có thể muốn giữ quyền truy cập đầy đủ vào các tệp của mình bằng cách chỉ thay đổi nhóm:

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

Sau đó, làm điều thích hợp chmodđể cung cấp cho nhóm www-datacác quyền giống như bạn. Ví dụ: nếu chế độ hiện tại là 640 (6 cho bạn, 4 cho dữ liệu www, 0 cho người khác, dịch sang -rw-r -----) , đặt thành 660 (6 cho bạn, 6 cho www- dữ liệu, 0 cho người khác, dịch sang -rw-rw ----) . Xem câu trả lời của rahmu để tìm hiểu thêm về các chế độ tệp, đây là một cơ chế cũ, tuy thanh lịch.

Để tránh thao tác với các số phức chmod, bạn cũng có thể sử dụng cú pháp này:

chmod -R g+rw your/folder/

Nó có nghĩa là "cho phép nhóm ( g), thêm ( +) đọc và ghi ( rw) trên thư mục your/folder/, đệ quy ( -R)".

Trong 90% trường hợp, điều này là đủ.


Phương pháp ưa thích của tôi: sử dụng ACL (Danh sách điều khiển truy cập)

Đôi khi giải pháp đầu tiên là không đủ. Tôi sẽ lấy ví dụ về Symfony Framework ghi nhật ký và lưu trữ rất nhiều dữ liệu. Vì vậy, nó cần truy cập ghi vào thư mục thích hợp.

Và phương thức chmod/ chowncó thể không đủ, khi bạn đang sử dụng song song Bảng điều khiển Symfony trong CLI (dưới tài khoản người dùng của tôi) và Web (người dùng máy chủ web). Điều này gây ra rất nhiều vấn đề vì Symfony liên tục sửa đổi quyền.

Trong trường hợp này, chúng tôi sẽ sử dụng ACL (Danh sách điều khiển truy cập), đây là cách nâng cao hơn để quản lý quyền trên nhiều hệ thống UNIX.

Tại đây các lệnh được cung cấp bởi tài liệu Symfony chính thức ( vui lòng thay đổi app/cacheapp/logstheo nhu cầu của bạn ):

Trên một hệ thống hỗ trợ chmod +a(ví dụ: không phải 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

Trên một hệ thống không hỗ trợ chmod +a(phổ biến nhất)

Bạn sẽ cần setfaclcông cụ; có thể nó được cài đặt trên hệ thống của bạn theo mặc định, vì vậy hãy thử setfacl -vxem lệnh có khả dụng không.

Nếu lệnh không khả dụng bạn đang sử dụng Ubuntu 14.04+, bạn sẽ chỉ cần cài đặt công cụ:

sudo apt install acl

Mặt khác, hãy làm theo tài liệu HĐH của bạn, bởi vì bạn có thể cần thay đổi cách phân vùng của bạn được gắn kết ( tài liệu Ubuntu tại đây ).

Và chúng tôi ở đó:

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

Tôi không bao giờ có bất kỳ vấn đề với phương pháp này, hài lòng hoặc tiền của bạn trở lại.


1
+1 cho 'ps phụ | grep -E '[a] pache | [h] ttpd | [_] www | [w] ww-data | [n] ginx' | root grep -v | đầu -1 | cắt -d \ -f1 '
Amar Pratap

4

Bất kể ai là chủ sở hữu của các tệp, 666 quyền và 777 sẽ là đủ: chữ số cuối cùng đảm bảo rằng mọi người dùng trên hệ thống đều có quyền truy cập. Mặc dù đây là cách dễ nhất để làm điều đó, nhưng nó chắc chắn không phải là an toàn nhất vì lý do chính xác đó.

Một cách tốt hơn để làm điều đó

Điều đầu tiên bạn cần hiểu là cách thức hoạt động của quyền Unix . Để hiểu câu trả lời tôi đưa ra tại liên kết này, xin lưu ý rằng các quyền có thể được dịch thành số:

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

A chmod 666sau đó tương đương với việc thay đổi quyền thành rw-rw-rw.

Tiếp theo, bạn phải tìm ra người dùng nào đang thực thi tập lệnh PHP. Thông thường đó sẽ là người dùng chạy máy chủ web của bạn. Đây là một ví dụ về cách thực hiện việc này (bạn có thể thay thế Apache bằng tên của máy chủ web của bạn).

Khi bạn biết người dùng nào đang thực thi các tập lệnh và chủ sở hữu của các tệp bạn đề cập, bạn phải đặt các quyền phù hợp. Hãy nhớ rằng việc cấp quyền truy cập ghi (thậm chí đọc) cho mọi người dùng trên hệ thống của bạn có thể gây ra thảm họa.


0

Expression Engine cũng giống như nhiều ứng dụng web PHP khác cần truy cập đọc + ghi vào một số tệp và thư mục. Ví dụ, EE yêu cầu quyền truy cập ghi vào các tệp config.php và cơ sở dữ liệu của nó và ghi quyền truy cập vào các thư mục tải lên tệp của nó.

Điều mà tài liệu nêu rõ là, vì hầu hết các máy chủ đều chạy PHP dưới dạng mod_php (và do đó chạy với sự cho phép của máy chủ web) và vì có thể bạn sẽ tải lên các tệp của mình bằng FTP (hoặc tương tự) bằng chính người dùng của mình, các tệp đó và thư mục sẽ cần được cấp quyền 666 (mọi người đều có thể đọc và viết) và 777 (mọi người đều có thể đọc, viết và duyệt).

Đó không phải là cách an toàn nhất, nhưng chắc chắn là cách dễ nhất, đặc biệt nếu bạn đang sử dụng dịch vụ lưu trữ.

Tuy nhiên, như trạng thái hướng dẫn EE, hãy hỏi nhà cung cấp dịch vụ lưu trữ của bạn, vì một số không sử dụng mod_php mà là fastcgi, suphp hoặc phiên bản khác. Các máy chủ đó chạy PHP với tư cách là người dùng của riêng bạn, vì vậy tất cả các tệp bạn tải lên đều có thể đọc và ghi được bởi PHP và bởi bất kỳ tệp nào được tạo bởi các tập lệnh EE. Trong trường hợp đó, các tệp và thư mục được truy cập bởi PHP sẽ cần được cấp quyền truy cập 600 và 700. Các tệp khác được máy chủ web truy cập trực tiếp (không phải thời gian chạy PHP) vẫn cần truy cập 666 và 777).

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.