Programing

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

lottogame 2020. 8. 25. 19:16
반응형

어떤 $ _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' (may contain tainted data)
  • 'PHP_SELF' (may contain tainted data)
  • 'PATH_TRANSLATED'
  • any other 'HTTP_' value

§ May be considered reliable as long as the web server allows only certain request methods.

‖ May be considered reliable if authentication is handled entirely by the web server.

The superglobal $_SERVER also includes several environment variables. Whether these are "safe" or not depend on how (and where) they are defined. They can range from completely server controlled to completely user controlled.


In PHP every $_SERVER variable starting with HTTP_ can be influenced by the user. For example the variable $_SERVER['HTTP_REINERS'] can be tainted by setting the HTTP header REINERS to an arbitrary value in the HTTP request.

참고URL : https://stackoverflow.com/questions/6474783/which-server-variables-are-safe

반응형