하나는 간단한 설정 (CentOS 7, Apache 2.4.x 및 PHP 5.6.20)을 가지고 있고 하나의 웹 사이트 만 (가상 호스팅을 가정하지 않음) 가정합니다 ...
PHP 의미에서, $_SERVER['SERVER_NAME']
PHP 는 httpd.conf $_SERVER
의 아파치 구성 (으로 **ServerName**
지시어 UseCanonicalName On
)을 기반으로 슈퍼 글로벌에 등록 된 요소입니다 ( 포함 된 가상 호스트 구성 파일 등). HTTP_HOST 는 HTTP에서 파생됩니다host
헤더 . 이것을 사용자 입력으로 취급하십시오. 사용하기 전에 필터링하고 확인하십시오.
다음은 $_SERVER['SERVER_NAME']
비교의 기준으로 사용하는 예입니다 . 다음 방법은 이름이 ServerValidator
(child of Validator
) 인 구체적인 자식 클래스에서 온 것입니다 . ServerValidator
$ _SERVER에서 6 ~ 7 개의 요소를 사용하기 전에 점검합니다.
HTTP 요청이 POST인지 확인하기 위해이 방법을 사용합니다.
public function isPOST()
{
return (($this->requestMethod === 'POST') && // Ignore
$this->hasTokenTimeLeft() && // Ignore
$this->hasSameGETandPOSTIdentities() && // Ingore
($this->httpHost === filter_input(INPUT_SERVER, 'SERVER_NAME')));
}
이 메소드가 호출 될 때 관련 $ _SERVER 요소 (및 관련 특성 세트)의 모든 필터링 및 유효성 검증이 발생했습니다.
라인 ...
($this->httpHost === filter_input(INPUT_SERVER, 'SERVER_NAME')
... $_SERVER['HTTP_HOST']
(요청 된 host
HTTP 헤더 에서 최종적으로 파생 된) 값이 일치 하는지 확인합니다 $_SERVER['SERVER_NAME']
.
지금, 나는 내 예를 설명하기 위해 자동 전역 말하는을 사용하고 있지만, 어떤 사람들은 익숙하지 않은 단지 때문입니다 INPUT_GET
, INPUT_POST
그리고 INPUT_SERVER
안부에 filter_input_array()
.
결론은하지 않는 내 서버에 POST 요청을 처리하지 않는 것입니다 모두 네 가지 조건이 충족된다. 따라서, POST 요청의 측면에서, 실패는 HTTP 제공하는 host
헤더 주문 (이전 테스트 존재) 의 운명 엄격한 위해 HTTP 1.0 브라우저. 또한, 요청 된 호스트 값과 일치해야합니다 위해 ServerName
에서 httpd.conf를 들어, 확장자에 의해, 값을, 그리고 $_SERVER('SERVER_NAME')
에서 $_SERVER
자동 전역. 다시 한 번, INPUT_SERVER
PHP 필터 기능과 함께 사용 하지만 드리프트를 잡습니다.
아파치 가 아니더라도 Apache ServerName
는 표준 리다이렉션 (예 : 후행 슬래시를 URL에서 남기는 등)을 자주 사용합니다 (예 : http://www.foo.com 이 http://www.foo.com/ ). URL 재 작성 사용
내가 $_SERVER['SERVER_NAME']
아닌 표준으로 사용 합니다 $_SERVER['HTTP_HOST']
. 이 문제에는 많은 부분이 있습니다. $_SERVER['HTTP_HOST']
비어있을 수 있으므로 위의 공개 방법과 같은 코드 규칙을 작성하기위한 기초가되어서는 안됩니다. 그러나, 둘 다 설정 될 수 있다고해서 이들이 동일하다는 것을 보장하지는 않습니다. 테스트는 아는 가장 좋은 방법입니다 (Apache 버전 및 PHP 버전을 염두에 두어야 함).