简单防盗链

简单防盗链实现代码

防盗链的技术已经很普遍了,有些网站不喜欢自己的图片被别的网站直接复制使用,便使用了防盗链的技术,这样别人在直接复制使用网站图片时,图片便会按照程序的设定不显示或显示防盗链等字样。
使用了防盗链技术,不仅可以防止自己的图片被盗用,也可以节省自己站点下载图片的流量,觉得还是蛮不错的说,那么在PHP环境下应该如何防止盗链呢?在PHP环境下我们知道通常都是使用Apache服务器,那么主要看下Apache防盗链的方法吧,其实IIS也是同一个原理。

http协议的-http请求头信息(request)

Accept: */* 【表示客户端可以接受任何数据】

Referer: http://localhost:80/test/abc.html 1.表示我是从哪里来】

Accept-Language: zh-cn 【页面语言】

User-Agent: Mozilla/4.0  【告诉服务我的浏览器的内核,操作系统】

Accept-Encoding: gzip, deflate 【表示接受什么样的数据压缩格式.

Host: localhost:80 【主机:80

Connection: Keep-Alive     【表示不要立即断掉我们的请求.】

<?php 
    // 防盗链:检查进入页面的路径是否存在,存在即是有明确的来源路径,不存在即是来源路径不明(或是直接地址栏输入或是点击打开.html文件)
    // 防止自己的图片被别的网站直接复制使用,图片便会按照程序的设定不显示或显示防盗链等字样。
    if (isset($_SERVER['HTTP_REFERER'])) {
    // 判断isset($_SERVER['HTTP_REFERER']是不是http://localhost开头的
        if (strpos(isset($_SERVER['HTTP_REFERER']),"http://localhost")==0) {
            echo "welcome,you are right";
    // echo strpos($_SERVER['HTTP_REFERER'],"localhost");
        }else{
            // 跳转
            header("location:404.php");
        }
    }else{
            header("location:404.php");
    }
    // echo "this is a new page";
 ?>

Apache防盗链

大多数的虚拟主机都是Apache的,因此最方便的防盗链设置莫过于利用.htaccess文件(这个文件不能直接创建的;可以cmd命令行创建;或者使用编辑器创建另存)了。网上搜索下方法很多,于是我总结了下,绝对好用的方法。把下面的代码添加到.htaccess文件里,修改下即可。

RewriteEngine on//开启重写规则
RewriteCond %{HTTP_FILENAME}.*.(jpg|jpeg|png|gif)[NC]//对规定文件进行防盗处理 [NC]不区分大小写 RewriteCond %{HTTP_REFERER} !^http://localhost/.*$[NC]//判断来源若不是该路径则改写为nopic.png RewriteRule.*nopic.png//这张图片可以自定义

代码解释:
先看最后一行,我对网站上的png、jpg、gif文件做了防盗链保护,一旦我网站里的图片在上述白名单之外的网站里出现,全部显示最后一行代码中的图片。

Nginx防盗链

Nginx不支持.htaccess,设置起来稍微麻烦了点。首先要用文本编辑器打开/usr/local/nginx/conf/nginx.conf这个文件(如果你使用的是vhost,则到vhost里找相应的conf文件),将如下代码匹配在server{ }段里面即可,注意我说的不是拷贝,而是匹配。

location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$
    {
    expires 30d;
    valid_referers none blocked *.ilucong.com *.youdao.com *.zhuaxia.com *.xianguo.com *.google.cn *.google.com *.google.com.tw *.google.com.sg *.google.com.hk
    *.bloglines.com image.soso.com cn.bing.com image.baidu.com *.feedburner.com *.feedsky.com;
    if ($invalid_referer) {
    rewrite ^/ ;
    #return 404;
    }
}

注意:尽量不要使用windows自带的记事本编辑,可能会出现乱行;编辑完之后,重启Ngnix服务方可生效

 反盗链原理

既然服务器使用HTTP_REFERER来匹配进行反防盗链,我们可以顺着这条线来进行反防盗链,即我们伪造HTTP_REFERER成服务器需要的信息,原理就是:服务器需要什么,我们则伪造什么。
反防盗链php referrer.php内容如下

<?php
require('./http.class.php');//此类为上一篇日志的 php实现的http类
$http = new Http('http://localhost/foruser/HTTP/hello.png');
    //我们伪造服务器需要的头信息Referer
$http->setHeader("HTTP_REFERER: http://localhost");
$res = $http->get();
echo $res;
    //将图片信息截图保存下来
file_put_contents('./a.png',substr(strstr($res,'

'),4));
?>

http请求两种主要的方式

get / post

get 和post的区别有哪些

<form action="a.php" method="post">
        <input type="text" name="name"/>
    <input type="submit" value="post">//post请求的数据,放在http协议的消息体
</form>
<form action="a.php" method="post">
    <input type="text" name="name"/>
    <input type="submit" value="get">//get 请求的数据会显示在 地址栏上
</form>

安全性 get 请求的数据会显示在 地址栏上, post请求的数据,放在http协议的消息体
从可以提交数据的大小看,http协议本身并没有限制数据大小。浏览器在对get 和post请求做显示, get 请求数据 2k+35  ,post没有限制。
get请求可以更好的添加到收藏夹..

原文地址:https://www.cnblogs.com/aten/p/8432105.html