获取当前域

2020/09/30 12:01 · php ·  · 0评论

我的网站在服务器上http://www.myserver.uk.com

在此服务器上,我有两个域:

one.com and two.com

我想使用PHP来获取当前域,但是如果我使用$_SERVER['HTTP_HOST']它,它就会向我展示

 myserver.uk.com

代替:

one.com or two.com

如何获取域而不是服务器名称?

尝试使用此: $_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 |


 |
数据库| WordPress |


 |
环境变量| Laravel |


 |
服务注册表| Kubernetes DNS |


+ ------------------------------------------------- --- + ----------------------------------- +

以下工作...但是它们不安全

黑客可以使以下变量输出所需的任何域。这可能导致缓存中毒和几乎没有注意到的网络钓鱼攻击。

$_SERVER['HTTP_HOST']

这是从请求标头获取域的,请求标头可以被黑客操纵与:

$_SERVER['SERVER_NAME']

如果关闭Apache设置usecanonicalname,可以使此方法更好在这种情况下,$_SERVER['SERVER_NAME']将不再允许使用任意值填充,并且将是安全的。但是,这不是默认设置,在设置中并不常见。

在流行的系统中

以下是如何在以下框架/系统中获得当前域的方法:

WordPress的

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

如果您要在WordPress中构造URL,则只需使用home_urlsite_url或任何其他URL函数

拉拉韦尔

request()->getHost()

request()->getHost功能继承自Symfony,自对2013 CVE-2013-4752进行修补以来一直安全

Drupal

安装程序尚未确保此安全(发行#2404259)。但是在Drupal 8中有文档,您可以在Trusted Host Settings中遵循这些文档来保护您的Drupal安装,之后可以使用以下内容:

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

其他框架

随意编辑此答案,以包括如何在您喜欢的框架中获取当前域。这样做时,请包括指向相关源代码或其他任何链接的链接,这些链接将帮助我验证框架是否在安全地执行操作。


附录

开发示例:

  1. 如果僵尸网络不断使用错误的主机头请求页面,则会发生缓存中毒。然后,生成的HTML将包含指向攻击者网站的链接,攻击者可以在其中诱骗您的用户。最初,恶意链接只会发送回给黑客,但是,如果黑客发出了足够的请求,则该页面的恶意版本将最终出现在您的缓存中,并将其分发给其他用户。

  2. 如果您基于主机头将链接存储在数据库中,则可能会发生网络钓鱼攻击。例如,假设您将绝对URL存储到论坛上用户的个人资料中。通过使用错误的标题,黑客可以使单击其个人资料链接的任何人都被发送到钓鱼网站。

  3. 如果黑客在为其他用户填写密码重置表单时使用恶意主机标头,则会发生密码重置中毒。然后,该用户将收到一封电子邮件,其中包含通向钓鱼网站的密码重置链接。

  4. 这是更多恶意示例

其他注意事项和注意事项:

  • 关闭usecanonicalname时,无论如何都将$_SERVER['SERVER_NAME']使用相同的标头填充该标头$_SERVER['HTTP_HOST'](加上端口)。这是Apache的默认设置。如果您或开发人员启用了此功能,则表示您还可以-ish-但您是否真的想依靠一个单独的团队,或者自己在三年后的将来,来维持一个看起来很小的配置? -默认值?即使这样做可以确保安全,但我还是提醒不要依赖此设置。
  • 但是,Redhat确实会默认启用usecanonical [ source ]。
  • 如果在虚拟主机条目中使用serverAlias,并且请求了别名域,$_SERVER['SERVER_NAME']则不会返回当前域,但会返回serverName指令的值。
  • 如果无法解析serverName,则在其位置[source]中使用操作系统的hostname命令
  • 如果省略了主机头,则服务器将表现为useuseonical位于[source]上
  • 最后,我只是尝试在本地服务器上利用此漏洞,但无法欺骗主机头。我不确定Apache是​​否有解决此问题的更新,或者我做错了什么。无论如何,在不使用虚拟主机的环境中,仍然可以利用此头。

小兰特:

     这个问题得到了成千上万的意见,而没有提到手头的安全问题!不应该这样,只是因为Stack Overflow答案很流行,并不意味着它是安全的。


尝试$_SERVER['SERVER_NAME']

提示:创建一个调用该函数的PHP文件,phpinfo()然后查看“ PHP变量”部分。这里有很多我们从未想过的有用变量。

我知道这可能不完全是主题,但是根据我的经验,我发现将当前URL的WWW形式存储在变量中很有用。

编辑:此外,请参阅下面的我的评论,以了解其含义。

在确定是否使用“ www”或不使用“ 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是true还是false来运行正确的Ajax调用。

我知道这听起来很琐碎,但这是一个常见问题,很容易发生。

每个人都在使用该parse_url功能,但有时用户可能会以不同的格式传递argumet。

为了解决这个问题,我创建了函数。看一下这个:

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

$_SERVER['HTTP_HOST'] 

//获取域

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

//具有协议的域

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

//协议,域,queryString总计**由于$ _SERVER ['SERVER_NAME']对于多域托管不可靠!

只需尝试:

echo apache_request_headers()[3];
本文地址:http://php.askforanswer.com/huoqudangqianyu.html
文章标签: ,   ,  
版权声明:本文为原创文章,版权归 admin 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!