안전 모드
안전 모드에 의해 제한되는/비활성화되는 함수들
안전 모드
PHP Manual

## 보안과 안전 모드

보안과 안전 모드 설정 지시어
지시어명 | 기본값 | 변경값 | 변경점
--- | --- | --- | ---
safe_mode | "0" | PHP_INI_SYSTEM | PHP 6.0.0에서 제거.
safe_mode_gid | "0" | PHP_INI_SYSTEM | PHP 4.1.0부터 존재. PHP 6.0.0에서 제거.
safe_mode_include_dir | NULL | PHP_INI_SYSTEM | PHP 4.1.0부터 존재. PHP 6.0.0에서 제거.
safe_mode_exec_dir | "" | PHP_INI_SYSTEM | PHP 6.0.0에서 제거.
safe_mode_allowed_env_vars | "PHP_" | PHP_INI_SYSTEM | PHP 6.0.0에서 제거.
safe_mode_protected_env_vars | "LD_LIBRARY_PATH" | PHP_INI_SYSTEM | PHP 6.0.0에서 제거.
open_basedir | NULL | PHP_INI_ALL | PHP < 5.3.0에서 PHP_INI_SYSTEM
disable_functions | "" | php.ini만 | PHP 4.0.1부터 존재.
disable_classes | "" | php.ini만 | PHP 4.3.2부터 존재.

PHP_INI_* 모드에 대한 상세와 정의는 환경 설정을 바꿀 수 있는 곳를 참고하십시오.

위 설정 지시어에 대한 간단한 설명입니다.

`safe_mode` boolean

  PHP의 안전 모드 활성화 여부. PHP가 --enable-safe-mode로 컴파일 되면 기본값 On, 아니면 Off.

`safe_mode_gid` boolean

  기본값, 안전 모드는 파일이 열릴 때 UID 비교 검사를 수행한다. 이 설정을 GID 비교로 완화하려면, safe_mode_gid을 켜도록 한다. 파일 접근에 대해 UID (`FALSE`) 검사를 하는지, GID (`TRUE`) 검사를 하는지의 여부.

`safe_mode_include_dir` string

  이 디렉토리와 하위디렉토리에서 파일을 include할 때에는 UID/GID 검사가 무시된다 (디렉토리는 include_path나 include되는 전체 경로가 되어야 한다).

  PHP 4.2.0부터 이 지시어는 include_path 지시어와 같은 방식으로, 콜론(윈도우에서는 세미콜론)으로 구분하여 복수의 경로를 가질 수 있습니다. 설정 제한은 실질적으로 디렉토리명이 아닌 앞첨자(prefix)가 된다. 이말의 의미는 "safe_mode_include_dir = /dir/incl"는 "/dir/include"와 "/dir/incls"가 존재하기만 한다면 그 디렉토리도 접근이 허용된 다는 것이다. 특정 디렉토리만으로 접근을 제한하고자 하면, 슬래시로 끝내면 된다. 예를 들면: "safe_mode_include_dir = /dir/incl/" 이 지시어 값이 비어 있으면, PHP 4.2.3과 PHP 4.3.3부터 다른 UID/GID 값을 가지는 파일을 포함할 수 없습니다. 이 이전 버전에서는 모든 파일을 포함할 수 있었습니다.
`safe_mode_exec_dir` string

  PHP가 안전 모드를 사용중이라면, system()과 그 외의 시스템 프로그램을 실행하는 함수는 이 디렉토리에 있지 않으면 프로그램 시작이 거부된다. 윈도우를 포함한 모든 환경에서 디렉토리 구분은 /를 이용해야 합니다.

`safe_mode_allowed_env_vars` string

  특정 환경 변수를 설정하는것은 잠재적인 보안 구멍이 될수 있다. 이 지시어는 콤마-구분자 리스트의 앞첨자(prefix)를 포함한다. 안전 모드에서, 유저는 여기서 제공되는 앞첨자로 시작하는 이름을 갖는 환경변수만 변경할수 있을것이다. 기본값으로, 유저는 PHP_로 시작하는 환경 변수만 설정할수 있다. (e.g. PHP_FOO=BAR).

  > Note: 이 지시어가 비어있으면, PHP는 유저가 모든 환경 변수를 변경할수 없게 할것이다!

`safe_mode_protected_env_vars` string

  이 지시어는 엔드 유저가 putenv()를 사용하여 변경할수 없는 콤마-구분자 리스트의 환경 변수를 포함한다. 이 변수들은 safe_mode_allowed_env_vars가 그들을 변경할수 있도록 설정되어있을지라도 보호될것이다.

`open_basedir` string

  PHP가 열수 있는 파일을 특정 디렉토리-트리로 제한한다. 이 지시어는 안전 모드가 켜졌는지 꺼졌는지와는 상관이 없다.

  스크립트가 예를 들면, fopen() 이나 gzopen()으로 파일을 열려고 시도할때, 파일의 위치를 검사한다. 파일이 설정된 디렉토리-트리의 밖에 있다면, PHP는 그 파일을 여는것을 거부할것이다. 모든 심볼릭 링크가 검사되기 때문에, symlink로 이 제한을 회피할수 없다. 파일이 존재하지 않아서 symlink로 풀어낼 수 없으면 파일 이름을 (풀어낸) `open_basedir` 와 비교합니다.

  특수한 값 `.` 은 스크립트가 작업하는 디렉토리를 기본 디렉토리로 사용합니다. 이는 스크립트의 작업 디렉토리가 chdir()을 통해 쉽게 바뀔 수 있기 때문에 조금 위험합니다.

  httpd.conf에서, 다른 지시어와 같은 방식으로 "php_admin_value open_basedir none"을 사용해서 open_basedir을 끌 수 있습니다. (특정 가상 호스트를 위해 사용할 수 있습니다)

  윈도우에서는 세미콜론으로 디렉토리를 구분한다. 그외 모든 시스템은, 콜론으로 디렉토리를 구분한다. 아파치 모듈에서, 부모 디렉토리부터의 open_basedir 경로는 현재 자동적으로 상속된다.

  open_basedir로 설정된 제한은 실질적으로 디렉토리명이 아닌, 앞첨자(prefix)가 된다. 이 말의 의미는 "open_basedir = /dir/incl"는 "/dir/include" 과 "/dir/incls" 디렉토리가 존재한다면 그 두 디렉토리로의 접근도 허용한다는것이다. 특정 디렉토리로만 접근을 제한하고자 한다면, 슬래시로 끝내면 된다. For example: "open_basedir = /dir/incl/"

  기본값은 모든 파일이 열릴수 있도록 허용되어 있다.

  > Note: PHP 5.3.0부터 open_basedir을 실행시에 강화할 수 있습니다. 즉, open_basedir이 php.ini에서 /www/로 설정되어 있다면, 스크립트 실행시에 ini_set()으로 /www/tmp/로 설정을 강화할 수 있습니다.

`disable_functions` string
  이 지시어는 보안 때문에 특정 함수를 비활성화시켜준다. 컴마로 구분된 함수명의 리스트를 취한다. disable_functions는 안전 모드에 의해 영향을 받지 않는다. 이 지시어는 php.ini에서 설정되어야 한다. 예를 들면, 이 값을 httpd.conf에서 설정할수 없다.
`disable_classes` string
  이 지시어는 보안적인 측면때문에 특정 클래스를 비활성화시켜준다. 컴마로 구분된 클래스명의 리스트를 취한다. disable_classes는 안전 모드에 의해 영향을 받지 않는다. 이 지시어는 php.ini에서 설정되어야 한다. 예를 들면, 이 값을 httpd.conf에서 설정할수 없다.

  > Note: Availability note
  > 이 지시어는 PHP 4.3.2부터 사용가능하게 되었다.

참고: register_globals, display_errors, log_errors.

safe_mode가 켜져 있으면, PHP는 현재 스크립트의 소유자(owner)가 파일 함수에 의해 제어되는 파일의 소유자(owner)나 그 디렉토리와 일치하는지 검사한다. 예를 들면:

    -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

엄격한 UID 검사가 적절하지 않고, 완화된 GID 검사가 효율적인 환경일수 있다. 이런 경우는 safe_mode_gid 스위치 방식으로 지원된다. On으로 설정하면 완화된 GID 검사가 수행되고, Off (기본값)로 설정되면 UID 검사가 수행된다.

safe_mode 대신에, open_basedir 디렉토리를 설정하면, 모든 파일 제어가 특정 디렉토리 밑의 파일로만 제한됩니다. 예를 들면(아파치 httpd.conf 예):

    <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

또한 각각의 함수들을 비활성화시킬수 있다. disable_functions 지시어는 php.ini 파일 밖에서 사용될수 없다. 그래서 httpd.conf 파일의 per-virtualhost 나 per-directory 기반의 함수를 비활성화시킬수 없다. 이 지시어를 php.ini에 추가하면:

    disable_functions = readfile,system

다음의 결과가 나온다:

    Warning: readfile() has been disabled for security reasons in
    /docroot/script.php on line 2

Warning

물론, 이러한 PHP 제한은 실행 중인 바이너리에선 유효하지 않습니다.

안전 모드
안전 모드에 의해 제한되는/비활성화되는 함수들
안전 모드
PHP Manual