개발자꿈나무

파일 제어 - 권한 설정 본문

PHP

파일 제어 - 권한 설정

망재이 2023. 11. 20. 18:13

PHP를 이용해 파일을 생성하고 읽으려고 하는데 권한 문제가 발생했다.

failed to open stream: Permission denied

 

특히 unix 계열의 운영체제를 사용할 때 보안 문제로 이러한 이슈가 발생되곤 하는데 파일을 생성할 수 있는 권한이 없어서 이러한 오류가 발생한다. 이를 해결하기 위해서는 먼저 권한에 대해 확인을 해줘야 한다. ls -al 명령어를 사용하면 현재 디렉토리의 파일에 대한 권한을 확인할 수 있다.

 

제일 첫번째 자리를 제외하고 3자리씩 소유자 / 그룹 / 기타 사용자에 대한 권한을 나타낸다. (r: read, w: write, x:execute) 

현재 readme 파일은 kmj 소유이며 소유자는 읽기와 쓰기 권한, 그룹과 일반 사용자는 읽기 권한만 가지고 있다. 파일을 읽어오는 file_get_contents 함수는 실행이 가능하지만 파일을 쓰는 file_put_contents 혹은 fwrite 함수는 사용이 불가할 것이다.

 

readme.txt 파일은 내가 직접 생성해준 파일이며 new.txt 파일은 PHP 함수를 이용해서 생성해준 파일이다. new.txt의 소유자를 보면 _www라고 되어있는 것을 확인할 수 있다. 현재 PHP 프로세스의 실행 사용자와 파일을 소유자가 일치하기 때문에 new.txt 파일은 읽기와 쓰기가 가능하지만 readme.txt 파일은 소유자가 아닌 일반 사용자의 권한이므로 읽기밖에 되지 않는 것이다.

그렇다면 소유자를 _www로 바꿔주거나 기타 사용자도 파일을 쓸수 있도록 w 권한을 생성해주거나 두 가지 방법으로 문제를 해결할 수 있다. 권한을 생성해줄 때는 chmod 명령어를 이용하면 되고 소유자를 변경할 때는 chown 명령어를 이용하면 된다.

그러나 권한을 바꾸는 방법은 보안상 좋지 않을듯하여 소유자를 바꾸는 방법을 선택했다.

sudo chown _www readme.txt

 

 

readme 파일의 소유자도 _www로 변경이 됐고 이제 파일을 읽고 쓰는 데 아무런 문제가 없다!

하지만 PHP 프로세스가 어떤 사용자로 실행되는지 알지 못할 때는 어떻게 해야할까? PHP의 posix_geteuid()와 posix_getpwuid()를 이용해서 알 수 있다.

<?php
$uid = posix_geteuid();

// 사용자 ID를 사용자 이름으로 변환
$user_info = posix_getpwuid($uid);
$username = $user_info['name'];

echo "현재 PHP 프로세스의 실행 사용자 이름: $username\n";
?>

 

이렇게 php를 실행하게 되면 현재 실행 사용자의 이름이 화면에 출력될 것이다.

 

또한 PHP에서 현재 파일을 읽을 수 있는 권한을 가지고 있는지 아닌지, 쓸 수 있는지 아닌지를 확인할 수 있는 방법이 있다. is_readable, is_writable 함수를 이용하는 것이다.

<?php
$filename = 'readme.txt';
if (is_readable($filename)) {
    echo 'The file is readable';
} else {
    echo 'The file is not readable';
}

if (is_writable($filename)) {
    echo 'The file is writable';
} else {
    echo 'The file is not writable';
}
?>

 

파일을 읽을 수 있는 상태라면 'The file is readable'이 아니라면 'The file is not readable'이 뜰 것이다. 이런 방법으로 현재 권한에 대해서 간단하게 확인해 볼 수 있다.

 

그리고 현재 디렉토리의 권한과 소유자도 확인해줄 필요가 있다. 파일의 소유자만 변경을 해줬기 때문에 해당 파일이 아닌 다른 파일을 생성하거나 읽으려고 할 때 문제가 발생하는 경우가 생길 수 있다. 

 

디렉토리를 나타내는 표시 'd'로 시작하면 소유자는 읽기 쓰기 실행, 그룹과 일반 사용자는 읽기 실행 권한만 주어져 있는 것을 알 수 있다. 즉, 현재 디렉토리의 부모 디렉토리는 소유자가 kmj이고, 그룹이 staff인 디렉토리라는 것을 알 수 있는 것이다. 때문에 현재 폴더에 PHP를 이용해서 새로운 파일을 생성하려면 하면 권한 거부 오류가 발생할 것이다.

이 역시도 현재 디렉토리를 모든 사람이 쓰고 읽고 실행할 수 있도록 바꿔주거나 소유자를 변경하거나 둘 중 하나의 방법을 선택할 수 있다.

chmod 777 /현재/디렉토리/주소
# 모든 사용자가 읽고 쓰고 실행할 수 있도록 설정하는 명령어
sudo chown _www .
# 현재 디렉토리 소유자 변경

 

728x90

'PHP' 카테고리의 다른 글

php로 이미지 다루기  (0) 2023.12.07