복붙노트

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

PHP

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

사용자가 제어 할 수있는 모든 변수는 공격자가 제어 할 수 있으므로 공격의 원인입니다. 이것은 "감염된"변수라고하며 안전하지 않습니다.

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

누구든지 $ _SERVER 변수의 "안전한 목록"또는 알 수없는 목록을 알고 있습니까?

해결법

  1. ==============================

    1."안전"또는 "안전하지 않은"값은 없습니다. 서버가 제어하는 ​​값과 사용자가 제어하는 ​​값만 있고 값의 출처와 특정 목적을 위해 신뢰할 수 있는지 여부를 알아야합니다. 예를 들어, $ _SERVER [ 'HTTP_FOOBAR']는 데이터베이스에 저장하는 것이 전적으로 안전하지만 가장 확실하게 평가하지는 않습니다.

    "안전"또는 "안전하지 않은"값은 없습니다. 서버가 제어하는 ​​값과 사용자가 제어하는 ​​값만 있고 값의 출처와 특정 목적을 위해 신뢰할 수 있는지 여부를 알아야합니다. 예를 들어, $ _SERVER [ 'HTTP_FOOBAR']는 데이터베이스에 저장하는 것이 전적으로 안전하지만 가장 확실하게 평가하지는 않습니다.

    따라서 이러한 값을 세 가지 범주로 나누십시오.

    이 변수는 서버 환경에 의해 설정되며 전적으로 서버 구성에 따라 다릅니다.

    이 변수는 클라이언트가 보낸 특정 요청에 따라 다르지만 유효하지 않은 값만 사용할 수 있습니다. 모든 잘못된 값은 웹 서버에서 거부되어야하며 스크립트 호출을 시작하지 않아야합니다. 따라서 그들은 신뢰할 수있는 것으로 간주 될 수 있습니다.

    * REMOTE_ 값은 TCP / IP 핸드 셰이크로 확인 된 클라이언트의 유효한 주소가됩니다. 응답을 보낼 주소입니다. REMOTE_HOST는 역 DNS 조회에 의존하기 때문에 서버에 대한 DNS 공격으로 스푸핑 될 수 있습니다 (어쨌든 큰 문제가있는 경우). 이 값은 TCP / IP 프로토콜의 단순한 현실이며 프록시에 대해 아무 것도 할 수없는 프록시 일 수 있습니다.

    † 귀하의 웹 서버가 호스트 헤더에 관계없이 요청에 응답하는 경우, 이는 안전하지 않은 것으로 간주되어야합니다. 얼마나 안전한가 $ _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

    이 값은 전혀 점검되지 않고 서버 구성에 종속되지 않으며 클라이언트가 보낸 임의의 정보입니다.

    § 웹 서버가 특정 요청 방법 만 허용하는 한 신뢰성있는 것으로 간주 될 수 있습니다.

    ‖ 인증이 웹 서버에 의해 완전히 처리되는 경우 신뢰할 수있는 것으로 간주 될 수 있습니다.

    superglobal $ _SERVER에는 여러 환경 변수가 포함되어 있습니다. 이들이 "안전한"것인지 아닌지는 정의 된 방법 및 위치에 따라 다릅니다. 그들은 완전히 서버 제어에서 완전히 사용자 제어까지 다양합니다.

  2. ==============================

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

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

  3. from https://stackoverflow.com/questions/6474783/which-server-variables-are-safe by cc-by-sa and MIT license