PHP의 안전모드는 공유서버의 보안문제를 해결하기 위해 만들어졌습니다. 구조적으로 이 문제를 PHP 계층에서 해결하려는 것은 의미가 없지만 웹 서버 계층과 운영 체제 계층을 수정하는 것은 매우 비현실적으로 보입니다. 현재 많은 사람들, 특히 ISP가 안전 모드를 사용하고 있습니다.
다음은 php.ini의 안전 모드 설정입니다:
safe_mode boolean
PHP의 안전 모드 활성화 여부.
safe_mode_gid boolean
기본적으로 안전 모드에서는 파일을 열 때 UID 비교 확인을 수행합니다. GID 비교로 완화하려면 safe_mode_gid를 켜십시오. 파일에 접근할 때 UID(FALSE)를 사용할지 GID(TRUE)를 사용할지 여부를 확인합니다.
safe_mode_include_dir 문자열
이 디렉터리 및 하위 디렉터리의 파일을 포함할 때 UID/GID 검사를 우회합니다(디렉토리는 include_path에 있거나 전체 경로와 함께 포함되어야 함).
PHP 4.2.0부터 이 지시문은 단순한 디렉토리 대신 include_path 지시문과 유사한 스타일로 콜론(Windows의 경우 세미콜론)으로 구분된 경로를 허용할 수 있습니다. 지정된 제한은 실제로 디렉터리 이름이 아닌 접두사입니다. 이는 "safe_mode_include_dir = /dir/incl"이 "/dir/include" 및 "/dir/incls"가 존재하는 경우 이에 대한 액세스를 허용한다는 것을 의미합니다. 특정 디렉터리에 대한 액세스를 제한하려면 뒤에 슬래시를 추가하세요(예: "safe_mode_include_dir = /dir/incl/"). 이 지시문의 값이 비어 있으면 PHP 4.2.3에서 UID/GID가 다르고 PHP 4.3.3부터 시작하는 파일은 포함되지 않습니다. 이전 버전에서는 모든 파일이 포함될 수 있었습니다.
safe_mode_exec_dir string
PHP가 안전 모드를 사용하는 경우 system() 및 기타 프로그램 실행 함수는 이 디렉토리에 없는 프로그램 시작을 거부합니다. Windows를 포함하여 디렉터리 구분 기호로 /를 사용해야 합니다.
safe_mode_allowed_env_vars string
특정 환경 변수 설정은 잠재적인 보안 허점일 수 있습니다. 이 지시문에는 쉼표로 구분된 접두사 목록이 포함되어 있습니다. 안전 모드에서 사용자는 이름에 여기에 제공된 접두사가 포함된 환경 변수만 변경할 수 있습니다. 기본적으로 사용자는 PHP_(예: PHP_FOO = BAR)로 시작하는 환경 변수만 설정할 수 있습니다.
참고:
이 지시문이 비어 있으면 PHP는 사용자가 환경 변수를 수정할 수 있도록 허용합니다!
safe_mode_protected_env_vars string
이 지시문에는 최종 사용자가 putenv()를 사용하여 변경할 수 없는 쉼표로 구분된 환경 변수 목록이 포함되어 있습니다. safe_mode_allowed_env_vars에 허용된 수정 사항이 설정된 경우에도 이러한 변수는 변경할 수 없습니다.
safe_mode가 on으로 설정되면 PHP는 파일 함수나 해당 디렉토리를 통해 현재 스크립트의 소유자가 작업할 파일의 소유자와 일치하는지 확인합니다. 예:
-rw-rw-r-- 1 rasmus rasmus 33 Jul 1 19:20 script.php -rw-r--r-- 1 root root 1116 May 26 18:01 /etc/passwd
script.php 실행
<?php readfile('/etc/passwd'); ?>
안전 모드가 활성화되면 다음 오류가 발생합니다.
Warning: SAFE MODE Restriction in effect. The script whose uid is 500 is not allowed to access /etc/passwd owned by uid 0 in /docroot/script.php on line 2
동시에 , 어쩌면 완화된 GID 검사로는 충분하지만 엄격한 UID 검사는 부적합한 환경이 있을 수 있습니다. 이 검사는 safe_mode_gid 옵션으로 제어할 수 있습니다. On으로 설정하면 완화된 GID 검사가 수행되고, Off(기본값)로 설정하면 UID 검사가 수행됩니다.
safe_mode를 제외하고 open_basedir 옵션을 설정하면 모든 파일 작업이 지정된 디렉터리로 제한됩니다. 예:
<Directory /docroot> php_admin_value open_basedir /docroot </Directory>
open_basedir 옵션을 설정한 후 동일한 script.php를 실행하면 결과는 다음과 같습니다.
Warning: open_basedir restriction in effect. File is in wrong directory in /docroot/script.php on line 2
특정 기능을 개별적으로 차단할 수도 있습니다. php.ini 파일 외부에서는 비활성화_functions 옵션을 사용할 수 없습니다. 즉, httpd.conf 파일의 다른 가상 호스트나 다른 디렉터리에 의해 기능이 차단될 수 없습니다. php.ini 파일에 다음 콘텐츠를 추가하면
disable_functions readfile,system
다음과 같은 출력이 표시됩니다.
Warning: readfile() has been disabled for security reasons in /docroot/script.php on line 2
경고
물론 이러한 PHP 제한 사항은 실행 파일 문서에 적용됩니다.