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

问题描述

我有一个奇怪的问题。有人创建了一个类似于我的网站 ( www.greatwebsite.com ) 的 URL,并一直在实时抓取内容以显示在他们的网站 ( www.bestwebsite.com ) 上(为了保护客户的隐私,我更改了 URL)。我一直在尝试重定向通过这个错误的演员 url 发出的请求,但由于 $_SERVER['HTTP_HOST'] 变量中的值错误......

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

当我访问www.greatwebsite.com的官方网站时,HTTP_HOST 变量按原样输出字符串(20)“www.greatwebsite.com”,当我将字符串值与“www.greatwebsite.com”进行比较时,一切正常。

但是,当我访问www.bestwebsite.com的坏演员网站时,var_dump 输出
字符串(20)“www.bestwebsite.com”,但字符数是 20 而不是 19。如果我尝试将字符串与“www. bestwebsite.com”它返回 false。所以我然后打印出字符串中的每个字符,即使 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 值会这样做,以及如何成功比较该值以确定请求是否来自这个不良行为者网站,以便我可以将其重定向到其他地方,这样他们就不会窃取我客户的内容?

标签: phpvar-dump

解决方案


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


推荐阅读