1. 程式人生 > >PHP如何進行有效地防盜鏈操作?如何根據圖片ID訪問圖片?

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>

遠端伺服器的主機設定為


現在瀏覽器訪問情況:


然後點選“點我看圖”,還是會提示錯誤,無法訪問圖片


通過該測試,我們就成功的模擬了自己專案裡盜用別人的連結操作,即使訪問路徑正確也無法訪問。