PHP如何进行有效地防止盗链操作?如何根据图片ID访问图片?

科学技术十分发达的今天,在互联网世界里,采集网站非常多,很多网站都喜欢盗链或者盗用别人网站的图片,这样不仅侵权,还导致被盗链的网站消耗大量的流量,给服务器造成比较大的压力。那么接下来谈一谈如何进行有效地防止盗链操作。

直接访问图片,成功访问


那么如何控制不能直接访问图片呢?

我们可以把images目录设置成不充许http访问(把图片目录的:读取、目录浏览 两个权限去掉)。

apache环境中,在你的图片目录中加上下面这个文件即可。

文件名 .htaccess

# options the .htaccess files in directories can override.
# Edit apache/conf/httpd.conf to AllowOverride in .htaccess
# AllowOverride AuthConfig
# Stop the directory list from being shown
Options -Indexes
# Controls who can get stuff from this server.
Order Deny,Allow
Deny from all
Allow from localhost

如图所示:


加上该文件后,直接访问图片,就会出现以下提示,这样就有效控制直接访问图片了


直接走代码,用代码说话。

我们先来看下$_SERVER['HTTP_REFERER']是什么?

答案是

来源网址。

比如你当前访问a.php,这个文件上面有一个连接到b.php的超链接,当你点击超链后,这个值就是a.php,如果在浏览器中直接输入b.php访问,这个值就是空。

本机测试页面:

<!DOCTYPE html>
<html lang="en">
    <head>
        <title>防盗链页面</title>
        <meta charset="utf-8">
    </head>
    <body>
        <img src="http://127.0.0.1/fangdaolian/image.php?img_id=1" alt="" width="250" height="350" />
        <a href="http://127.0.0.1/fangdaolian/image.php?img_id=1" target="_blank">点我看图</a>
    </body>
</html>

后端处理代码:

<?php
    class Imgdata{
        public $img_id;

        public function __construct($id){
            header('Content-Type: image/jpeg');
            $this->img_id = $id;
        }

        //输出图片
        public function output_img(){
            //进行防盗链处理
            if(isset($_SERVER['HTTP_REFERER'])){
                $parse_url = parse_url($_SERVER['HTTP_REFERER']);//对来源网址进行解析
                $allow_host_arr = [//运行访问的主机数组,实际项目开发时,可以通过配置文件进行配置
                    '127.0.0.1',
                    'localhost',
                    '192.168.2.54'
                ];
                if(in_array($parse_url['host'], $allow_host_arr)){
                    echo file_get_contents("images/".$this->img_id.".jpg");
                }else{
                    echo file_get_contents('images/fdl2.png');//如果是防盗链,则已警告图片进行展现
                }
            }else{
                echo file_get_contents('images/fdl1.png');//如果是防盗链,则已警告图片进行展现
            }
        }
    }
    $img_id = $_GET['img_id'];//获取图片id
    $img = new Imgdata($img_id);//图片路径,一般存储在数据库里,用户无法获取真实路径,可根据图片ID来获取
    $img->output_img();//输出图片

浏览器访问:



点击“点我看图”,成功访问


均能正常访问

那么,现在我们把代码部署到远程服务器上(模拟成别人的图片服务器),看下情况如何

本地测试页面(模拟成自己的项目)代码改成:

<!DOCTYPE html>
<html lang="en">
    <head>
        <title>防盗链页面</title>
        <meta charset="utf-8">
    </head>
    <body>
        <img src="http://125.77.22.119:20322/fangdaolian/image.php?img_id=1" alt="" width="250" height="350" /><!--盗用远程服务器的图片-->
        <a href="http://125.77.22.119:20322/fangdaolian/image.php?img_id=1" target="_blank">点我看图</a><!--盗用链接-->
    </body>
</html>

远程服务器的主机设置为


现在浏览器访问情况:


然后点击“点我看图”,还是会提示错误,无法访问图片


通过该测试,我们就成功的模拟了自己项目里盗用别人的链接操作,及时访问路径正确也无法访问。

猜你喜欢

转载自blog.csdn.net/qq_27682041/article/details/80569132
今日推荐