var_dump $_SERVER['HTTP_HOST'] 显示预期的字符串,但比较或解析时出现意外结果

var_dump $_SERVER['HTTP_HOST'] shows expected string, but unexpected result when comparing or parsing

我有一个奇怪的问题。有人创建了一个类似于我的网站 (www.greatwebsite.com) and has been scraping the content in real time to show on their website (www.bestwebsite.com) 的 url(为了我客户的隐私,我更改了 URL)。我一直在尝试重定向通过这个不良行为者 url 发出的请求,但未能成功,因为 $_SERVER['HTTP_HOST'] 变量中的值错误....

<?php
$host = $_SERVER['HTTP_HOST'];
var_dump($host);
?>

当我在 www.greatwebsite.com 访问官方网站时, HTTP_HOST 变量输出 string(20) "www.greatwebsite.com" 当我将字符串值与 "www.greatwebsite.com" 一切正常。

但是,当我在 www.bestwebsite.com 访问恶意网站时, var_dump 输出
string(20) "www.bestwebsite.com" 但字符数是 20 而不是 19。如果我尝试将字符串与 "www.bestwebsite.com" 进行比较,它 returns 为假。所以我然后打印出字符串中的每个字符,即使 var_dump 显示 www.bestwebsite.com,里面的字符串实际上是 www.greatwebsite.com。如果我回显 $_SERVER['HTTP_HOST'] 的内容,它会显示 www.bestwebsite.com 所以我试图通过这样的输出缓冲来捕获它

ob_start();
echo $host;
$output = ob_get_clean(); 
ob_end_clean();

echo $output; //outputs www.bestwebsite.com
echo substr($output, 4, 4); //outputs great

echo stills 显示 www.bestwebsite.com,但是当我比较 $output 中的内容时,它仍然表现得好像值是 www.greatwebsite.com 所以我无法编写逻辑来检测请求何时到来来自坏演员网站。

有谁知道 HTTP_HOST 值为什么这样做以及我如何成功比较该值以确定请求是否来自这个不良行为者网站,以便我可以将其重定向到其他地方以便他们停止窃取我客户的内容?

这是信息学中的一个经典问题——“永远为零”和“一个或多个”之间的界限。一旦有可能至少有 1 个坏演员 - 就​​很有可能有更多。如果你试图通过将每个不良行为者列入黑名单来保护 - 你会耗尽你的资源。更好的策略是使用白名单——即如果 HTTP_HOST 不是 www.greatwebsite.com 那么根本不提供任何内容。这可以通过一个简单的 header('HTTP/1.1 444 Go home', TRUE, 444)

来实现