• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Verzeichnisschutz per Captcha

Sarek

Neues Mitglied
Hallo zusammen,

ich möchte gerne den Zugang zu einem bestimmten Verzeichnis über ein Captcha-Verfahren schützen, um die darin enthaltenen Dateien (vor allem PDFs) dem Zugriff von Suchmaschinen-Bots und Adress-Grabbern zu entziehen.

Ich stelle mir das so vor, daß der Link, der bisher auf die Indexseite dieses Verzeichnisses führt, künftig auf eine Vorschaltseite mit der Captcha-Abfrage führt. Nach korrekter Eingabe des Captchas soll dann die eigentliche Indexseite aufgerufen werden. Von dort soll man dann alle Inhalte des Verzeichnisses abrufen können.

Leider habe ich absolut keine Ahnung von PHP - ich würde mich daher freuen, wenn jemand eine fertige Lösung und nicht nur Denkanstöße hat.


Herzlichen Dank im Voraus,
Sarek
 
Ich denke, dass htaccess sich da besser eignen würde.

Aber solltest du das Ganze doch per PHP lösen wollen, würde ich es folgendermaßen handhaben, sofern niemand widerspricht.
Die PDF-Dateien lädst du über dein PHP-Formular hoch; diese werden in der SQL-Datenbank gespeichert.
Die User, die die PDF-Dateien einsehen möchten, müssen Captcha eingeben, anschließend folgt eine if-Abfrage statt, woraufhin die PDF aus der Datenbank ausgelesen und zum Download (header) angeboten wird.
 
Ich würde per .htaccess-Datei und mod_rewrite alle Anfragen auf ein PHP-Script umleiten. Dieses Script managet die Abfrage des Captchas und gibt die Dateien dann aus. Der Dateiname etc. können aus der Server-Variablen 'request_uri' ausgelesen werden.

Ist jetzt möglicherweise 'ne Menge Input, aber wenn du dich nach o.g. Begriffen etwas umsiehst, wirst du dir vielleicht etwas basteln können.
 
Ich würde per .htaccess-Datei und mod_rewrite alle Anfragen auf ein PHP-Script umleiten.
Alle für dieses Verzeichnis? Oder alle für die ganze WebSite? Wenn letzteres, warum?
Ist jetzt möglicherweise 'ne Menge Input, aber wenn du dich nach o.g. Begriffen etwas umsiehst, wirst du dir vielleicht etwas basteln können.
Das glaube ich aber eher nicht ... ich sagte ja, ich habe von PHP keine Ahnung. Genaugenommen heißt das, ich kenne nicht mal die Syntax-Grundregeln von PHP.
 
Und was möchtest du nun konkret noch von uns?

Naja, am liebsten den fertigen Code dazu :)

Ich erwarte jetzt nicht, daß sich jemand die Arbeit macht, und das für mich programmiert. Aber vielleicht hat jemand sowas ja selbst im Einsatz und kann mir das einfach schicken. An meine WebSite angepaßt bekomme ich das dann schon irgendwie.
 
Mit htaccess kann ich aber ja nur feste Benutzername-Kennwort-Kombinationen festlegen und kein ständig wechselndes Captcha ... oder?

Du hast die Idee nicht weit genug mit gedacht. Es geht um folgenden Ablauf:

1) Nutzer klickt auf Link zu PDF.
2) Der erzeugte Request führt auf dem Server dazu, dass eine in einer htaccess-Datei hinterlegte mod_rewrite-Rule greift und den Request inkl. dem aufgerufenen Dateinamen an eine PHP-Datei, nennen wir sie "request.php", weiterleitet.
3) Die jetzt aufgerufene PHP-Datei gibt ein Formular mit dem Captcha aus.
4) Der Nutzer schickt das Formular mit korrektem Captcha-Code ab. Dadurch wird ein Request auf die PHP-Datei "request.php" erzeugt, welcher den Code prüft. Wenn alles ok ist, leitet die PHP-Datei den Nutzer an die ursprünglich aufgerufene Datei weiter.

Code-Schnippsel für alle 4 Schritte findet man eigentlich ganz fix.
zu 1) Dürfte klar sein, hast Du ja schon.
zu 2) Eine RewriteRule zur Weiterleitung:
Code:
RewriteRule /verzeichnisname/(.*) request.php?request=$1
zu 3) Captcha-Beispiel-Codes findet man überall im Netz, da muss man für diesen Fall nichts "besonderes" zaubern. Anzumerken ist lediglich, dass das Formular des Captcha-Codes hier um den Namen der Datei, die bezogen auf mein Beispiel unter 2) in der "request"-Variablen steht, ergänzt werden muss. Das ginge z.B. über ein input-hidden-Feld.
PHP:
<input type="hidden" name="request" value="<?php echo $_GET["request"]; ?>">
zu 4) Die Verarbeitung des Captcha-Codes ist ebenfalls an vielen Stellen im Netz zu finden. Hier musst Du dann nur noch eine Weiterleitung auf die angeforderte Datei bei erfolgreicher Eingabe ergänzen. Also:
PHP:
header("Location: /verzeichnisname/".$_REQUEST["request"]);

Allerdings würde ich auch erstmal dein Ziel hinterfragen bevor Du dir den (zugegeben geringen) Aufwand machst. Du willst verhindern, dass bestimmte Dateien von Bots eingelesen werden und so bei Suchmaschinen auftauchen? Das kann man viel einfacher über eine passende Angabe in der robots.txt erreichen, auf die alle großen Suchmaschinenanbieter hören. Die paar die es nicht tun sind für deine Ziele, wenn sie denn innerhalb Deutschlands oder Europas liegen, eher irrelevant.
 
Hallo threadi,

erst mal Danke für die konkrete Antwort. Der PHP-Part scheint auch schon zu funktionieren. Wenn die die request.php im Hauptverzeichnis direkt aufrufe, klappt es gut. Aber wenn ich eine Datei in dem geschützten Verzeichnis aufrufe, wird die sofort angezeigt. Ich gehe daher davon aus, daß mit der Rewrite-Regel in der .htaccess etwas nicht funktioniert.

Ich habe folgende .htaccess-Varianten ausprobiert:

Code:
SetEnv PHPRC /home/www/doc/8861/domäne/www/

RewriteEngine On
RewriteRule /aktuell2/(.*) request.php?request=$1

und

Code:
SetEnv PHPRC /home/www/doc/8861/domäne/www/

RewriteEngine On
RewriteRule /home/www/doc/8861/domäne/www/aktuell2/(.*) request.php?request=$1

(Die erste Zeile stand da bereits drin, die habe ich unverändert gelassen.)


P.S.: Ich habe es doch richtig verstanden, daß es sich um die .htaccess des übergeordneten Verzeichnisses handelt, die geändert werden muß, und daß in diesem übergeordneten Verzeichnis auch die request.php liegen muß?
 
Der zweite von dir gezeigte Code ist falsch. Eine RewriteRule nimmt immer nur die RequestURI als Basis, keinen lokalen Pfad.

Der erste Code sollte eigentlich klappen. Ist mod_rewrite auf deinem Hosting überhaupt aktiviert? Teste das mal mit einer ganz einfachen Weiterleitung:

Code:
RewriteEngine On
RewriteRule (.*) http://www.html.de

Dadurch sollte jeglicher Aufruf auf html.de weiterleiten. Wenn das nicht geht, dann musst Du mod_rewrite erst noch aktivieren.
 
Der erste Code sollte eigentlich klappen.

Tut er leider nicht :(

Noch mal zum P.S. meiner Frage zurück: Habe ich es richtig verstanden, daß es sich um die .htaccess des übergeordneten Verzeichnisses (in diesem Fall also des HTML-Hauptverzeichnisses) handelt, die geändert werden muß, und daß in diesem übergeordneten Verzeichnis auch die request.php liegen muß?


Ist mod_rewrite auf deinem Hosting überhaupt aktiviert?

Deinem Test nach zu urteilen: Ja!
 
Die htaccess und die PHP-Datei sollten in einem übergeordneten Verzeichnis liegen.

Tun sie. Ich habe jetzt folgende Verzeichnisstruktur:

/.htaccess
/request.php
/check.php
/captcha/captcha.php
/captcha/captcha.PNG
/captcha/XFILES.TTF
/aktuell2/index.htm


Die request.php sieht so aus:

Code:
<html>
<form name="form1" method="post" action="check.php">
<img src="http://www.html.de/captcha/captcha.php" border="0" title="Sicherheitscode">
<input type="text" name="sicherheitscode" size="5">
<input type="hidden" name="request" value="<?php echo $_GET["request"]; ?>">
<input type="submit" name="Submit" value="senden">
</form>
</html>

und die check.php so:

Code:
<?php
session_start();
if(isset($_SESSION['captcha_spam']) AND $_POST["sicherheitscode"] == $_SESSION['captcha_spam']){
unset($_SESSION['captcha_spam']);
header("Location: /aktuell2/".$_REQUEST["request"]);
}
?>


Mein Testaufruf lautet www.domäne.de/aktuell2 ... und ich lande ohne Captcha-Abfrage auf der index.htm im Verzeichnis aktuell2.

Rufe ich hingegen www.domäne.de/request.php auf, so lande ich erst nach korrekter Captcha-Eingabe dort. Das Captcha-System selbst funktioniert also.
 
Hallo threadi,

ich habe den Fehler jetzt selber gefunden. In Deinem "Codeschnippsel" für die .htaccess war ein Slash zu viel:

Code:
RewriteEngine On 
RewriteRule [COLOR=#ff0000]/[/COLOR]aktuell2/(.*) request.php?request=$1

Ohne den hier rot markierten Slash geht es ...
 
Was schonmal falsch ist, ist dein PHP Code:

Wenn du jetzt auf www.domäne.de/aktuell2 gehst (und das ModRewrite funktioniert), wirst du auf www.domäne.de/aktuell2/aktuell2 weitergeleitet, da RequestURI aktuell2 entspricht und hintendran gehängt wird.

Außerdem vermute ich einen Denkfehler bei threadi: Bei funktionierendem ModRewrite sollte man immer auf der Captcha Seite landen, da du ihm eine Endlosschleife vorgelegt hast. Denn das ModRewrite macht nach gültiger Captcha Eingabe nichts anderes, als die Weiterleitung wieder auf die Captcha Seite zu werfen, da wirklich alle Aufrufe auf die request.php weitergeleitet werden.

Was du also benötigst, wäre z.B. eine Subdomain, oder du müsstest die Domain nicht auf den Rootpfad leiten, sondern z.B. in den Pfad 'public'. Nach erfolgreicher Eingabe des Captcha Codes machst du keine Weiterleitung, sondern holst dir den Inhalt der Datei per file_get_contents('../private/' . $_REQUEST["request"]);

Ums nochmal zu verdeutlichen: Im Rootpfad hast du die Ordner public und private, alle Aufrufe der Domain gehen per DNS an public, per file_get_contents springst du in den Ordner private, in dem ALL deine Dateien liegen.

Verbessert mich, wenn ich jetzt irgendwie was durcheinandergebracht hab xD
 
Außerdem vermute ich einen Denkfehler bei threadi: Bei funktionierendem ModRewrite sollte man immer auf der Captcha Seite landen, da du ihm eine Endlosschleife vorgelegt hast.

So ist es leider :( Ich habe mich zu früh gefreut, denn durch Weglassung des einen Slash funktionierte zwar das Rewrite, aber wie Du schon sagst, lande ich auch bei korrekter Captch-Eingabe wieder bei der Captcha-Abfrage :(

Was du also benötigst, wäre z.B. eine Subdomain, oder du müsstest die Domain nicht auf den Rootpfad leiten, sondern z.B. in den Pfad 'public'. Nach erfolgreicher Eingabe des Captcha Codes machst du keine Weiterleitung, sondern holst dir den Inhalt der Datei per file_get_contents('../private/' . $_REQUEST["request"]);

Arghhh ... geht es nicht einfacher? Da müßte ich ja die gesamte WebSite umstrukurieren. Ich will doch nur einen Unterordner der Site schützen - und das möglichst auch, ohne die gesamte Verzeichnisstruktur zu ändern, denn dann müßte ich ja bei allen Dateien die relativen Verweise, die aus dem Ordner heraus auf andere Ordner verweisen, ändern. Oder habe ich da jetzt was falsch verstanden? Wie sähe denn die Verzeichnisstruktur dann aus?
 
Arghhh ... geht es nicht einfacher? Da müßte ich ja die gesamte WebSite umstrukurieren. Ich will doch nur einen Unterordner der Site schützen - und das möglichst auch, ohne die gesamte Verzeichnisstruktur zu ändern, denn dann müßte ich ja bei allen Dateien die relativen Verweise, die aus dem Ordner heraus auf andere Ordner verweisen, ändern. Oder habe ich da jetzt was falsch verstanden? Wie sähe denn die Verzeichnisstruktur dann aus?

OK, nehmen wir an, du willst den Ordner /aktuell2/ schützen:
In dem realen Ordner /aktuell2/ befindet sich nichts außer die .htaccess-Datei und die request.php, der eigentliche (gedachte) Ordner /aktuell2/ heißt in Wirklichkeit jedoch /aktuell2_files/ und liegt, wie /aktuell2/, im Rootverzeichnis. Jetzt holst du in der request.php per file_get_contents('../aktuell2_files/' . $_REQUEST["request"]) die Files.

Allerdings musst du die Rechte für den Ordner /aktuell2_files/ anpassen, damit niemand die Captcha-Prüfung umgehen kann ;)
 
OK, nehmen wir an, du willst den Ordner /aktuell2/ schützen:
In dem realen Ordner /aktuell2/ befindet sich nichts außer die .htaccess-Datei und die request.php,

Hm, bei mir ist die Struktur etwas anders, ich habe eine "request.php" und eine "check.php", die den eingegebenen Captcha-Code überprüft. Kann sein, daß man beides in einer Datei machen kann, aber da ich mich wie gesagt mit PHP rein gar nicht auskenne, muß ich im Prinzip mit den Vorlagen arbeiten, die ich im Web finde und kann nur Kleinigkeiten anpassen.

So, langer Rede kurzer Sinn: Wenn ich die "check.php" in das Verzeichnis "aktuell2" packe, dann kann die "request.php" nicht mehr darauf zugreifen, da das Verzeichnis ja geschützt ist, und Zugriffe (auch der auf die "check.php") wiederum auf die "request.php" umgeleitet werden. Das heißt, dann habe ich wieder eine Endlosschleife.

Ich habe nun also sowohl die "request.php" als auch die "check.php" auf der Hauptebene liegen:

REQUEST.PHP
Code:
<html>
Aus Datenschutzgründen sind wir angehalten, den Zugang zu diesen Daten zu erschweren, um den Zugriff durch Suchmaschinen und Spam-Bots zu vermeiden.
<br><br>
<form name="form1" method="post" action="/check.php">
<img src="/captcha/captcha.php" border="0" title="Sicherheitscode">
<br><br>
Bitte hier den Code aus dem Feld eintragen: <input type="text" name="sicherheitscode" size="5">
<br>
(Groß- und Kleinschreibung bitte beachten)
<input type="hidden" name="request" value="<?php echo $_GET["request"]; ?>">
<br><br>
<input type="submit" name="Submit" value="Weiter">
</form>
</html>

CHECK.PHP
Code:
<?php
session_start();
if(isset($_SESSION['captcha_spam']) AND $_POST["sicherheitscode"] == $_SESSION['captcha_spam']){
unset($_SESSION['captcha_spam']);
echo file_get_contents('aktuell2_140581/' . $_REQUEST["request"]);
}
else{
header("Location: request.php");
}
?>

Jetzt holst du in der request.php per file_get_contents('../aktuell2_files/' . $_REQUEST["request"]) die Files.

Im Prinzip funktioniert das. Aber die Links funktionieren nicht, da die "request.php", in den die Seite "reingeladen" wird, sich ja im Root-Verzeichnis befindet und nicht im Verzeichnis "aktuell2_140581", damit führen die (relativen) Links ins Leere ...
 
Im Prinzip funktioniert das. Aber die Links funktionieren nicht, da die "request.php", in den die Seite "reingeladen" wird, sich ja im Root-Verzeichnis befindet und nicht im Verzeichnis "aktuell2_140581", damit führen die (relativen) Links ins Leere ...

Was meinst du mit "die (relativen) Links"? Meinst du die Verlinkung innerhalb einer Datei innerhalb des geschützten Ordners? Oder was? Bitte ein Beispiel ^^
 
Was meinst du mit "die (relativen) Links"? Meinst du die Verlinkung innerhalb einer Datei innerhalb des geschützten Ordners? Oder was? Bitte ein Beispiel ^^

Alles ... seien es Zielverweise für einen FrameSet, seien es eingebundene Graphiken oder eben Links zu anderen Seiten der WebSite.

Ein Beispiel

Die "index.htm" des geschützten Verzeichnisses (bzw. jetzt natürlich des Verzeichnisses "aktuell2_140581") enthält die Zeile <img src="logo.jpg">. Die Graphik wird also im gleichen Verzeichnis erwartet, in dem sich die index.htm selbst befindet.

Nun wird der Inhalt der "index.htm" allerdings mit file_get_contents in die "check.php" eingelesen. Die "check.php" befindet sich aber auf der Root-Ebene, also wird nun die "logo.jpg" auch auf der Root-Ebene gesucht. Sie befindet sich aber im Verzeichnis "aktuell2_140581" und wird daher nicht gefunden :-(
 
Zurück
Oben