【问题标题】:hotlink protection防盗链
【发布时间】:2012-11-07 02:41:18
【问题描述】:

我做了这个简单的代码来防止我的文件从我的 php 下载文件中热链接:

if ((strpos($_SERVER['HTTP_REFERER'],'www.domain.com')!==0)) {
    $redirect='index.php';
    header("Location: $redirect");
    exit;
}

它不起作用,即使我单击了我的 wbesite 中的链接,它总是将我重定向到 index.php。 我尝试将域更改为多种类型,例如:

http://www.domain.com
www.domain.com
domain.com

但还是同样的问题

【问题讨论】:

  • $_SERVER['HTTP_REFERER']的值是多少?
  • 1. var_dump($_SERVER['HTTP_REFERER']); 2. 仅当referer 存在且不等于您的域时才需要重定向。否则什么都不做
  • 为什么不使用 .htaccess 来做到这一点?请注意 HTTP_REFERER 非常不可靠,您最终会阻止一些合法的人
  • @Dagon,这将是一种有效的辅助方法。您应该将其发布为可能的答案。
  • 我无法使用 htaccess,因为我正在使用 headers 从 php 文件流式传输下载

标签: php hotlinking


【解决方案1】:

我找到了解决方案,我刚刚使用strpos 比较了HTTP_REFERERHTTP_HOST,如果它们匹配则意味着没有盗链。代码:

if($_SERVER['HTTP_REFERER']) { if(!strpos($_SERVER['HTTP_REFERER'],$_SERVER['HTTP_HOST'])) { $redirect='index.php'; header("位置:$redirect"); } }

【讨论】:

  • 我在寻找htaccess 代码解决方案时偶然发现了这一点,并意识到这是一种更合适的方法。只是想提一下,当您通过空浏览器窗口粘贴链接时,$_SERVER['HTTP_REFERER'] 在我的情况下是 NULL,因此代码将无法正常工作。我自己完全忽略了第一个条件,它仍然按预期运行。
【解决方案2】:

您实际上想改用!== FALSE。该字符串可能位于0 位置。还包括 zerkms 的建议:

if (!empty($_SERVER['HTTP_REFERER']) && 
    (strpos($_SERVER['HTTP_REFERER'],'www.domain.com') !== FALSE)) {

文档:http://php.net/manual/en/function.strpos.php

【讨论】:

  • 感谢布拉德,它没有用,我只是在 HTTP_REFERER 和 HTTP_HOST 之间进行了比较,如果它们匹配,则表示没有室外请求。
  • @Alamri,您的$_SERVER['HTTP_REFERER'] 中有什么内容?你的$_SERVER['HTTP_HOST'] 中显示了什么?
  • REFERER 显示上一页的链接,例如:http://domain.com/?p=123,而主机只显示域,例如 domain.com,所以只需使用 strops 来匹配两个字符串
猜你喜欢
  • 1970-01-01
  • 2011-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-29
  • 1970-01-01
  • 2012-12-08
  • 2020-11-07
相关资源
最近更新 更多