使用php伪造referer的方法 利用referer防止图片盗链
当浏览器向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验证、线程控制等技术,但任何技术都有破解的可能。对于服务器端的配置来说,除了设置访问规则外,还需要不断跟进和学习新的安全技术,以保障网站的安全运行。在选择安全策略时,应根据实际需求和环境进行综合考虑和评估。最终目标是确保只有合法的访问者能够访问您的网站资源。
网络安全培训
- 使用php伪造referer的方法 利用referer防止图片盗链
- ES6数组方法find()、findIndex()的总结
- 基于Bootstrap框架菜鸟入门教程(推荐)
- JS与Ajax Get和Post在使用上的区别实例详解
- JavaScript对象属性检查、增加、删除、访问操作实
- JavaScript中innerHTML,innerText,outerHTML的用法及区别
- 通过HttpClient 调用ASP.NET Web API示例
- JavaScript中的object转换成number或string规则介绍
- c#加密类使用方法示例
- PHP判断访客是否手机端(移动端浏览器)访问的方法
- 尘世之锁怎么获得
- 用JSP创建可重用的图形背景
- 愤怒小鸟动画片全集
- 魔兽地图联盟地图下载
- 海尔兄弟主题曲歌词
- asp.net MVC利用ActionFilterAttribute过滤关键字的方法