使用php伪造referer的方法 利用referer防止图片盗链

网络安全 2025-04-06 05:05www.168986.cn网络安全知识

当浏览器向Web服务器发送请求时,HTTP Referer作为header的一部分,默默地传递着用户的来源页面信息。这个信息虽然可以被伪造,但它对于网站SEO优化来说却具有不可忽视的价值。那么,让我们通过一个简单的例子,来深入理解HTTP Referer的作用。

狼蚁网站的SEO优化实践为我们提供了一个生动的示例。在浏览Web时,我们常常遇到从某个页面链接跳转到另一个页面的情况。这时,HTTP Referer就像一座桥梁,告诉目标服务器,用户是从哪个页面过来的。以新浪博客为例,当我在主页上点击链接访问朋友的博客时,朋友的服务器就能通过HTTP Referer得知有多少用户是从我的主页过来的。尽管Referrer这个词常被人们误写为Referer,但其核心作用不变。

最近我更换了feed阅读器至Gregarius,但在访问新浪博客时遇到了问题:无法显示其中的图片,提示“此图片仅限于新浪博客用户交流与沟通”。这个问题源于HTTP Referer的处理不当。由于我上网客户端配置的特殊性,我怀疑与Squid有关。通过实验,我发现了一个关于Squid与Tor、Privoxy协同使用时的隐私泄露问题,这有待我后续研究。遗憾的是,Gregarius并不能直接解决这一问题,因为它只负责输出HTML代码,而图像的访问是由客户端浏览器向服务器请求的。

为了解决这个问题,我选择了使用Firefox扩展。其中,“Send Referrer”扩展虽未找到,但发现了一个可用的“RefControl”。这个扩展可以根据访问网站的不同,控制使用不同的Referer。我不喜欢依赖Firefox扩展来解决问题,因为它们有时效率较低。我选择了使用Privoxy来解决这个问题。通过在Privoxy的default.action中添加特定代码,我可以控制HTTP Referer的处理方式,从而解决图像无法显示的问题。

我还发现从https页面访问http页面时,HTTP Referer无法被检测到。这是出于安全考虑:如果来源是加密页,访问非加密页时,客户端不会发送Referer。这一行为在IE和Firefox等浏览器中都是一致的。但这只影响从加密页到非加密页的访问,从加密页到加密页的访问不受影响。在Firefox中,可以通过调整相关设置来控制Referer的发送方式。

掌控访问权限:Apache配置的安全防线

为了确保只有特定的访问者能够访问您的网站资源,比如图片或页面,我们常常需要设置访问权限。在Apache服务器中,我们可以通过配置文件来实现这一功能。让我们深入了解如何设置只允许来自特定源的访问,以及如何应对伪造的风险。

让我们来看如何通过Apache的配置文件来设置允许访问的地址。假设我们希望只允许来自don.网站的访问。我们可以使用SetEnvIfNoCase和SetEnvIf指令来检查请求头中的Referer字段。如果Referer字段的值以

```plaintext

SetEnvIfNoCase Referer "^ local_ref

SetEnvIf Referer "^$" local_ref

```

然后,我们可以使用FilesMatch指令来针对特定的文件类型(如gif和jpg图片文件)设置访问规则。只允许带有本地引用(local_ref)标记的访问。代码如下:

```plaintext

Order Allow,Deny

Allow from env=local_ref

```

另一种方法是针对特定的目录进行设置,比如将/web/images目录设置为只允许来自本地引用的访问。代码如下:

```plaintext

Order Deny,Allow

Deny from all

Allow from env=local_ref

```

需要注意的是,Referer字段是可以被客户端伪造的。不建议使用Referer进行身份验证或其他重要的安全检查。无论是通过Firefox扩展、Privoxy还是libcurl的调用,Referer数据都可能是不可靠的。更安全的方式是使用session来跟踪用户的访问路径。在入口页面设置session,然后在其他页面检查session是否存在。但这并不意味着可以完全信任这种方法。HTTP-Referer这个变量已经变得越来越不可靠,可以被完全伪造。下面是伪造Referer的PHP和JavaScript示例代码:

PHP示例(需要安装curl):

```php

$ch = curl_init();

curl_set($ch, CURLOPT_URL, "

curl_set($ch, CURLOPT_REFERER, "

curl_exec($ch);

curl_close($ch);

```

JavaScript示例:使用xmlHttp.setRequestHeader来设置Referer:

```javascript

xmlHttp.setRequestHeader("Referer", " // 假的Referer

```其他语言如Perl等也可以实现伪造Referer的功能。为了防御伪造Referer的行为,可以采用验证码(Session)等方法。市面上也有一些防盗链软件如UUDOG、linkgate等,它们采用cookies验证、线程控制等技术,但任何技术都有破解的可能。对于服务器端的配置来说,除了设置访问规则外,还需要不断跟进和学习新的安全技术,以保障网站的安全运行。在选择安全策略时,应根据实际需求和环境进行综合考虑和评估。最终目标是确保只有合法的访问者能够访问您的网站资源。

上一篇:ES6数组方法find()、findIndex()的总结 下一篇:没有了

Copyright © 2016-2025 www.168986.cn 狼蚁网络 版权所有 Power by