Thận trọng khi dùng file_exists()

233 views
Skip to first unread message

pcdinh

unread,
Nov 7, 2007, 11:50:47 PM11/7/07
to PHPVietnam
Hôm nay tôi vừa phát hiện ra trong hệ thống templating system của tôi
có một lỗi liên quan đến việc dùng file_exists để kiểm tra sự tồn tại
của của file template. file_exists luôn trả lại false mặc dù trên thực
tế là file tồn tại. Lý do: file template được up lên với sở hữu của
root trong khi apache lại chạy dưới 1 user khác.

Cảnh báo của Manual

Warning

This function returns FALSE for files inaccessible due to safe mode
restrictions. However these files still can be included if they are
located in safe_mode_include_dir.

Nguyễn Tiến Sĩ

unread,
Nov 8, 2007, 2:15:50 AM11/8/07
to PHPVietnam
Cái này em gặp khi làm một dự án ở công ty.
Em dùng hàm include file đó nhưng vẫn ko mở được vì apache không có
quyền trên file đó.

zonium

unread,
Nov 8, 2007, 2:20:53 AM11/8/07
to PHPVietnam

Thoạt nghe có vẻ có lý nhưng test lại thì thấy không phải. Dường như
ownership của file không ảnh hưởng gì đến kết quả file_exists.

Đoạn mã test sau đây in ra yes khi chạy từ browser (và apache
webserver chạy dưới account không phải là root), và file a0.php thuộc
sở hữu của root.

if(file_exists("a0.php") ) echo "yes";
else echo "no";

vấn đề ở chỗ khác chăng ?

zonium

unread,
Nov 8, 2007, 2:43:59 AM11/8/07
to PHPVietnam

On Nov 7, 11:15 pm, Nguyễn Tiến Sĩ <mrsinguye...@gmail.com> wrote:
> Cái này em gặp khi làm một dự án ở công ty.
> Em dùng hàm include file đó nhưng vẫn ko mở được vì apache không có
> quyền trên file đó.

Theo tôi chỉ khi file cần include không có thuộc tính read cho others
(including apache) thì mới không include được. Ví dụ:

main.php
<?php
if(file_exists("/var/tmp/test.php") ) echo "yes";
else echo "no";
include ("/var/tmp/test.php");
?>

nếu file test.php có thuộc tính là rw-r----- thi không include được
(file_exists thì vẫn trả về true và giá trị in ra là yes)
Còn nếu test.php có thuộc tính là rw-r--r-- thì include OK

pcdinh

unread,
Nov 8, 2007, 4:45:38 AM11/8/07
to PHPVietnam
a0.php thuộc sở hữu của root và chmod của nó là gì?

rung

unread,
Nov 8, 2007, 11:45:11 PM11/8/07
to PHPVietnam
As (partly) warned by PHP manual, a call to file_exists() always
return FALSE if the file is inaccessible (due to safe mode
restrictions or whatever). Therefore, a directory with mode 700, say,
prevents others from accessing files in it and, in this case, calls to
file_exists() with any of the files in the directory as param would
return FALSE.
Message has been deleted

zonium

unread,
Nov 9, 2007, 12:53:04 AM11/9/07
to PHPVietnam

On Nov 8, 1:45 am, pcdinh <pcd...@gmail.com> wrote:
> a0.php thuộc sở hữu của root và chmod của nó là gì?

của nó là là rw-r--r--

Nhưng dù thuộc tính nào thì file_exists vẫn trả về TRUE. Như vậy không
kết luận được là kết quả trả về của file_exists phụ thuộc vào sở hữu
hoặc thuộc tính của nó.
Thực tế thì 1 số các class trong web application của tôi đều thuộc sở
hữu root (tránh các linux user khác vô tình thay đổi file) và nằm
ngoài public html folder. file_exists vẫn được dùng để check sự tồn
tại của các class files này.

rung

unread,
Nov 9, 2007, 1:48:48 AM11/9/07
to PHPVietnam
The user that Apache runs under is not root nor does it belong to root
group. Here is what I tried:

As root,

mkdir /d
touch /d/f
chmod -R 700 /d

Tried with Apache and file_exists('/d/f') returned FALSE.

As the user that Apache runs under,

cd /d. Permission denied.

So, I think, file_exists() returns FALSE if the file is not accessible
to the user that Apache runs under.

zonium

unread,
Nov 10, 2007, 2:40:20 AM11/10/07
to PHPVietnam
In your test, setting 700 at directory level (/d) has prevented apache
from 'going in' the folder to check for the existence of files in it.
Had the directory (/d) been set to 701 (rwx-----x), file_exists would
have returned TRUE, even though the file /d/f is at 700.
So IMO, ownership and file permission itself have no impact on
file_exists and that's opposite to what the original poster has
pointed out.

rung

unread,
Nov 12, 2007, 2:12:38 AM11/12/07
to PHPVietnam
Hi zonium,

You're right with your test, but I'm not sure about what you've said
"ownership and file permission itself have no impact on file_exists".
Ownership and permissions of the path to the file should be taken into
account too.

I think the function name -- file_exists -- is confusing us. When it
doesn't know for sure that a file exists it comes to the conclusion
that the file doesn't exist.

Maybe file_readable is a good replacement. What is an existing file
that isn't readable for?

rung.

Reply all
Reply to author
Forward
0 new messages