我想創建一個包含許多圖像的網站。但我希望避免直接訪問圖片,例如在不訪問網站的情況下直接鏈接到圖片。如何防止直接訪問圖像?
這樣做的首選方法是什麼?有哪些有利有弊的替代方案?
我有一些想法(我不知道他們是否是可能的):
- 文件權限
- PHP會議
- 臨時文件名或URL
- HTTP重定向?
也許這不是在許多網站上實行?例如。我試圖訪問Facebook上的私人照片,但沒有登錄,但我仍然可以訪問照片。
該平臺可能是一個帶有NginX和PHP的Ubuntu機器。
我想創建一個包含許多圖像的網站。但我希望避免直接訪問圖片,例如在不訪問網站的情況下直接鏈接到圖片。如何防止直接訪問圖像?
這樣做的首選方法是什麼?有哪些有利有弊的替代方案?
我有一些想法(我不知道他們是否是可能的):
也許這不是在許多網站上實行?例如。我試圖訪問Facebook上的私人照片,但沒有登錄,但我仍然可以訪問照片。
該平臺可能是一個帶有NginX和PHP的Ubuntu機器。
您img元素鏈接到PHP文件。這個文件檢查用戶是否擁有正確的權限,如果是的話,它可以發送一個img響應。
<img src="url/LoadImg.php?id=1337" alt="" />
仍然有人用權限的用戶可以下載圖片,並提供給其他人在其他地方(網站空間/郵件/不管)。爲了使它更難以竊取它,你可以禁用右鍵單擊圖像,但仍然有一個知道一點關於http的用戶應該沒有任何問題來竊取它。 您可以在圖像上放置一個簽名(例如您的網站的徽標/名稱),以便人們可以看到您的來源。這可以用php來完成。
如果你想成爲討人喜歡,你可以設置一個其他圖像(色情是爲這個偉大的:P),如果鏈接來自一個其他頁面,發送:P
我一直在我的網站上使用這種方法,但是當頁面上有很多照片時,顯示頁面的時間很長(每張照片都有訪問檢查和服務器請求...)。有沒有人知道如何解決這個問題? – 2013-09-09 03:50:22
這裏同樣的問題。它加載速度非常慢,我無法使用Lazy。有沒有其他方法? – desmeit 2016-11-23 08:16:18
這將是很難做到。爲了讓您的客戶的網絡瀏覽器訪問圖片,他們需要可讀。文件權限不起作用,因爲您需要授予對瀏覽器的訪問權限。你將無法阻止某人下載並與他們一起做某事。
如果您只想停止直接鏈接,如果你改變定期的文件名和更新網頁,以反映這一點,其他的網頁都會有他們的鏈接斷開。
改變文件名的好處,從來沒有想過。確保它不會拒絕下載或訪問至少一次(蠻力),但至少應該洗牌以消除惡意進程。 – TechNyquist 2017-11-14 09:08:48
這可能是有用的:Allow/deny image hotlinking with .htaccess
編輯:有一點要注意這個方法是,一些瀏覽器/ AV /防火牆軟件刪除Referer的數據,當您瀏覽,這將導致潛在的合法用戶被視爲hotlinkers 。
如果您的網站已經在使用某種形式的認證或會話系統,那麼這將是更好地使用@馬克Baijens的回答給出的方法。
更新:nginx的重寫規則,以防止盜鏈:
你可以使用PHP腳本中使用類似檢索圖片:
<img src="mysite.com/getimage.php?id=001" />
,並有PHP腳本只有在確認HTTP_REFERER的域是你的域後才返回圖像數據。
如果你有一個面向賬戶的網站,我建議像你說的那樣使用PHP會話,並在返回圖像數據之前讓PHP腳本驗證會話。
在您的站點文件夾添加一個簡單的.htacess
文件與follwoing線
RewriteEngine on
RewriteCond %{HTTP_REFERER} !^http://www\.your-domain\.com/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http://www\.your-domain\.com$ [NC]
RewriteRule .*\.(wav|swf|jpg|jpeg|gif|png|bmp|js|css)$ - [F,NC,L]
注意我還添加了js
和css
文件,即使我認爲這是對的bizzare找人誰試圖刮他們。
我使用兩種方法 - 檢查用戶gent和引用。用戶代理我在.htaccess檢查。並引用檢查在PHP文件。您可以在http://coloring-4kids.com
看到這裏是我的代碼:
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?pinterest\.com/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?pinterest\.com$ [NC]
RewriteCond %{HTTP_USER_AGENT} !(Googlebot|bingbot|msnbot|yahoo-mmcrawler|YandexImages) [NC]
RewriteCond %{HTTP_USER_AGENT} !googlebot-image [NC]
RewriteCond %{HTTP_USER_AGENT} !googlebot [NC]
RewriteCond %{HTTP_USER_AGENT} !googlebot-news [NC]
RewriteCond %{HTTP_USER_AGENT} !googlebot-video [NC]
RewriteCond %{HTTP_USER_AGENT} !googlebot-mobile [NC]
RewriteCond %{HTTP_USER_AGENT} !mediapartners-google [NC]
RewriteCond %{HTTP_USER_AGENT} !mediapartners [NC]
# RewriteCond %{HTTP_USER_AGENT} !adsbot-google [NC]
RewriteCond %{HTTP_USER_AGENT} !bingbot [NC]
RewriteCond %{HTTP_USER_AGENT} !facebookexternalhit [NC]
RewriteCond %{HTTP_USER_AGENT} !baiduspider [NC]
RewriteCond %{HTTP_USER_AGENT} !yandex [NC]
RewriteCond %{HTTP_USER_AGENT} !sogou [NC]
RewriteCond %{HTTP_USER_AGENT} !twitterbot [NC]
RewriteCond %{HTTP_USER_AGENT} !pinterest [NC]
RewriteRule (^.*\.(gif)$) /watermark.php?src=$1 [L]
watermark.php
<?php
$test = getenv("HTTP_REFERER");
$proverka = substr($test, 0, 25);
header('content-type: image/jpeg');
$image = imagecreatefromgif($_GET['src']);
$watermark = imagecreatefromgif('watermark.gif');
$watermark_width = imagesx($watermark);
$watermark_height = imagesy($watermark);
$dest_x = imagesx($image) - $watermark_width;
$dest_y = imagesy($image) - $watermark_height;
if (strpos($proverka, 'media') !== false)
{ $pinproverka=true; }
if (($proverka != 'http://coloring-4kids.com') && (imagesx($image) > 400) && ($pinproverka!=true)) { imagecopymerge($image, $watermark, $dest_x - 5, 5, 0, 0, $watermark_width, $watermark_height, 100); }
imagegif($image);
imagedestroy($image);
imagedestroy($watermark);
?>
可以使用htaccess以及用戶的IP動態保護的文件夾。
到你的圖片文件夾添加.htaccess文件與以下行:
order deny,allow
deny from all
然後使用PHP插入網友ip到htaccess的文件,當他們登錄這樣的:
<?
$ip = $_SERVER['REMOTE_ADDR'];
if (!filter_var($ip, FILTER_VALIDATE_IP)) exit();
$file = $_SERVER["DOCUMENT_ROOT"].'/YOUR_IMAGE_FOLDER/.htaccess';
$current = file_get_contents($file);
$current .= "allow from ".$_SERVER['REMOTE_ADDR']." #".$_SESSION['id']."\n";
file_put_contents($file, $current);
?>
該文件夾將來自沒有登錄的任何IP被阻止。
請注意,我檢查了IP是否有效。讓用戶無法將自己的代碼注入到htaccess文件中非常重要。
另請注意,我將用戶標識置於htaccess文件中ip右側的註釋中。當用戶註銷時,您可以搜索htaccess文件並刪除該用戶的IP。
您可以對每個請求進行更新,以防止正在使用動態IPS的用戶被啓動。
我使用這種方法與我的整個成員區域,這是一個優秀的安全層。只要確保將日誌放在成員文件夾外部的腳本中即可。
在您的賬戶中添加拒絕規則。htaccess
RewriteEngine on
RewriteCond %{HTTP_REFERER} !^http://(www\.)?domain\.ltd [NC]
RewriteCond %{HTTP_REFERER} !^http://(www\.)?domain\.ltd.*$ [NC]
RewriteRule \.(gif|jpg|js|txt)$ /messageforcurious [L]
您可以訪問Facebook上的「私人」照片,因爲您使用的是直接圖像鏈接,而不是照片頁面。 – drudge 2010-10-21 17:48:16
@jnpcl:是的,這是我想在我的網站上預防的。問題是如何做到這一點? – Jonas 2010-10-21 17:49:57
你想阻止盜鏈或更多? http://stackoverflow.com/questions/1245869/allow-deny-image-hotlinking-with-htaccess – Greg 2010-10-21 17:56:08