2013-01-09 23 views
5

Tôi có một PHP kịch bản xử lý hình ảnh, và nó có chứa đoạn mã sau:PHP is_readable trả về true cho tập tin không thể đọc được

 if (!is_dir($fullFile)) { 
      if (is_readable($fullFile)) { 
       $im = getimagesize($fullFile); // Will be FALSE if not an image 

Trong một số trường hợp, kịch bản sẽ thất bại tại getimagesize với các lỗi sau:

getimagesize(/path/to/file.jpg) [function.getimagesize]: failed to open stream: Permission denied at www.yada.yada/page.php 

Trong trường hợp này, các điều khoản cho /path/to/file.jpg chắc chắn là cấm (400), vì vậy tôi đã dự kiến ​​thử nghiệm is_readable để ngăn tôi đến điểm đó. Ngoài việc thiết lập các quyền khác nhau, tôi có thể làm gì để giải quyết vấn đề này? Tại sao có vẻ như is_readable có kết quả không chính xác? Có thể là is_readable đang hoạt động với EUID của chủ sở hữu tập tin, trong khi getimagesize là không? Đó là lời giải thích duy nhất có ý nghĩa với tôi, nhưng ngay cả tri thức đó cũng không giúp giải quyết được.

Xuất phát từ @ hek2mgl Tôi tạo ra kịch bản này cực kỳ phức tạp, tên readable.php:

<?php echo is_readable("/stora2/Pics/2009/2009-07-26/DSC00532.JPG") . "\n\n"; ?> 

Sau đó, tôi chuyển sang sử dụng cho người sử dụng máy chủ web (trên thực tế www-data trên máy chủ này) và chạy nó. Kết quả là

1 

Sau đó, tôi chạy strace giống như người dùng đó. Đây là những lệnh tôi đã sử dụng. Kết quả là một 70KB + tập tin, và SO sẽ không cho phép tôi gửi nó một cách trọn vẹn, vì vậy nó được niêm yết tại http://pastebin.com/mFqiSBiz

[email protected]:~$ sudo su - www-data 

$ ls -l "/stora2/Pics/2009/2009-07-26/DSC00532.JPG" 
-rw------- 1 dennis dennis 524288 2012-02-11 08:18 /stora2/Pics/2009/2009-07-26/DSC00532.JPG 

$ file "/stora2/Pics/2009/2009-07-26/DSC00532.JPG" 
/stora2/Pics/2009/2009-07-26/DSC00532.JPG: writable, regular file, no read permission 

$ php /home/dennis/readable.php 
1 

$ strace php /home/dennis/readable.php > /tmp/strace.out 2>&1 

Không chắc những gì tôi đang tìm kiếm. Xin cho biết.

+0

* "Hãy nhớ rằng PHP có thể truy cập tệp dưới dạng id người dùng mà máy chủ web chạy như (thường là 'không có ai') . "* – Madbreaks

+2

Kết quả cũng có thể được lưu trong bộ nhớ cache. Hãy thử ['clearstatcache()'] (http://php.net/manual/en/function.clearstatcache.php) – Phil

+0

Người dùng nào sở hữu tệp và máy chủ web của bạn đang chạy như thế nào? –

Trả lời

2

Tùy thuộc vào phiên bản của php bạn đang chạy, đây có thể là một lỗi, như hek2mgl cho biết trong các ý kiến. Nếu bạn muốn giải quyết vấn đề này, bạn có thể thêm logic dựa trên quyền của tệp, với fileperms

+0

Giúp tôi vượt qua bướu, cảm ơn. Tôi đã sử dụng: >>> nếu (fileperms (& fullFile) & 0x04 == 0x04) {<<< thay cho >>> nếu (is_readable (& fullFile)) {<<< – Dennis

Các vấn đề liên quan