PHP SERVER 변수: Difference between revisions
(새 문서: 이 문서는 서버 프로그래밍 언어 PHP의 $_SERVER 변수(배열)에 대하여 다룹니다. == 목록 == * '''$_SERVER['DOCUMENT_ROOT']''' ** 현재 사이트가 위치한 서버상의 위치 ** 예시: /webapp/include * '''$_SERVER['HTTP_ACCEPT_ENCODING']''' ** 인코딩 방식 ** 예시: gzip, deflate * '''$_SERVER['HTTP_ACCEPT_LANGUAGE']''' ** 언어 ** 예시: ko * '''$_SERVER['HTTP_USER_AGENT']''' ** 사이트에 접속한 사용자 환경 ** Mozilla/4.0(com...) |
No edit summary |
||
Line 61: | Line 61: | ||
'''포트 포함 여부''' | '''포트 포함 여부''' | ||
8080과 같이 별도 포트를 사용하는 경우, HTTP_HOST는 포트를 포함하지만 SERVER_NAME은 포트를 포함하지 않는다. 단, 일반적으로 접근하는 80(http)이나 443(https)의 경우 해당사항이 없다.<blockquote>$_SERVER['HTTP_HOST'] == 'localhost:8080' | 8080과 같이 별도 포트를 사용하는 경우, HTTP_HOST는 포트를 포함하지만 SERVER_NAME은 포트를 포함하지 않는다. 단, 일반적으로 접근하는 80(http)이나 443(https)의 경우 해당사항이 없다.<blockquote> | ||
* $_SERVER['HTTP_HOST'] == 'localhost:8080' | |||
* $_SERVER['SERVER_NAME'] == 'localhost'</blockquote>'''HTML 이스케이프 여부''' | |||
이 또한 일반적인 경우는 아니고 비정상 적인 요청일 때만 차이가 난다. 만약 [[크로스사이트 스크립트]] 등을 위해 HTTP 요청 헤더의 Host 값에 <script>와 같은 태그를 넣는다면 HTTP_HOST는 적힌 그대로 보여주고, SERVER_NAME은 HTML로 이스케이프된 값을 보여준다.<blockquote> | |||
* $_SERVER['HTTP_HOST'] == [<nowiki><script>alert('XSS')</script></nowiki>] | |||
이 또한 일반적인 경우는 아니고 비정상 적인 요청일 때만 차이가 난다. 만약 [[크로스사이트 스크립트]] 등을 위해 HTTP 요청 헤더의 Host 값에 <script>와 같은 태그를 넣는다면 HTTP_HOST는 적힌 그대로 보여주고, SERVER_NAME은 HTML로 이스케이프된 값을 보여준다.<blockquote>$_SERVER['HTTP_HOST'] == [<nowiki><script>alert('XSS')</script></nowiki>] | * $_SERVER['SERVER_NAME'] == <nowiki>[&lt;script&gt;alert('XSS')&lt;/script&gt;]</nowiki></blockquote> | ||
$_SERVER['SERVER_NAME'] == <nowiki>[&lt;script&gt;alert('XSS')&lt;/script&gt;]</nowiki></blockquote> |
Revision as of 10:55, 13 September 2022
이 문서는 서버 프로그래밍 언어 PHP의 $_SERVER 변수(배열)에 대하여 다룹니다.
목록
- $_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/
해설
'HTTP_HOST'와 'SERVER_NAME'의 차이
두 변수 모두 디렉터리나 파라미터를 제외한 홈페이지 도메인을 보여준다. 본 위키의 경우 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'] == [<script>alert('XSS')</script>]