[php] 어떤 $ _SERVER 변수가 안전합니까?

사용자가 제어 할 수있는 모든 변수, 공격자도 제어 할 수 있으므로 공격의 원인이됩니다. 이를 “오염 된”변수라고하며 안전하지 않습니다.

를 사용 $_SERVER하면 많은 변수를 제어 할 수 있습니다. PHP_SELF, HTTP_USER_AGENT, HTTP_X_FORWARDED_FOR, HTTP_ACCEPT_LANGUAGE많은 다른 사람들이 클라이언트에서 보낸 HTTP 요청 헤더의 일부입니다.

누구든지 “안전 목록”이나 오염되지 않은 $_SERVER변수 목록을 알고 있습니까?



답변

“안전한”또는 “안전하지 않은”값과 같은 것은 없습니다. 서버가 제어하는 ​​값과 사용자가 제어하는 ​​값만 있으며 값의 출처와 특정 목적에 대해 신뢰할 수 있는지 여부를 알아야합니다. $_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에는 여러 환경 변수도 포함됩니다. 이것이 “안전”한지 여부는 정의 된 방법과 위치에 따라 다릅니다. 완전히 서버 제어에서 완전히 사용자 제어에 이르기까지 다양합니다.


답변

PHP에서로 $_SERVER시작하는 모든 변수 HTTP_는 사용자의 영향을받을 수 있습니다. 예를 들어, HTTP 요청에서 $_SERVER['HTTP_REINERS']HTTP 헤더 REINERS를 임의의 값 으로 설정 하여 변수 를 오염시킬 수 있습니다 .


답변