PHP에 파일 및 폴더에 쓸 수 있는 권한 부여

PHP에 파일 및 폴더에 쓸 수 있는 권한 부여

더욱 명확하게 업데이트되었습니다:

에 따르면http://expressionengine.com/user_guide/installation/installation.html, 그것은 말한다 :

대부분의 Unix 호스트에서는 다음이 일반적이지만 호스트에 문의하여 더 제한적인 권한을 사용할 수 있는지 확인할 수 있습니다.PHP가 파일(666) 및 폴더(777)에 쓸 수 있도록 허용. Windows 서버에서는 다음 사항이 적용되지 않지만 ExpressionEngine에서 파일과 폴더를 쓸 수 있는지 확인해야 합니다. 이에 대해 호스트에게 문의해야 할 수도 있습니다.

이것이 무엇을 의미하는지 잘 모르겠습니다. 내가 chown'er인 경우 특정 파일과 폴더를 각각 666과 777로 변경할 수 있지만 위의 내용은 PHP에서도 이 작업을 수행하도록 허용해야 하는 것처럼 들립니까?

원래 질문:

PHP가 특정 파일(666)과 폴더(777)에 쓸 수 있는지 확인해야 합니다.

어떻게 해야 하나요?

답변1

라무님과 뮤비님의 답변을 기술적인 솔루션으로 완성하겠습니다. 다음의 모든 내용은 UNIX 계열 시스템에만 유효합니다.

UNIX 파일 모드보다 더 강력한 도구인 ACL을 사용하는 예를 보려면 chmod/chown 섹션을 스크롤하십시오.

웹 서버 사용자 이름 찾기

먼저, 웹 서버가 실행되는 사용자 이름을 알아야 합니다. Apache를 사용하는 경우 apache또는 httpd, 등이 될 수 있습니다. www-data대부분의 데비안 계열 시스템에서 Apache는 입니다 www-data. nginx의 경우 일반적으로 www-data.

확인하려면 다음을 시도해 보세요.

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

이 명령이 반환하는 사용자 이름이 일관된지 확인하세요.(예를 들어, 나는 nginx를 99% 사용하지만 이 명령은 tomcat7내가 한 번 설치한 Java 웹 서버를 반환합니다).


웹 서버에 권한 부여: chmod및 사용chown

chmod666 또는 777(잘못된 문서/자습서에서 이러한 종류의 문제에 대한 해결책)을 수행하면 마술처럼 일이 작동할 수 있지만 안전하지 않습니다. 666 또는 777 권한을 부여하면 "다른 사람"에게 액세스 권한이 부여됩니다. 따라서 Apache뿐만 아니라 grandmothernsa(해당 사용자 계정이 컴퓨터에 존재하는 경우 - 그러나 실제로는 아닙니다. 단지 테스트/문제 해결을 위한 것이 아니라면 이 작업을 수행하지 마십시오).

좀 더 구체적으로 설명하고 귀하와 Apache에게만 권한을 부여하는 것이 좋습니다. 파일에 대한 모든 권한을 웹 서버에 부여하려면 파일 그룹을 변경하세요. 이렇게 하려면 소유자를 재귀적으로 변경합니다.

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

그러나 대부분의 경우 그룹만 변경하여 파일에 대한 전체 액세스 권한을 유지하고 싶을 수도 있습니다.

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

그런 다음 적절한 작업을 수행하여 chmod그룹에 www-data귀하와 동일한 권한을 부여하십시오. 예를 들어 현재 모드가 640이라면(귀하의 경우 6, www-data의 경우 4, 기타의 경우 0, -rw-r----로 변환), 660으로 설정하세요(귀하의 경우 6, www-data의 경우 6, 기타의 경우 0, -rw-rw----로 변환). 파일 모드에 대해 자세히 알아보려면 rahmu의 답변을 참조하세요. 오래되었지만 우아한 메커니즘입니다.

를 사용하여 난해한 숫자를 조작하는 것을 방지하려면 chmod다음 구문을 사용할 수도 있습니다.

chmod -R g+rw your/folder/

이는 "그룹( )에 폴더에 대한 읽기 및 쓰기( ) 권한을 반복적으로( ) g추가 ( )"라는 의미입니다.+rwyour/folder/-R

90%의 경우에는 이것으로 충분합니다.


내가 선호하는 방법: ACL(액세스 제어 목록) 사용

때로는 첫 번째 솔루션만으로는 충분하지 않습니다. 나는 예를 들어볼 것이다.심포니 프레임워크많은 데이터를 기록하고 캐시합니다. 따라서 적절한 폴더에 대한 쓰기 권한이 필요합니다.

그리고 CLI(내 사용자 계정)와 웹(웹 서버 사용자)에서 Symfony 콘솔을 병렬로 사용하는 경우 chmod/ 방법만으로는 충분하지 않을 수 있습니다. chownSymfony는 지속적으로 권한을 수정하기 때문에 많은 문제가 발생합니다.

이 경우에는 많은 UNIX 시스템에서 권한을 관리하는 고급 방법인 ACL(액세스 제어 목록)을 사용합니다.

다음은 공식 Symfony 문서에서 제공하는 명령입니다(필요에 따라 app/cache변경해 주세요app/logs):

지원하는 시스템 chmod +a(예: 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

지원하지 않는 시스템에서 chmod +a(가장 일반적)

도구가 필요합니다 setfacl. 어쩌면 기본적으로 시스템에 설치되어 있을 수도 있으므로 setfacl -v해당 명령을 사용할 수 있는지 확인해 보십시오.

명령을 사용할 수 없는 경우,그리고Ubuntu 14.04+를 사용하는 경우 도구를 설치하기만 하면 됩니다.

sudo apt install acl

그렇지 않으면 파티션이 마운트되는 방식을 변경해야 할 수 있으므로 OS 설명서를 따르십시오(우분투 문서는 여기).

그리고 우리는 다음과 같습니다:

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

저는 이 방법을 사용하면서 어떤 문제도 겪지 않았습니다. 만족했거나 환불받았습니다.

답변2

파일의 소유자가 누구이든 관계없이 666 권한과 777이면 충분합니다. 마지막 숫자는모든시스템의 사용자에게 액세스 권한이 있습니다. 이것이 가장 쉬운 방법이지만 정확한 이유 때문에 가장 안전한 방법은 아닙니다.

더 나은 방법

가장 먼저 이해해야 할 것은Unix 권한 작동 방식. 이 링크에서 제가 제공한 답변을 이해하기 위해 권한이 숫자로 변환될 수 있다는 점에 유의하시기 바랍니다.

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

그러면 A는 chmod 666권한을 로 변경하는 것과 같습니다 rw-rw-rw.

다음으로 PHP 스크립트를 실행하는 사용자가 누구인지 알아내야 합니다. 일반적으로 이는 웹 서버를 실행하는 사용자입니다.이를 수행하는 방법에 대한 예는 다음과 같습니다.(Apache를 웹 서버 이름으로 바꿀 수 있습니다).

스크립트를 실행하는 사용자가 누구인지, 언급한 파일의 소유자가 누구인지 알고 나면 적절한 권한을 설정하는 것은 사용자의 몫입니다. 다음에 쓰기 액세스(읽기 포함)를 부여한다는 점을 명심하세요.모든시스템의 사용자는 잠재적으로 재앙이 될 수 있습니다.

답변3

Expression Engine은 일부 파일 및 디렉터리에 대한 읽기/쓰기 액세스가 필요한 다른 많은 PHP 웹 응용 프로그램과 같습니다. 예를 들어 EE에는 config.php 및 Database.php 파일에 대한 쓰기 액세스 권한과 파일 업로드 디렉터리에 대한 쓰기 액세스 권한이 필요합니다.

문서에 나와 있는 내용은 대부분의 서버가 PHP를 mod_php로 실행하므로(따라서 웹 서버의 권한으로 실행됨) 자신의 사용자를 사용하여 FTP(또는 이와 유사한)로 파일을 업로드할 것이므로 해당 파일과 디렉터리에는 666(모든 사람이 읽고 쓸 수 있음) 및 777(모든 사람이 읽고 쓰고 찾아볼 수 있음) 권한이 부여되어야 합니다.

이것이 가장 안전한 방법은 아니지만 확실히 가장 쉬운 방법입니다. 특히 호스팅 서비스를 사용하는 경우에는 더욱 그렇습니다.

그러나 EE 지침에 따르면 호스팅 제공업체에 문의하세요. 일부는 mod_php를 사용하지 않고 fastcgi, suphp 또는 다른 버전을 사용하기 때문입니다. 이러한 서버는 자신의 사용자로 PHP를 실행하므로 업로드하는 모든 파일은 이미 PHP 및 EE 스크립트에서 생성된 모든 파일에서 읽고 쓸 수 있습니다. 이 경우 PHP가 액세스하는 파일과 디렉토리에는 600 및 700 액세스 권한을 부여해야 합니다. 웹 서버(PHP 런타임 아님)에서 직접 액세스할 다른 파일에는 여전히 666 및 777 액세스가 필요합니다.

관련 정보