2010-11-18 15 views
0

Ich habe eine PHP-Seite namens test.php auf dem verlinke ich auf ein dynamisches Bild genannt image.php wie folgt:blockieren Direkter Zugriff auf dynamische PHP-Bild

echo "<img src=\"image.php?ID=abc&X=123\" align=\"absmiddle\" style=\"margin:5px;\"><br>"; 

Die Bilddatei ID und X als GET-Parameter übernimmt, und verwendet sie zu include ein vorhandenes statisches Bild von meinem Server. Es wird eine Kopfzeile gesendet, die den Server anweist, die Datei als JPEG zu interpretieren.

Ich möchte verhindern, dass Benutzer das Bild unter http://mydomain.com/image.php?ID=/abc&X=123 besuchen können, während das Bild in test.php und anderen Seiten auf meinem Server angezeigt werden kann. Wie erreiche ich das?

Bisher habe ich viele Arten von .htaccess Mods und Neuschreiben versucht, von denen die am nächsten in Bezug auf meine Anliegen ist the one shown on this page. Nichts hat funktioniert; bitte hilfe!

+0

Vielen Dank für Ihre Eingabe. Während Ihre Antworten mich in die richtige Richtung bringen, ist die Lösung auf dieser Seite genau das, was ich brauchte: http://bit.ly/fN2RSN – mukduk

Antwort

2

Es ist nicht möglich, denn was Ihr Browser tut, um das Bild anzuzeigen ist Direktzugriff.

Es wird eine Menge Ratschläge sein, über HTTP_REFERER Analyse, aber es wird eine schlechte Entscheidungen, da dieser Header optional ist und in mehreren Umständen kann es durch eine Firewall abgesägt werden, Antivirus, Proxy etc.

+0

Ich fand die Lösung dieser Seite ziemlich effektiv: http://bit.ly/fN2RSN – mukduk

+0

@ Romanusfatuus: Es löst nicht die Probleme, die ich in meiner Antwort beschrieben habe. Nichts interessantes dort. Das Beste, was Sie tun können, ist nur zu überprüfen (in .htaccess, natürlich, ** nicht in PHP **) entweder Referer existiert und gleich der aktuellen Domain oder gar nicht existiert. Das ist der gute Kompromiss, denke ich. – zerkms

+0

Vielen Dank! Ich werde diese Maßnahme übernehmen. – mukduk

0

I) Verwenden Sitzungen:

test.php:

<?php 
session_start(); 
//.... 
$_SESSION["allow_images"]="yes"; 
echo "<img src=\"image.php?ID=abc&X=123\" align=\"absmiddle\" style=\"margin:5px;\"><br>"; 
?> 

image.php:

<?php 
session_start(); 

if(isset($_SESSION["allow_images"]) { 
    // render image 
    unset($_SESSION["allow_images"]); 
} else { 
    // throw error/ show dummy image /etc 
} 
?> 

II) Zweite Lösung (nicht narrensicher):

Innen image.php

$ref=$_SERVER["HTTP_REFERER"]; 
if($ref == "http://yoursite.com/path/test.php") { 
    // get image parameters and render image 
} else { 
    // throw error or maybe render a dummy image with just few bytes 
}; 

Beachten Sie, dass HTTP_REFERER leicht gefälscht werden können.


Frühere Falsche Lösung:

Verwenden Variablen in test.php

$allow_image="yes"; 
echo "<img src=\"image.php?ID=abc&X=123\" align=\"absmiddle\" style=\"margin:5px;\"><br>"; 

Und Test für isset ($ allow_images) in image.php vor dem Rendern. Hätte nur funktioniert, wenn image.php enthalten wäre, wie romanusfatuus darauf hingewiesen hat.

+0

Das würde nur funktionieren, wenn ich das Bild in 'test.php' einbinden würde, um ihm Zugriff auf den enthaltenen Code zu geben. Soweit ich das beurteilen kann, kann 'image.php' die Existenz von' $ allow_image_access' leider nicht sehen oder überhaupt feststellen, wie ich es referenzieren möchte. – mukduk

+0

Sorry, die Variablen funktionieren nur, wenn Sie die Datei "einschließen". Aber etwas in dieser Richtung sollte funktionieren. –

+0

Wahr. HTTP_REFERER ist ein anderer Weg, obwohl das nicht narrensicher ist. –

Verwandte Themen