php - 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 值会这样做,以及如何成功比较该值以确定请求是否来自这个不良行为者网站,以便我可以将其重定向到其他地方,这样他们就不会窃取我客户的内容?
解决方案
这是信息学中的一个经典问题——“总是零”和“一个或多个”之间的界限。一旦有可能至少有 1 个坏演员 - 很可能会有更多。如果您试图通过将每个不良行为者列入黑名单来保护 - 您将耗尽您的资源。更好的策略是使用白名单——即如果 HTTP_HOST 不是www.greatwebsite.com
,则根本不提供任何内容。这可以通过一个简单的方法来实现header('HTTP/1.1 444 Go home', TRUE, 444)
推荐阅读
- java - spring boot and reactjs for frontend was working fine till i add security to the backend
- firebase - 如何限制应用程序的高级功能?
- sip - 我正在开发 RTP 服务器。我没有得到我的确认。我究竟做错了什么?
- swift - 从 iOS 13 UIDatepicker 转换到 iOS 14 UIDatepicker
- sql - 如何使用来自同一表的值在表上应用 RLS
- angular - Angular 材料日期选择器在 1 天前发送日期以及如何使用 Angular 材料日期选择器的时刻
- r - 如何从月度数据传递到季度数据?R 数据框
- android - Android MLKit 中的 ImageAnalyzer 和 VisionProcessor 之间有什么明显区别(如果有的话)?
- css - Css Grid项目在滚动时粘在顶部
- python - 尝试块传递条目到数组中的Python错误处理