PHP SERVER 변수

From IT Wiki

이 문서는 서버 프로그래밍 언어 PHP의 $_SERVER 변수(배열)에 대하여 다룹니다.

목록[edit | edit source]

  • $_SERVER['DOCUMENT_ROOT']
    • 현재 사이트가 위치한 서버상의 위치
    • 예시: /webapp/include
  • $_SERVER['HTTP_ACCEPT_ENCODING']
    • 인코딩 방식
    • 예시: gzip, deflate
  • $_SERVER['HTTP_ACCEPT_LANGUAGE']
    • 언어
    • 예시: ko
  • $_SERVER['HTTP_USER_AGENT']
    • 사이트에 접속한 사용자 환경
    • Mozilla/4.0(compatible; MSIE 6.0; Windows NT 5.1; Q312461; .NET CLR 1.0.3705
  • $_SERVER['REMOTE_ADDR']
    • 사이트 접속한 사용자 IP
    • 예시: 123.234.132.133
  • $_SERVER['SCRIPT_FILENAME']
    • 실행되고 있는 위치와 파일명
    • 예시: webapp/include/index.php
  • $_SERVER['SERVER_NAME']
    • 사이트 도메인
    • 예시: itwiki.kr
  • $_SERVER['SERVER_PORT']
    • 사이트가 사용하는 포트
    • 예시: 80
  • $_SERVER['SERVER_SOFTWARE']
    • 서버의 소프트웨어 환경
    • 예시: Apache/1.3.23 (Unix) PHP/4.1.2 mod_fastcgi/2.2.10 mod_throttle/3.1.2 mod_ssl/2.8.6 OpenSSL/0.9.6c
  • $_SERVER['GATEWAY_INTERFACE']
    • CGI 정보
    • 예시: CGI/1.1
  • $_SERVER['SERVER_PROTOCOL']
    • 사용된 서버 프로토콜
    • 예시: HTTP/1.1
  • $_SERVER['REQUEST_URI']
    • 현재페이지의 주소에서 도메인 제외
    • 예시: /index.php?a=test&b=test2
  • $_SERVER['PHP_SELF']
    • 현재페이지의 주소에서 도메인과 넘겨지는 값 제외
    • 예시: / index.php
  • $_SERVER['APPL_PHYSICAL_PATH']
    • 현재페이지의 실제 파일 주소
    • 예시: D:\webapp/

해설[edit | edit source]

'HTTP_HOST'와 'SERVER_NAME'의 차이[edit | edit source]

두 변수 모두 디렉터리나 파라미터를 제외한 홈페이지 도메인을 보여준다. 본 위키의 경우 itwiki.kr 이다. 그러나 불러오는 출처에서 차이가 있는데 HTTP_HOST는 사용자의 요청에 기반한 정보(HTTP 요청 헤더에서 얻는다)이고 SERVER_NAME은 서버의 설정에 기반한 정보이다.

거의 대부분의 경우는 같은 값을 반환하므로 그냥 아무거나 선택해서 사용해도 무방하다. 하지만 미세한 차이점과 장단점이 있는데 차이점 중 대표적인 것이 포트 포함 여부, 이스케이프 여부 등이다.

장단점

HTTP_HOST는 HTTP요청을 조작하여 얼마든지 원하는 값을 넣을 수 있다. abc.com을 호출 하면서 Host: xyz.com 라는 헤더 값을 넣으면 HTTP_HOST는 xyz.com이라는 값이 나온다. 정상적인 요청이 아닌 경우 그냥 빈 값을 반환할 수도 있다.

SERVER_NAME은 서버의 설정이 제대로 되어 있지 않을 경우 값이 나오지 않거나 잘못 나올 수 있다. 서버에서 가져올 값이 없는 경우 HTTP_HOST의 값을 참조하여 가져온다. 따라서 서버 설정도 되어있지 않고 HTTP_HOST의 값도 없는 경우 HTTP_HOST도 빈 값, SERVER_NAME도 빈 값이지만, HTTP_HOST의 값이 있는 경우라면 SERVER_NAME도 빈 값은 아니다.

포트 포함 여부

8080과 같이 별도 포트를 사용하는 경우, HTTP_HOST는 포트를 포함하지만 SERVER_NAME은 포트를 포함하지 않는다. 단, 일반적으로 접근하는 80(http)이나 443(https)의 경우 해당사항이 없다.

  • $_SERVER['HTTP_HOST'] == 'localhost:8080'
  • $_SERVER['SERVER_NAME'] == 'localhost'

HTML 이스케이프 여부 이 또한 일반적인 경우는 아니고 비정상 적인 요청일 때만 차이가 난다. 만약 크로스사이트 스크립트 등을 위해 HTTP 요청 헤더의 Host 값에 <script>와 같은 태그를 넣는다면 HTTP_HOST는 적힌 그대로 보여주고, SERVER_NAME은 HTML로 이스케이프된 값을 보여준다.

  • $_SERVER['HTTP_HOST'] == [<script>alert('XSS')</script>]
  • $_SERVER['SERVER_NAME'] == [&lt;script&gt;alert('XSS')&lt;/script&gt;]