2010-10-21 7 views
14

Ich möchte eine Website mit vielen Bildern erstellen. Aber ich möchte vor direktem Zugriff auf Bilder schützen, z.B. direkte Links zu Bildern ohne den Besuch der Website.Wie kann ich vor direktem Zugriff auf Bilder schützen?

Was ist der bevorzugte Weg, dies zu tun? Und was sind die Alternativen mit Vor- und Nachteilen?

Ich habe einige Ideen (ich weiß nicht, ob sie möglich sind):

  • Dateiberechtigungen
  • PHP Sessions
  • Temporäre Dateinamen oder URLs
  • HTTP-Umleitung?

Vielleicht ist dies nicht auf vielen Websites praktiziert? Z.B. Ich habe versucht, auf ein privates Foto auf Facebook zuzugreifen, ohne angemeldet zu sein, aber ich konnte das Foto noch besuchen.

Die Plattform wird wahrscheinlich ein Ubuntu-Rechner mit NginX und PHP sein.

+0

Sie können auf das "private" Foto auf Facebook zugreifen, da Sie den direkten Bildlink anstelle der Fotoseite verwendet haben. – drudge

+0

@jnpcl: Ja, das möchte ich auf meiner Seite verhindern. Die Frage ist, wie es geht? – Jonas

+0

Versuchen Sie, Hotlinking oder etwas mehr zu verhindern? http://StackOverflow.com/Questions/1245869/allow-deny-image-hotlinking-with-htaccess – Greg

Antwort

20

http://us3.php.net/image

Sie verbinden das img-Element auf eine PHP-Datei. Diese Datei prüft, ob der Benutzer die richtige Berechtigung hat, und sendet eine IMG-Antwort zurück.

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

Noch jemand mit der Erlaubnis kann das Bild herunterladen und auf andere Menschen irgendwo bieten andere (Webspace/mail/was auch immer). Um es ein wenig schwerer zu machen, es zu stehlen, können Sie mit der rechten Maustaste auf das Bild deaktivieren, aber ein Benutzer, der ein wenig über http weiß, sollte keine Probleme haben, es zu stehlen. Sie können eine Signatur über das Bild platzieren (z. B. das Logo/den Namen Ihrer Website), damit die Benutzer sehen können, wo Sie die Quelle haben. Dies kann auch mit PHP geschehen.

Wenn Sie funy Sie Setup ein anderes Bild kann sein (Porno ist für diese: P), die, wenn der Link von einer anderen Seite kommt gesendet wird: P

+3

Ich habe diese Methode auf meiner Website verwendet, aber wenn viele Fotos auf der Seite sind, ist die Zeit zum Anzeigen der Seite sehr lang (jedes Foto hat eine Zugriffsüberprüfung und eine Serveranfrage ...). Hat jemand eine Vorstellung davon, was getan werden könnte, um dieses Problem zu lösen? –

+0

Das gleiche Problem hier. Es lädt sehr langsam und ich kann nicht mit Lazy arbeiten. Gibt es eine andere Art und Weise? – desmeit

1

Das wird schwer zu tun . Damit die Webbrowser Ihrer Kunden auf die Bilder zugreifen können, müssen sie lesbar sein. Dateiberechtigungen funktionieren nicht, da Sie Zugriff auf den Browser gewähren müssen. Sie werden nicht in der Lage sein, jemanden davon abzuhalten, sie herunterzuladen und etwas mit ihnen zu tun.

Wenn Sie nur die direkte Verknüpfung beenden möchten, wenn Sie die Dateinamen regelmäßig ändern und Ihre Seiten entsprechend aktualisieren, werden auf anderen Seiten die Verknüpfungen unterbrochen.

+0

Guter Punkt Ändern der Dateinamen, nie darüber nachgedacht. Sicher, es leugnet nicht das Herunterladen oder den Zugriff mindestens einmal (Brute-Force), sondern mischt zumindest die Karten, die bösartige Fortschritte abwischen. – TechNyquist

3

Dies könnte nützlich sein: Allow/deny image hotlinking with .htaccess

Edit: Eine Sache, über diese Methode zu beachten ist, dass einige Browser/AV/Firewall-Software Referrer-Daten entfernt, wenn Sie sehen, was möglicherweise legitime Benutzer verursachen würde als Hotlinkers behandelt werden .

Wenn Ihre Site bereits eine Art von Authentifizierungs- oder Session-System verwendet, dann ist es besser, die in @Mark Baijens 'Antwort angegebene Methode zu verwenden.

Update: Nginx Rewrite-Regel verhindern hotlinking:

+0

Danke, aber ich kann diese Methode nicht verwenden, da ich NingX als Webserver benutze und keine '.htaccess' Dateien habe. – Jonas

+0

Mit einigen Optimierungen ist es [möglich] (http://wiki.ninx.org/NginxHttpRewriteModule). – drudge

+0

Danke, ich werde mir diese Lösung anschauen. – Jonas

2

Sie ein PHP-Skript verwenden, könnten die Bilder mit so etwas wie abzurufen:

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

und haben die PHP-Skript Geben Sie die Bilddaten erst zurück, nachdem Sie bestätigt haben, dass die Domäne des HTTP_REFERER Ihren Anforderungen entspricht.

Wenn Sie eine kontoorientierte Website haben, schlage ich vor, PHP-Sitzungen wie angegeben zu verwenden und das PHP-Skript die Sitzung überprüfen zu lassen, bevor die Bilddaten zurückgegeben werden.

4

eine einfache .htacess Datei in Ihrer Website Ordner mit den follwoing Linien

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] 

Hinweis hinzufügen Ich habe js und css Datei auch dann, wenn ich denke, es bizzare ist, jemanden zu finden, der sie zu kratzen versucht.

2

Ich benutze beide Methoden - Überprüfung Benutzer Gent und und Referrer. Benutzeragent Ich überprüfe bei .htaccess. Und Referrer-Check bei PHP-Datei. Sie können ihn unter http://coloring-4kids.com

sehen hier mein Code:

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

Sie dynamisch einen Ordner mit htaccess und die Benutzer-IP schützen.

hinzufügen .htaccess-Datei, um Ihre Bilder mit den folgenden Zeilen Ordner:

order deny,allow 
 
deny from all

Dann PHP verwenden die Benutzer ip in die .htaccess-Datei einfügen, wenn sie wie folgt anmelden:

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

Der Ordner wird von einer beliebigen IP blockiert werden, die nicht angemeldet ist.

Beachten Sie, dass ich überprüft habe, ob die IP gültig ist. Es ist wichtig, dass Sie dem Benutzer keine Möglichkeit geben, eigenen Code in Ihre htaccess-Datei zu injizieren.

Beachten Sie auch, dass ich die Benutzer-ID in einen Kommentar auf der rechten Seite der IP in der htaccess-Datei setzen. Wenn sich der Benutzer abmeldet, können Sie die Datei htaccess durchsuchen und die IP des Benutzers entfernen.

Sie können dies bei jeder Anforderung aktualisieren, um zu verhindern, dass Benutzer, die dynamische ips verwenden, abgemeldet werden.

Ich benutze diese Methode mit meinen gesamten Mitgliederbereichen, es ist eine ausgezeichnete zusätzliche Sicherheitsebene. Stellen Sie nur sicher, dass Sie Ihre Anmeldeskripts außerhalb des Mitgliederordners speichern.

0

Fügen Sie die Ablehnungsregel in Ihrem hinzu.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]