quyền file_put_contents bị từ chối


97

Tôi đang cố gắng ghi một truy vấn vào một tệp để gỡ lỗi. Tệp có trong database/execute.php. Tệp tôi muốn ghi là database/queries.php.

Tôi đang cố gắng sử dụng file_put_contents('queries.txt', $query)

Nhưng tôi đang nhận được

file_put_contents (queries.txt) [function.file-put-content]: không mở được luồng: Quyền bị từ chối

Tôi có queries.txttệp chmod'd đến 777, vấn đề có thể là gì?


Bạn đã xem qua php.initệp cho bất kỳ điều gì có thể từ chối quyền truy cập tệp chưa?
Hello71,

2
cũng chắc chắn rằng các thư mục được chmod'd đúng
Crayon Violent

1
cũng thử sử dụng tên tệp tuyệt đối. Có thể chỉ là cách diễn giải của bạn về thư mục hiện tại khác với của PHP
laher

1
Bạn có thể kiểm tra lại trạng thái chmod đó không?
Jonah

1
Có một danh sách kiểm tra xử lý sự cố cho loại vấn đề: stackoverflow.com/questions/36577020/...
Vic Seedoubleyew

Câu trả lời:


72

Hãy thử điều chỉnh các quyền của thư mục.

từ một thiết bị đầu cuối, chạy chmod 777 database(từ thư mục chứa thư mục cơ sở dữ liệu)

apache và sẽ không ai có quyền truy cập vào thư mục này nếu nó được chmodd'ed chính xác.

Điều khác cần làm là echo "getcwd ()". Thao tác này sẽ hiển thị cho bạn thư mục hiện tại và nếu đây không phải là '/something.../database/' thì bạn cần phải thay đổi 'query.txt' thành đường dẫn đầy đủ cho máy chủ của mình.


104
777 không phải là một rủi ro bảo mật?
hitautodestruct

12
Tôi thực sự nghi ngờ rằng không chỉ tài khoản máy chủ phải có thể ghi được thư mục đích mà mọi thư mục mẹ của thư mục đích phải cho phép tài khoản máy chủ điều hướng vào đó; Tôi nghĩ rằng đây sẽ là + x cho các quyền.
Erhannis

2
Tôi đã thử nghiệm các lý thuyết của Erhannis trên một ngăn xếp LAMP mới và lý thuyết là đúng.
thotheolh

4
@MajidFouladpour Tôi nghĩ chmod +x /parent/directory, đối với mọi thư mục mẹ của đích. chmod +x /parent/directory, chmod +x /parentv.v.
Erhannis

1
Bây giờ có một danh sách kiểm tra xử lý sự cố cho loại vấn đề: stackoverflow.com/questions/36577020/...
Vic Seedoubleyew

18

Các tùy chọn khác

là bạn có thể làm Apache (www-data), chủ sở hữu của thư mục

sudo chown -R www-data:www-data /var/www

điều đó sẽ làm cho file_put_contentscông việc ngay bây giờ. Nhưng để bảo mật hơn, bạn cũng nên đặt các quyền như bên dưới

find /var/www -type d -print0 | xargs -0 chmod 0755 # folder
find /var/www -type f -print0 | xargs -0 chmod 0644 # files
  • thay đổi /var/wwwthư mục gốc của các tệp php của bạn

7

Nhận ra rằng điều này đã khá cũ rồi, nhưng không cần phải viết thủ công các truy vấn vào một tệp như thế này. MySQL có hỗ trợ đăng nhập được tích hợp sẵn, bạn chỉ cần kích hoạt nó trong môi trường nhà phát triển của mình.

Hãy xem tài liệu cho 'nhật ký truy vấn chung':

http://dev.mysql.com/doc/refman/5.1/en/query-log.html


3

Các bạn ơi, mình gặp vấn đề này 1 tháng và đã làm mọi cách nhưng không khắc phục được, nhưng giờ mình đã biết giải pháp.

Tôi sử dụng lưu trữ linux được chia sẻ, khi quản trị viên của tôi thay đổi php thành 5.3, tôi đã gặp nhiều lỗi đối với mã "file_put_contents". thử kiểm tra kế hoạch của tôi:

Trong máy chủ của bạn, hãy tạo một tệp như mytest.php và đặt mã này vào và lưu:

<?php        mail('Your-EMail','Email-Title','Email-Message');        ?>

Mở URL "www.your-domain.com/mytest.php" một lần rồi kiểm tra email của bạn. bạn sẽ có một email từ máy chủ của bạn với thông tin bạn đã nhập trong mytest.php, hãy kiểm tra tên người gửi. nếu nó từ Không ai, bạn có vấn đề về "Quyền bị Từ chối" vì điều gì đó không được xác định và nếu tên người gửi giống như id của tôi: iietj8qy@hostname5.netly.net thì bạn không có quyền quản lý.

Quản trị viên của tôi đã thay đổi máy chủ và cài đặt lại máy chủ, tôi nghĩ và vấn đề đã được giải quyết, hãy nói với quản trị viên máy chủ của bạn những gì tôi đã nói với bạn và có thể họ sẽ tìm thấy câu trả lời.

hy vọng nó sẽ giúp bạn!


Tôi hoàn toàn mất hút !! Bạn đang cố nói điều gì vậy? Nếu bạn đang nói rằng người dùng apache không thể lấy được tên máy chủ trên máy chủ (dùng chung hoặc bất cứ thứ gì), thì đã đến lúc bạn nên xem xét lại lựa chọn dịch vụ lưu trữ của mình.
Fr0zenFyr

3

Tôi biết rằng đó là một câu hỏi rất cũ, nhưng tôi muốn thêm giải pháp tốt với một số giải thích chuyên sâu. Bạn sẽ phải thực hiện hai câu lệnh trên Ubuntu giống như các hệ thống và sau đó nó hoạt động như một sự quyến rũ.

Quyền trong Linux có thể được biểu diễn bằng ba chữ số. Chữ số đầu tiên xác định quyền của chủ sở hữu tệp. Chữ số thứ hai cho phép của một nhóm người dùng cụ thể. Chữ số thứ ba xác định quyền cho tất cả người dùng không phải là chủ sở hữu cũng như thành viên của nhóm.

Máy chủ web phải thực thi với một id là thành viên của nhóm. Máy chủ web không bao giờ được chạy với cùng một id với chủ sở hữu của các tệp và thư mục. Trong Ubuntu chạy apache dưới id www-data. Id đó phải là thành viên của nhóm mà các quyền được chỉ định.

Để cấp cho thư mục mà bạn muốn thay đổi nội dung của tệp các quyền thích hợp, hãy thực hiện câu lệnh:

find %DIR% -type d -exec chmod 770 {} \;

Điều đó ngụ ý trong câu hỏi của OP rằng các quyền đối với thư mục% ROOT% / database nên được thay đổi tương ứng. Điều quan trọng là không có các tệp trong thư mục đó mà không bao giờ được thay đổi hoặc xóa. Cách tốt nhất là tạo một thư mục riêng cho các tệp có nội dung phải thay đổi.

Quyền đọc (4) cho một thư mục có nghĩa là có thể thu thập tất cả các tệp và thư mục với siêu dữ liệu của chúng trong một thư mục. Quyền ghi (2) cho phép thay đổi nội dung của thư mục. Ngụ ý thêm và xóa tệp, thay đổi quyền, v.v. Quyền thực thi (1) có nghĩa là bạn có quyền đi vào thư mục đó. Nếu không có cái sau thì không thể đi sâu hơn vào thư mục. Máy chủ web cần quyền đọc, ghi và thực thi khi nội dung của tệp được thay đổi. Do đó cần nhóm chữ số 7.

Tuyên bố thứ hai nằm trong câu hỏi của OP:

find %DOCUMENT_ROOT%/database -type f -exec chmod 760 {} \;

Có thể đọc và viết một tài liệu là bắt buộc, nhưng không bắt buộc phải thực thi tệp. Số 7 được trao cho chủ sở hữu của các tệp, số 6 được trao cho nhóm. Máy chủ web không cần phải có quyền thực thi tệp để thay đổi nội dung của nó. Các quyền ghi đó chỉ nên được cấp cho các tệp trong thư mục đó.

Tất cả những người dùng khác sẽ không được cấp bất kỳ quyền nào.

Đối với các thư mục không yêu cầu thay đổi tệp của nó, các quyền nhóm là đủ 5. Tài liệu về quyền và một số ví dụ:

https://wiki.debian.org/Permissions

https://www.linux.com/learn/tutorials/309527-und hieu-linux-file-permissions

http://www.linux.org/threads/file-permissions-chmod.4094/


3

Thu thập thông tin từ liên kết stackoverflow-lưu hình ảnh này không hoạt động với chmod 777 và từ người dùng azerafati và Loek Bergman

nếu bạn nhìn vào tệp / etc / apache / envvars, bạn sẽ thấy một cái gì đó như:

export APACHE_RUN_USER=www-data
export APACHE_RUN_GROUP=www-data

Apache được chạy dưới tên người dùng 'www-data'

'0755' có nghĩa là chủ sở hữu tệp có thể đọc / ghi / thực thi nhưng nhóm và những người dùng khác không thể ghi. vì vậy trong thiết bị đầu cuối của bạn, cd vào thư mục chứa thư mục 'hình ảnh' của bạn. sau đó gõ:

find images -type d -exec chmod 0755 {} \;
find images -type f -exec chmod 0755 {} \;
sudo chown -R www-data:www-data images

bạn phải thay đổi quyền truy cập trước khi thay đổi chủ sở hữu. nhập mật khẩu của bạn khi được nhắc. điều này sẽ làm cho 'www-data' là chủ sở hữu của thư mục hình ảnh.

tải lên của bạn bây giờ sẽ hoạt động.


1

Đối với bất kỳ ai sử dụng Ubuntu và gặp lỗi này khi tải trang cục bộ, nhưng không phải trên dịch vụ lưu trữ web,

Tôi vừa sửa lỗi này bằng cách mở nautilus ( sudo nautilus) và nhấp chuột phải vào tệp bạn đang cố mở, nhấp vào thuộc tính> Cài đặt> và cho phép đọc ghi cho 'mọi người khác'


0

có cùng một vấn đề; vấn đề của tôi là selinux đã được thiết lập để thực thi.

Tôi tiếp tục nhận được lỗi "không mở được luồng: Quyền bị từ chối" ngay cả sau khi chmoding thành 777 và đảm bảo rằng tất cả các thư mục mẹ đều có quyền thực thi cho người dùng apache. Hóa ra vấn đề của tôi là selinux đã được thiết lập để thực thi (tôi đang sử dụng centos7), đây là một devbox nên tôi đã tắt nó đi.


0

Điều này có thể được giải quyết trong giải quyết bằng các bước sau:

1. $ php artisan cache:clear

2. $ sudo chmod -R 777 storage

3. $ composer dump-autoload

Hy vọng nó giúp


0

Nếu bạn đang kéo từ git từ cục bộ sang máy chủ, đôi khi bạn sẽ cần xóa bộ nhớ cache vì các tệp xem nó được tải lên cùng với nó / hoặc các tệp được lưu trong bộ nhớ cache khác.

php artisan cache:clear

Đôi khi nó có thể chỉ là một mẹo nếu ứng dụng của bạn hoạt động trước khi kéo git


0

điều này có thể giúp. Nó đã làm việc cho tôi. thử nó trong thiết bị đầu cuối

setenforce 0


-2

Có 2 cách để giải quyết vấn đề này
1. sử dụng chmod 777 path-to-your-directory.
nếu nó không hoạt động thì
2. chỉ cần cung cấp đường dẫn đầy đủ của tệp của bạn query.txt.


2
Đây là một thực hành cực kỳ tồi tệ và không an toàn. Nó cũng khó phát hiện và sửa chữa khi phát triển các ứng dụng tùy chỉnh và có thể dễ dàng bị bỏ qua. Hãy thực sự tìm ra các quyền phù hợp.
ftrotter,

-3

Đây là giải pháp. Để sao chép một img từ một URL. URL này:http://url/img.jpg

$image_Url=file_get_contents('http://url/img.jpg');

tạo đường dẫn mong muốn kết thúc tên bằng .jpg

$file_destino_path="imagenes/my_image.jpg";

file_put_contents($file_destino_path, $image_Url)

-11

Hơn nữa, như đã nói ở file_put_contents man pagetrong php.net, hãy cẩn thận với các vấn đề đặt tên.

file_put_contents($dir."/file.txt", "hello");

có thể không hoạt động (mặc dù nó đúng về cú pháp), nhưng

file_put_contents("$dir/file.txt", "hello");

làm. Tôi đã trải nghiệm điều này trên các máy chủ được cài đặt php khác nhau.


17
Điều này LAF không đúng. $dir."/file.txt"là tương đương về mặt chức năng "$dir/file.txt"trong mọi trường hợp, giả sử $dirlà một chuỗi. Hơn nữa, hành vi này không được ghi lại trên php.net, như Kivanc tuyên bố.
mattbasta
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.