PHP如何進行有效地防盜鏈操作?如何根據圖片ID訪問圖片?
阿新 • • 發佈:2018-12-26
科學技術十分發達的今天,在網際網路世界裡,採集網站非常多,很多網站都喜歡盜鏈或者盜用別人網站的圖片,這樣不僅侵權,還導致被盜鏈的網站消耗大量的流量,給伺服器造成比較大的壓力。那麼接下來談一談如何進行有效地防盜鏈操作。
直接訪問圖片,成功訪問
那麼如何控制不能直接訪問圖片呢?
我們可以把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>
遠端伺服器的主機設定為
現在瀏覽器訪問情況:
然後點選“點我看圖”,還是會提示錯誤,無法訪問圖片
通過該測試,我們就成功的模擬了自己專案裡盜用別人的連結操作,即使訪問路徑正確也無法訪問。