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

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

直接访问图片,成功访问

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

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

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

文件名%20.htaccess

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

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


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

本机测试页面:

<!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>

远程服务器的主机设置为


现在浏览器访问情况:


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


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

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

人吐槽 人点赞

猜你喜欢

发表评论

用户名: 密码:
验证码: 匿名发表

你可以使用这些语言

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