zoukankan      html  css  js  c++  java
  • 简单防盗链

    简单防盗链实现代码

    防盗链的技术已经很普遍了,有些网站不喜欢自己的图片被别的网站直接复制使用,便使用了防盗链的技术,这样别人在直接复制使用网站图片时,图片便会按照程序的设定不显示或显示防盗链等字样。
    使用了防盗链技术,不仅可以防止自己的图片被盗用,也可以节省自己站点下载图片的流量,觉得还是蛮不错的说,那么在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请求可以更好的添加到收藏夹..

  • 相关阅读:
    一个改写MBR的例子
    explore没有桌面
    Guidance of Set up FTP Server
    重启远程机器(不登录远程机器下的重启)
    Eclipse 一些小知识
    check time period
    Scrum 冲刺——Day 1
    Scrum 冲刺——Day 2
    初学C语言
    CSS选择器
  • 原文地址:https://www.cnblogs.com/aten/p/8432105.html
Copyright © 2011-2022 走看看