[php] 현재 도메인 받기

서버에 내 사이트가 있습니다

http://www.myserver.uk.com

이를 위해 두 개의 도메인이 있습니다.

http://one.com

http://two.com

PHP 현재 도메인을 사용하고 싶지만 사용 $_SERVER['HTTP_HOST']하면이 표시됩니다.

myserver.uk.com

대신에:

one.com or two.com

서버 이름이 아닌 도메인을 어떻게 얻을 수 있습니까?

PHP 버전 5.2가 있습니다.



답변

이것을 사용해보십시오 : $_SERVER['SERVER_NAME']

아니면 파싱

$_SERVER['REQUEST_URI']

apache_request_headers ()


답변

가장 좋은 용도는

echo $_SERVER['HTTP_HOST'];

그리고 그것은 다음과 같이 사용될 수 있습니다 :

if (strpos($_SERVER['HTTP_HOST'], 'banana.com') !== false) {
    echo "Yes this is indeed the banana.com domain";
}

아래의이 코드는 키워드가 강조 표시된 구조화 된 HTML 출력에서 ​​$ _SERVER의 모든 변수를 실행 후 바로 정지시키는 좋은 방법입니다. 때로는 어떤 것을 사용 해야할지 잊어 버렸기 때문에 이것이 좋을 것이라고 생각합니다.

<?php
    // Change banana.com to the domain you were looking for..
    $wordToHighlight = "banana.com";
    $serverVarHighlighted = str_replace( $wordToHighlight, '<span style=\'background-color:#883399; color: #FFFFFF;\'>'. $wordToHighlight .'</span>',  $_SERVER );
    echo "<pre>";
    print_r($serverVarHighlighted);
    echo "</pre>";
    exit();
?>


답변

를 사용 $_SERVER['HTTP_HOST']하면 (subdomain.) maindomain.extension이 표시됩니다. 가장 쉬운 해결책 인 것 같습니다.

실제로 iFrame을 통해 ‘리디렉션’하는 경우 도메인을 나타내는 GET 매개 변수를 추가 할 수 있습니다 .

<iframe src="myserver.uk.com?domain=one.com"/>

그런 다음 애플리케이션 전체에서이 데이터를 유지하는 세션 변수를 설정할 수 있습니다.


답변

이것을하는 유일한 안전한 방법

이 페이지의 다른 모든 답변에는 알아야 할 보안 관련 사항이 있습니다.

현재 도메인을 검색 할 수있는 유일한 안전한 방법 하는 것입니다 ? ?????? ????????의 ???????? ?? ??을 ?????.

대부분의 프레임 워크는 도메인 저장을 담당하므로 특정 프레임 워크에 대한 설명서를 참조하십시오. 프레임 워크를 사용하지 않는 경우 다음 위치 중 하나에 도메인을 저장하십시오.

+ ————————————————- — + ———————————– +
 | 안전한 도메인 저장 방법 | 사용하는 사람 |
+ ————————————————- — + ———————————– +
 | 구성 파일 | Joomla, Drupal / Symfony |
 | 데이터베이스 | 워드 프레스 |
 | 환경 변수 | 라 라벨 |
 | 서비스 레지스트리 | 쿠 버네 티스 DNS |
+ ————————————————- — + ———————————– +

다음을 사용할 수는 있지만 안전하지 않습니다.

해커는 이러한 변수를 원하는 도메인으로 출력 할 수 있습니다. 이는 캐시 중독 및 간신히 눈에 띄는 피싱 공격으로 이어질 수 있습니다.

$_SERVER['HTTP_HOST']

이것은 해커가 조작 할 수 있는 요청 헤더에서 도메인을 가져옵니다 . 와 같다:

$_SERVER['SERVER_NAME']

이 설정은 Apache 설정 usecanonicalname 을 끄면 더 좋아질 수 있습니다 . 이 경우 $_SERVER['SERVER_NAME']더 이상 임의의 값으로 채워질 수 없으며 안전합니다. 그러나 이것은 기본값이 아니며 일반적인 설정이 아닙니다.

대중적인 시스템에서

다음은 다음 프레임 워크 / 시스템에서 현재 도메인을 얻는 방법입니다.

워드 프레스

$urlparts = parse_url(home_url());
$domain = $urlparts['host'];

WordPress에서 URL을 구성하는 경우 home_url 또는 site_url 또는 다른 URL 함수를 사용하십시오 .

라 라벨

request()->getHost()

request()->getHost기능은 Symfony에서 상속되었으며 2013 CVE-2013-4752 가 패치 된 이후 안전합니다 .

드루팔

설치 관리자는 아직이 보안을 수행하지 않습니다 ( 문제 # 2404259 ). 그러나 Drupal 8에는 신뢰할 수있는 호스트 설정 에 따라 Drupal 설치를 보호 한 후 다음을 사용할 수있는 설명서가 있습니다.

\Drupal::request()->getHost();

다른 프레임 워크

선호하는 프레임 워크에서 현재 도메인을 얻는 방법을 포함하도록이 답변을 자유롭게 편집하십시오. 그렇게 할 때 관련 소스 코드 또는 프레임 워크가 안전하게 작업하고 있는지 확인하는 데 도움이되는 다른 링크를 포함 시키십시오.


추가

착취 사례 :

  1. 봇넷이 잘못된 호스트 헤더를 사용하여 페이지를 지속적으로 요청하면 캐시 포이즈 닝이 발생할 수 있습니다. 결과 HTML에는 공격자 웹 사이트에 대한 링크가 포함되어 사용자를 피싱 할 수 있습니다. 처음에는 악의적 인 링크가 해커에게만 다시 전송되지만 해커가 요청을 충분히 수행하면 악의적 인 버전의 페이지가 다른 사용자에게 배포되는 캐시에 남게됩니다.

  2. 호스트 헤더를 기반으로 데이터베이스에 링크를 저장하면 피싱 공격이 발생할 수 있습니다. 예를 들어 포럼의 사용자 프로필에 대한 절대 URL을 저장한다고 가정 해 봅시다. 해커는 잘못된 헤더를 사용하여 프로필 링크를 클릭하는 모든 사람이 피싱 사이트를 받도록 할 수 있습니다.

  3. 해커가 다른 사용자의 비밀번호 재설정 양식을 작성할 때 악의적 인 호스트 헤더를 사용하는 경우 비밀번호 재설정 중독이 발생할 수 있습니다. 그러면 해당 사용자는 피싱 사이트로 연결되는 비밀번호 재설정 링크가 포함 된 이메일을받습니다.

  4. 더 악의적 인 예가 있습니다.

추가주의 사항 및 참고 사항 :

  • 낸다 UseCanonicalName가 꺼집니다이 $_SERVER['SERVER_NAME']같은 헤더로 채워집니다 $_SERVER['HTTP_HOST']어쨌든 사용하는 것 (플러스 포트). 이것은 Apache의 기본 설정입니다. 당신이나 devops가 이것을 켜면 괜찮습니다-ish-그러나 당신은 실제로 다른 팀이나 앞으로 3 년 동안 사소한 구성으로 보이는 것을 유지하기를 원합니까? -기본값? 이렇게하면 보안이 강화되지만이 설정에 의존하지 않도록주의해야합니다.
  • 그러나 Redhat은 기본적으로 usecanonical을 설정합니다 [ source ].
  • 경우 는 ServerAlias가 가상 호스트 항목에 사용하고, 별칭 도메인을 요청, $_SERVER['SERVER_NAME']현재 도메인을 반환하지 않습니다,하지만 SERVERNAME 지시어의 값을 반환합니다.
  • serverName을 확인할 수 없으면 운영 체제의 호스트 이름 명령이 [source] 위치에 사용됩니다 .
  • 호스트 헤더가 없으면 서버는 usecanonical이 [source] 에있는 것처럼 작동합니다 .
  • 마지막으로 로컬 서버 에서이 문제를 악용하려고 시도했지만 호스트 헤더를 스푸핑 할 수 없었습니다. 이 문제를 해결 한 Apache 업데이트가 있는지 또는 내가 잘못한 것이 확실하지 않습니다. 그럼에도 불구하고이 헤더는 가상 호스트를 사용하지 않는 환경에서 여전히 악용 될 수 있습니다.

리틀 랜트 :

     이 질문은 당면한 보안 문제에 대한 언급없이 수십만 건의 견해를 받았습니다! 이 방법이 아니어야하지만 스택 오버플로 응답이 널리 사용된다고해서 이것이 안전하다는 의미는 아닙니다.



답변

시도하십시오 $_SERVER['SERVER_NAME'].

팁 : 함수를 호출하는 PHP 파일을 작성 phpinfo()하고 “PHP 변수”섹션을 참조하십시오. 우리가 결코 생각하지 않는 유용한 변수가 많이 있습니다.


답변

나는 이것이 전적으로 주제에 관한 것이 아니라는 것을 알고 있지만, 내 경험상 현재 URL의 WWW-ness를 변수에 저장하는 것이 유용하다는 것을 알았습니다.

편집 : 또한, 이것이 무엇을 받고 있는지 보려면 아래의 내 의견을 참조하십시오.

“www”를 사용하거나 사용하지 않고 Ajax 호출을 발송할지 여부를 결정할 때 중요합니다.

$.ajax("url" : "www.site.com/script.php", ...

$.ajax("url" : "site.com/script.php", ...

Ajax 호출을 발송할 때 도메인 이름은 브라우저의 주소 표시 줄에있는 것과 일치해야합니다. 그렇지 않으면 콘솔에 Uncaught SecurityError 가 발생합니다.

그래서이 문제를 해결하기 위해이 솔루션을 생각해 냈습니다.

<?php
    substr($_SERVER['SERVER_NAME'], 0, 3) == "www" ? $WWW = true : $WWW = false;

    if ($WWW) {
        /* We have www.example.com */
    } else {
        /* We have example.com */
    }
?>

그런 다음 $ WWW가 참인지 거짓인지에 따라 적절한 Ajax 호출을 실행하십시오.

나는 이것이 사소한 것처럼 들릴지 모르지만 이것은 넘어지기 쉬운 일반적인 문제입니다.


답변

모두 parse_url함수를 사용하고 있지만 때로는 사용자가 다른 형식으로 인수를 전달할 수도 있습니다.

이를 해결하기 위해 함수를 만들었습니다. 이것 좀 봐:

function fixDomainName($url='')
{
    $strToLower = strtolower(trim($url));
    $httpPregReplace = preg_replace('/^http:\/\//i', '', $strToLower);
    $httpsPregReplace = preg_replace('/^https:\/\//i', '', $httpPregReplace);
    $wwwPregReplace = preg_replace('/^www\./i', '', $httpsPregReplace);
    $explodeToArray = explode('/', $wwwPregReplace);
    $finalDomainName = trim($explodeToArray[0]);
    return $finalDomainName;
}

URL을 전달하고 도메인을 얻으십시오.

예를 들어

echo fixDomainName('https://stackoverflow.com');

결과를 반환합니다

stackoverflow.com

그리고 어떤 상황에서는 :

echo fixDomainName('stackoverflow.com/questions/id/slug');

그리고 그것은 또한 돌아올 stackoverflow.com것이다.