"안전한"또는 "안전하지 않은"값과 같은 것은 없습니다. 서버가 제어하는 값과 사용자가 제어하는 값만 있으며 값의 출처와 특정 목적에 대해 신뢰할 수 있는지 여부를 알아야합니다. $_SERVER['HTTP_FOOBAR']
예를 들어 데이터베이스에 저장하는 것은 전적으로 안전하지만, 저는 그렇지 않습니다 eval
.
따라서 이러한 값을 세 가지 범주로 나눕니다.
서버 제어
이러한 변수는 서버 환경에 의해 설정되며 전적으로 서버 구성에 따라 다릅니다.
'GATEWAY_INTERFACE'
'SERVER_ADDR'
'SERVER_SOFTWARE'
'DOCUMENT_ROOT'
'SERVER_ADMIN'
'SERVER_SIGNATURE'
부분적으로 서버 제어
이러한 변수는 클라이언트가 보낸 특정 요청에 따라 다르지만 유효하지 않은 값은 모두 웹 서버에서 거부해야하고 스크립트 호출을 시작하지 않아야하기 때문에 제한된 수의 유효한 값만 사용할 수 있습니다. 따라서 신뢰할 수있는 것으로 간주 될 수 있습니다 .
'HTTPS'
'REQUEST_TIME'
'REMOTE_ADDR'
*
'REMOTE_HOST'
*
'REMOTE_PORT'
*
'SERVER_PROTOCOL'
'HTTP_HOST'
†
'SERVER_NAME'
†
'SCRIPT_FILENAME'
'SERVER_PORT'
‡
'SCRIPT_NAME'
* REMOTE_
값은 TCP / IP 핸드 셰이크에 의해 확인 된 클라이언트의 유효한 주소임을 보장합니다. 응답이 전송 될 주소입니다. REMOTE_HOST
하지만 역방향 DNS 조회에 의존하므로 서버에 대한 DNS 공격으로 스푸핑 될 수 있습니다 (이 경우 더 큰 문제가 발생합니다). 이 값은 프록시 일 수 있으며 이는 TCP / IP 프로토콜의 단순한 현실이며 사용자가 할 수있는 작업이 없습니다.
† 웹 서버 가 헤더에 관계없이 요청에 응답하는 경우에도HOST
안전하지 않은 것으로 간주되어야합니다. $ _SERVER [ "HTTP_HOST"]는 얼마나 안전합니까?를 참조하십시오 . . http://shiflett.org/blog/2006/mar/server-name-versus-http-host
도 참조 하십시오 .
‡ https://bugs.php.net/bug.php?id=64457 , http://httpd.apache.org/docs/current/mod/core.html#usecanonicalphysicalport , http : //httpd.apache를 참조 하십시오 . org / docs / 2.4 / mod / core.html # comment_999
완전히 임의의 사용자 제어 값
이러한 값은 전혀 확인되지 않으며 서버 구성에 의존하지 않으며 클라이언트가 보내는 전적으로 임의의 정보입니다.
'argv'
, 'argc'
(CLI 호출에만 적용 가능하며 일반적으로 웹 서버에는 문제가되지 않음)
'REQUEST_METHOD'
§
'QUERY_STRING'
'HTTP_ACCEPT'
'HTTP_ACCEPT_CHARSET'
'HTTP_ACCEPT_ENCODING'
'HTTP_ACCEPT_LANGUAGE'
'HTTP_CONNECTION'
'HTTP_REFERER'
'HTTP_USER_AGENT'
'AUTH_TYPE'
''
'PHP_AUTH_DIGEST'
''
'PHP_AUTH_USER'
''
'PHP_AUTH_PW'
''
'PATH_INFO'
'ORIG_PATH_INFO'
'REQUEST_URI'
(오염 된 데이터를 포함 할 수 있음)
'PHP_SELF'
(오염 된 데이터를 포함 할 수 있음)
'PATH_TRANSLATED'
- 다른
'HTTP_'
값
§ 웹 서버가 특정 요청 방법 만 허용하는 한 신뢰할 수있는 것으로 간주 될 수 있습니다 .
'' 인증이 전적으로 웹 서버에서 처리되는 경우 신뢰할 수있는 것으로 간주 될 수 있습니다 .
수퍼 글로벌 $_SERVER
에는 여러 환경 변수도 포함됩니다. 이것이 "안전"한지 여부는 정의 된 방법과 위치에 따라 다릅니다. 완전히 서버 제어에서 완전히 사용자 제어에 이르기까지 다양합니다.