$_SERVER['HTTP_HOST']
XSS 공격에 대해 걱정할 필요없이 사이트의 모든 링크에 양식 을 사용할 때 "안전" 합니까?
예, 그건 안전 사용 $_SERVER['HTTP_HOST']
, (심지어 $_GET
와 $_POST
) 당신이 그들을 확인뿐만 을 수락하기 전에. 이것이 안전한 프로덕션 서버를 위해하는 일입니다.
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
$reject_request = true;
if(array_key_exists('HTTP_HOST', $_SERVER)){
$host_name = $_SERVER['HTTP_HOST'];
// [ need to cater for `host:port` since some "buggy" SAPI(s) have been known to return the port too, see http://goo.gl/bFrbCO
$strpos = strpos($host_name, ':');
if($strpos !== false){
$host_name = substr($host_name, $strpos);
}
// ]
// [ for dynamic verification, replace this chunk with db/file/curl queries
$reject_request = !array_key_exists($host_name, array(
'a.com' => null,
'a.a.com' => null,
'b.com' => null,
'b.b.com' => null
));
// ]
}
if($reject_request){
// log errors
// display errors (optional)
exit;
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
echo 'Hello World!';
// ...
장점은 $_SERVER['HTTP_HOST']
동작이보다 잘 정의되어 있다는 것 $_SERVER['SERVER_NAME']
입니다. 대조 ➫➫ :
현재 요청의 Host : 헤더 내용 (있는 경우)
와:
현재 스크립트가 실행중인 서버 호스트의 이름입니다.
더 잘 정의 된 인터페이스를 사용 $_SERVER['HTTP_HOST']
한다는 것은 더 많은 SAPI가 신뢰할 수있는 잘 정의 된 동작을 사용하여이를 구현한다는 것을 의미합니다 . (달리 다른 .) 그러나, 여전히 의존 완전히 SAPI입니다 ➫➫ :
모든 웹 서버가 이러한 $_SERVER
항목을 제공한다고 보장 할 수는 없습니다 . 서버는 일부를 생략하거나 여기에 나열되지 않은 다른 서버를 제공 할 수 있습니다.
호스트 이름을 올바르게 검색하는 방법을 이해하려면 먼저 코드 만 포함 된 서버에는 네트워크에서 자신의 이름 을 알 필요가 없습니다 . 자체 이름을 제공하는 구성 요소와 인터페이스해야합니다. 이것은 다음을 통해 수행 할 수 있습니다.
로컬 설정 파일
로컬 데이터베이스
하드 코드 된 소스 코드
외부 요청 ( 컬 )
고객 / 공격자의 Host:
요청
기타
일반적으로 로컬 (SAPI) 구성 파일을 통해 수행됩니다. 아파치에서 예를 들어, 올바르게 구성했는지 참고 ➫➫ :
동적 가상 호스트를 일반 가상 호스트처럼 보이게하려면 몇 가지 사항을 '가짜'야합니다.
가장 중요한 것은 Apache가 자체 참조 URL 등을 생성하는 데 사용하는 서버 이름입니다. ServerName
지시문으로 구성되며 SERVER_NAME
환경 변수 를 통해 CGI에서 사용할 수 있습니다 .
런타임에 사용되는 실제 값 은 UseCanonicalName 설정에 의해 제어됩니다 .
로 UseCanonicalName Off
서버 이름의 내용에서 오는 Host:
요청의 헤더입니다. 로 UseCanonicalName DNS
그 가상 호스트의 IP 주소를 역 DNS 검색에서 온다. 전자의 설정은 이름 기반 동적 가상 호스팅에 사용되고 후자의 설정은 ** IP 기반 호스팅에 사용됩니다.
경우 에는이 없기 때문에 아파치는 서버 이름을 작동 할 수 없습니다 Host:
머리글 또는 실패 조회하는 DNS 다음 구성 값 ServerName
대신 사용됩니다가.