我希望用戶看到圖像作爲網頁的一部分但我想避免他們直接訪問圖像。這可以說,在URL中提供了關於他們鏈接到的用戶的線索(我在一個Facebook應用程序中看到的一個缺陷)。監視圖像訪問和/或阻止直接訪問
我該如何去監控圖像訪問和/或防止直接訪問圖像(通過url重寫,例如...)?
解決方案提出至今:
- 使用頭(可靠?)
- 進行訪問圖像更加困難(例如:一套圖像作爲背景的div)。
- ...
我希望用戶看到圖像作爲網頁的一部分但我想避免他們直接訪問圖像。這可以說,在URL中提供了關於他們鏈接到的用戶的線索(我在一個Facebook應用程序中看到的一個缺陷)。監視圖像訪問和/或阻止直接訪問
我該如何去監控圖像訪問和/或防止直接訪問圖像(通過url重寫,例如...)?
解決方案提出至今:
沒有防彈的方法。但是,您可以使用啓發式。檢查以下標題:
Referer
- 此標頭將存在是由瀏覽器作爲<img>
標籤或CSS的結果所要求的圖像。如果直接請求圖片(通過在地址欄中輸入網址),此標題將爲空。如果此標題包含另一個域名,那麼該另一個網站將您的圖片熱鏈接起來。 請注意,這是預期的行爲,但不能保證每個瀏覽器都會以這種方式行事。
Accept
- 這頭將包含一個字符串,如image/*
當請求圖像,因爲瀏覽器發現它嵌入在HTML標記或CSS。當有人通過在瀏覽器中輸入直接請求圖片時,您會發現諸如text/html,application/xhtml+xml
等的值。這是因爲瀏覽器在請求時不知道該期待什麼http://website.com/someimage.jpg;因此它最好要求text/html
內容。
在Apache中,您可以檢查(並匹配)HTTP頭以確定內容是否可訪問。我不確定其他平臺,但您可以編寫通用代理腳本來提供圖像。
如果圖像URL表明你不想披露的信息,您可以通過使用哈希值或加密混淆了。因此,而不是服務內容,如:
<img src="/images/users/12345.jpg">
你會寫:
<img src="/images/users/image.php?hash=<?php echo md5('secret' . '12345'); ?>">
你需要編寫發送相應的圖像瀏覽器的腳本。
downvote的原因? –
'因爲瀏覽器不知道什麼時候它會要求http:// website.com/someimage.jpg' - 大聲笑,哪個瀏覽器是如此愚蠢的不讀取URL中的'.jpg'?而你的第一個關於引用鏈接的「規則」是完全錯誤的。推薦人可以是空的或可以包含另一個域...只是因爲(你可以檢查它)。這個頭的行爲是非常不可預測的。 –
@SalmanA:當你右擊並點擊「顯示圖像」時,它也會「發送」引用者 – genesis
如果可以的話,那再一次不是防彈的,但招數很多的是用圖像作爲背景。在你的HTML中放置一個圖像標籤,填充一個特殊的透明1px乘1px gif(blank.gif大約爲html表格佈局),並將其大小設置爲實際圖像的尺寸。然後將其背景圖像設置爲實際圖像。這將欺騙許多隻知道如何右鍵點擊下載/獲取圖像URL的用戶。
<html>
<head>
<style>
#logo { background: url(my-logo.png); width: 100px; height: 50px; } /* Change this to match your image name and dimensions */
</style>
</head>
<body>
<img src="blank.gif" id="logo">
</body>
</html>
我知道這不會幫助,如果用戶打印屏幕(但也不會任何方法),但它是爲那些懂行的少用戶的解決方案。另外,像Youtube這樣的網站已經採用了這種方法,所以如果它足夠Google的話,我會說這對你或我來說已經足夠了!
編輯:請原諒我完全沒有意識到這已被張貼爲評論。在我發佈之前,我開始寫作。
至於說,沒有這樣做銀彈(你不能阻止用戶進行例如屏幕截圖)
但是,如果你想保護你的照片對匿名訪問,你可以使用一個PHP的「代理」,將檢查用戶是否被允許看到該圖片,然後加載它。
這是一個非常簡單的代碼示例代碼。 如果您確實想保護您的圖片,請將它們存儲在文檔根目錄之外。
<?php
//Sample image protection proxy. Do not use as is.
//Let's monitor the authorized accesses
session_start();
$mon = isset($_SESSION['mon']) ? $_SESSION['mon'] : 0;
//Let's simulate an auth mecanism
$allowed = isset($_GET['allowed']) ? (int)$_GET['allowed'] : 0;
if ($allowed === 1) {
// DO NOT USE AS IS ! add security checks to prevent XSS, especially if images are uploaded by untrusted users
$img = file_get_contents('img.png');
$mon++;
$_SESSION['mon'] = $mon;
header('content-type:image/png');
echo $img;
} else {
//handle unauthorized access here.
//For this example, I send some plain text
header('content-type:text/plain');
echo 'You are not allowed to see that picture.'.PHP_EOL;
echo 'This picture has been opened : '.$mon. ' times.';
}
?>
如果你想測試這個腳本:
希望有幫助!
這裏有一個想法,可能工作,但我沒有真正想通了太多,還沒有嘗試過:
例如,而不是:
<img src="www.mysite.com/mypage/myimage.jpg">
...生成的一次性密鑰和存儲在一個查找表,以便它指的是你的形象:
4e33fd162fe95 => image.jpg
...然後使用生成的頁面,而不是OTK:
<img src="www.mysite.com/mypage?image=4e33fd162fe95">
當服務器收到對該圖像的請求時,發送圖像並刪除OTK。這意味着每個頁面請求都會生成一個新的OTK。試圖再次使用該URI的圖像將無法正常工作。
這在性能方面有一些明顯的警告,因爲客戶端緩存將不再起作用,並且會在服務器上產生一些開銷。也可能有其他警告。
您可以檢查引用者標題;如果圖片是從您的網站加載的,則引薦來源應該是您網域上的網址。雖然這並非萬無一失,但某些廣告攔截/隱私軟件和代理服務器會剝離引薦標頭,使其看起來像直接訪問,而不是。 –
使圖像成爲div的背景 - 用戶獲得直接鏈接(但可能)會更困難。 –
檢查引薦來源的方法是錯誤的。推薦人可以是空的,甚至可能是錯誤的(前一頁的網址,不是最新的)。 –