Get current domain

前端 未结 9 1537
时光取名叫无心
时光取名叫无心 2020-11-29 17:48

I have my site on the server http://www.myserver.uk.com.

On this server I have two domains:

one.com and two.com

I would l

相关标签:
9条回答
  • 2020-11-29 18:10
    $_SERVER['HTTP_HOST'] 
    

    //to get the domain

    $protocol=strpos(strtolower($_SERVER['SERVER_PROTOCOL']),'https') === FALSE ? 'http' : 'https';
    $domainLink=$protocol.'://'.$_SERVER['HTTP_HOST'];
    

    //domain with protocol

    $url=$protocol.'://'.$_SERVER['HTTP_HOST'].'?'.$_SERVER['QUERY_STRING'];
    

    //protocol,domain,queryString total **As the $_SERVER['SERVER_NAME'] is not reliable for multi domain hosting!

    0 讨论(0)
  • 2020-11-29 18:22

    The only secure way of doing this

    All of the other answers on this page have security implications that you need to be aware of. The only guaranteed secure method of retrieving the current domain is to store it in a secure location yourself.

    Most frameworks take care of storing the domain for you, so you will want to consult the documentation for your particular framework. If you're not using a framework, consider storing the domain in one of the following places:

    +----------------------------------------------------+-----------------------------------+
     |   Secure methods of storing the domain   |                Used By                 |
    +----------------------------------------------------+-----------------------------------+
     | A config file                                             | Joomla, Drupal/Symfony   |
     | The database                                         | WordPress                          |
     | An environmental variable                     | Laravel                               |
     | A service registry                                    | Kubernetes DNS                |
    +----------------------------------------------------+-----------------------------------+

    The following work... but they're not secure

    Hackers can make the following variables output whatever domain they want. This can lead to cache poisoning and barely noticeable phishing attacks.

    $_SERVER['HTTP_HOST']
    

    This gets the domain from the request headers which are open to manipulation by hackers. Same with:

    $_SERVER['SERVER_NAME']
    

    This one can be made better if the Apache setting usecanonicalname is turned off; in which case $_SERVER['SERVER_NAME'] will no longer be allowed to be populated with arbitrary values and will be secure. This is, however, non-default and not that common of a setup.

    In popular systems

    Below is how you can get the current domain in the following frameworks/systems:

    WordPress

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

    If you're constructing a URL in WordPress, just use home_url or site_url, or any of the other URL functions.

    Laravel

    request()->getHost()
    

    The request()->getHost function is inherited from Symfony, and has been secure since the 2013 CVE-2013-4752 was patched.

    Drupal

    The installer does not yet take care of making this secure (issue #2404259). But in Drupal 8 there is documentation you can you can follow at Trusted Host Settings to secure your Drupal installation after which the following can be used:

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

    Other frameworks

    Feel free to edit this answer to include how to get the current domain in your favorite framework. When doing so, please include a link to the relevant source code or to anything else that would help me verify that the framework is doing things securely.


    Addendum

    Exploitation examples:

    1. Cache poisoning can happen if a botnet continuously requests a page using the wrong hosts header. The resulting HTML will then include links to the attackers website where they can phish your users. At first the malicious links will only be sent back to the hacker, but if the hacker does enough requests, the malicious version of the page will end up in your cache where it will be distributed to other users.

    2. A phishing attack can happen if you store links in the database based on the hosts header. For example, let say you store the absolute URL to a user's profiles on a forum. By using the wrong header, a hacker could get anyone who clicks on their profile link to be sent a phishing site.

    3. Password reset poisoning can happen if a hacker uses a malicious hosts header when filling out the password reset form for a different user. That user will then get an email containing a password reset link that leads to a phishing site.

    4. Here are some more malicious examples

    Additional Caveats and Notes:

    • When usecanonicalname is turned off the $_SERVER['SERVER_NAME'] is populated with the same header $_SERVER['HTTP_HOST'] would have used anyways (plus the port). This is Apache's default setup. If you or devops turns this on then you're okay -- ish -- but do you really want to rely on a separate team, or yourself three years in the future, to keep what would appear to be a minor configuration at a non-default value? Even though this makes things secure, I would caution against relying on this setup.
    • Redhat, however, does turn usecanonical on by default [source].
    • If serverAlias is used in the virtual hosts entry, and the aliased domain is requested, $_SERVER['SERVER_NAME'] will not return the current domain, but will return the value of the serverName directive.
    • If the serverName cannot be resolved, the operating system's hostname command is used in its place [source].
    • If the host header is left out, the server will behave as if usecanonical was on [source].
    • Lastly, I just tried exploiting this on my local server, and was unable to spoof the hosts header. I'm not sure if there was an update to Apache that addressed this, or if I was just doing something wrong. Regardless, this header would still be exploitable in environments where virtual hosts are not being used.

    Little Rant:

         This question received hundreds of thousands of views without a single mention of the security problems at hand! It shouldn't be this way, but just because a Stack Overflow answer is popular, that doesn't mean it is secure.



    0 讨论(0)
  • 2020-11-29 18:27

    Simply try:

    echo apache_request_headers()[3];
    
    0 讨论(0)
提交回复
热议问题