2010-10-21 9 views
14

Tôi muốn tạo một trang web có nhiều hình ảnh. Nhưng tôi muốn bảo vệ chống lại truy cập trực tiếp vào hình ảnh, ví dụ: liên kết trực tiếp tới hình ảnh mà không cần truy cập trang web.Làm thế nào để bảo vệ chống lại truy cập trực tiếp vào hình ảnh?

Cách ưa thích để làm điều này là gì? Và các lựa chọn thay thế với Ưu và nhược điểm là gì?

Tôi có một số ý tưởng (Tôi không biết nếu họ có thể):

  • tập tin cho phép
  • PHP Sessions
  • tên tập tin tạm thời hoặc URL
  • HTTP Redirection?

Có thể điều này không được thực hiện trên nhiều trang web? Ví dụ. Tôi đã cố gắng truy cập một bức ảnh riêng tư trên Facebook mà không cần đăng nhập, nhưng tôi vẫn có thể truy cập ảnh.

Nền tảng này có lẽ sẽ là một máy Ubuntu với NginX và PHP.

+0

Bạn có thể truy cập ảnh "riêng tư" trên Facebook vì bạn đang sử dụng liên kết hình ảnh trực tiếp, thay vì trang ảnh. – drudge

+0

@jnpcl: Vâng, đó là những gì tôi muốn ngăn chặn trên trang web của mình. Câu hỏi đặt ra là làm thế nào để làm điều đó? – Jonas

+0

Bạn đang cố gắng ngăn chặn việc liên kết nóng, hoặc một cái gì đó khác? http://stackoverflow.com/questions/1245869/allow-deny-image-hotlinking-with-htaccess – Greg

Trả lời

20

http://us3.php.net/image

Bạn liên kết phần tử img với tệp php. Tệp này sẽ kiểm tra xem người dùng có quyền phù hợp hay không, nếu có thì nó có thể gửi phản hồi img.

<img src="url/LoadImg.php?id=1337" alt="" /> 

Vẫn ai đó có quyền tải xuống hình ảnh và cung cấp cho người khác ở nơi khác (webspace/mail/bất kỳ). Để làm cho nó một chút khó khăn hơn để ăn cắp nó, bạn có thể vô hiệu hóa kích chuột phải vào hình ảnh, nhưng vẫn còn một người dùng biết một chút về http nên không có bất kỳ vấn đề để ăn cắp nó. Bạn có thể đặt chữ ký trên hình ảnh (ví dụ: logo/tên trang web của bạn) để mọi người có thể thấy bạn ở đâu nguồn. Điều này có thể được thực hiện với php là tốt.

Nếu bạn muốn trở thành funy bạn có thể thiết lập một hình ảnh khác (porn là rất tốt cho việc này: P) được gửi nếu liên kết đến từ một trang khác: P

+3

Tôi đã sử dụng phương pháp này trên trang web của mình nhưng khi có nhiều ảnh trên trang, thời gian hiển thị trang thực sự dài (mỗi ảnh có kiểm tra truy cập và yêu cầu máy chủ ...). Có ai có ý tưởng về những gì có thể được thực hiện để giảm bớt vấn đề đó không? –

+0

Cùng một vấn đề ở đây. Nó tải rất chậm và tôi không thể làm việc với Lazy. Có cách nào khác không? – desmeit

1

này sẽ khó có thể làm . Để trình duyệt web của khách hàng của bạn truy cập vào hình ảnh, họ cần phải đọc được. Quyền đối với tệp sẽ không hoạt động vì bạn cần cấp quyền truy cập cho trình duyệt. Bạn sẽ không thể ngăn ai đó tải xuống và làm điều gì đó với họ.

Nếu bạn chỉ muốn ngừng liên kết trực tiếp, nếu bạn thay đổi tên tệp một cách thường xuyên và cập nhật các trang của bạn để phản ánh điều này, các trang khác sẽ bị hỏng liên kết.

+0

Điểm tốt thay đổi tên tập tin, không bao giờ nghĩ về điều đó. Chắc chắn nó không từ chối tải xuống hoặc truy cập ít nhất một lần (brute-force), nhưng ít nhất là xáo trộn các thẻ xóa các tiến trình độc hại. – TechNyquist

3

Điều này có thể hữu ích: Allow/deny image hotlinking with .htaccess

Edit: Một điều cần lưu ý về phương pháp này là một số trình duyệt/AV/phần mềm Firewall loại bỏ dữ liệu Referer khi bạn duyệt, trong đó sẽ gây ra người dùng có khả năng hợp pháp để được đối xử như hotlinkers .

Nếu trang web của bạn đã sử dụng một số loại xác thực hoặc hệ thống phiên, thì tốt hơn nên sử dụng phương pháp được đưa ra trong câu trả lời @Mark Baijens '.

Cập nhật: Quy tắc viết lại nginx để ngăn chặn hotlinking:

+0

Cảm ơn, tuy nhiên tôi không thể sử dụng phương pháp đó vì tôi đang sử dụng NingX làm máy chủ web và không có bất kỳ tệp '.htaccess' nào. – Jonas

+0

Với một số tinh chỉnh, có thể (http://wiki.nginx.org/NginxHttpRewriteModule). – drudge

+0

Cảm ơn, tôi sẽ xem xét giải pháp đó. – Jonas

2

Bạn có thể sử dụng một kịch bản PHP để lấy những hình ảnh sử dụng một cái gì đó như:

<img src="mysite.com/getimage.php?id=001" />

và có kịch bản PHP chỉ trả lại dữ liệu hình ảnh sau khi xác nhận rằng miền của HTTP_REFERER là của bạn.

Nếu bạn có trang web hướng tài khoản, tôi khuyên bạn nên sử dụng các phiên PHP như bạn đã nêu và yêu cầu tập lệnh PHP xác minh phiên trước khi trả lại dữ liệu hình ảnh.

4

Thêm một .htacess tập tin đơn giản trong thư mục trang web của bạn với các dòng 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] 

Note Tôi cũng đã thêm jscss tập tin ngay cả khi tôi nghĩ rằng nó là bizzare để tìm một ai đó cố gắng để cạo chúng.

2

Tôi sử dụng cả hai phương pháp - kiểm tra người dùng gent và và liên kết giới thiệu. Tác nhân người dùng tôi kiểm tra tại .htaccess. Và kiểm tra liên kết giới thiệu tại tệp php. Bạn có thể thấy nó ở http://coloring-4kids.com

Đây là mã của tôi:

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); 

?> 
4

Bạn có thể tự động bảo vệ thư mục sử dụng htaccess và những người sử dụng ip.

Thêm một tập tin .htaccess vào thư mục hình ảnh của bạn với các dòng sau:

order deny,allow 
 
deny from all

Sau đó sử dụng PHP để chèn những người sử dụng ip vào file .htaccess khi họ đăng nhập như thế này:

<? 
 
$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); 
 
?>

Thư mục sẽ bị chặn từ bất kỳ ip nào chưa đăng nhập.

Lưu ý rằng tôi đã kiểm tra xem ip có hợp lệ hay không. Điều quan trọng là bạn cung cấp cho người dùng không có cách nào để tiêm mã riêng của họ vào tệp htaccess của bạn.

Cũng lưu ý rằng tôi đặt id người dùng trong nhận xét ở bên phải của ip trong tệp htaccess. Khi người dùng đăng xuất, bạn có thể tìm kiếm tệp htaccess và xóa ip của người dùng.

Bạn có thể cập nhật điều này theo mọi yêu cầu để ngăn người dùng đang sử dụng ips động khỏi bị khởi động.

Tôi sử dụng phương pháp này với toàn bộ khu vực thành viên của mình, đây là lớp bảo mật bổ sung tuyệt vời. Chỉ cần chắc chắn rằng bạn đặt đăng nhập của bạn trong kịch bản bên ngoài thư mục thành viên.

0

Thêm quy tắc từ chối trong của bạn.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]