tag:forum.selfhtml.org,2005:/self PHP Probleme nach erstmaliger Servereinrichtung – SELFHTML-Forum 2006-10-03T07:08:38Z https://forum.selfhtml.org/self/2006/sep/29/php-probleme-nach-erstmaliger-servereinrichtung/1028176#m1028176 zwerg http://zwergenspiegel.de 2006-09-29T14:14:16Z 2006-09-29T14:14:16Z PHP Probleme nach erstmaliger Servereinrichtung <p>Glück auf!</p> <p>Ich bin heute mit meiner Homepage online gegangen.<br> <a href="http://zwergenspiegel.de/Hauptseiten/home.php" rel="nofollow noopener noreferrer">Meine Seite</a></p> <p>Wie soll es anders sein: Vieles, was ich lokal mit Xampp getestet<br> habe, will nicht mehr funktionieren :(</p> <p>Während ich die Datenbankanbindung noch selbst hingekriegt habe,<br> hoffe ich bei folgenden Dingen auf eure Hilfe:</p> <p>1)<a href="http://zwergenspiegel.de/index.php" rel="nofollow noopener noreferrer">Vorschaltseite</a><br> Hier will der Grafikcounter einfach nicht funktionieren. Die erscheinende Fehlermeldung kann ich leider nicht interpretieren.<br> Ich vermute, dass es daran liegt, dass auf dem Server die Textdatei<br> nicht angelegt werden kann, wobei ich nicht weiß, warum.<br> Weiß hier jmd. Rat?</p> <p>Ich weiß, dass viele nichts von diesen Vorschaltseiten halten,<br> aber ich würde die (vorerst) gerne bestehen lassen, bis ich<br> den Besucherzähler um das Anlegen von Cookies erweitert habe<br> und auf die Home-Seite einbauen kann.</p> <ol start="2"> <li><a href="http://zwergenspiegel.de/Galerien/thumbs_a.php?t=7.%20Bierspieltag&o=Galerie_31" rel="nofollow noopener noreferrer">Fotovorschau</a><br> Die Vorschaubilder lese ich wie folgt aus:</li> </ol> <p>Head:</p> <p><?php<br> // Hier wird der Titel automatisch über "GET" von "fotos.php" übergeben<br> $titel = $_GET['t'];<br> // Hier wird der Galerie-Ordner automatisch über "GET" von "fotos.php" übergeben<br> $ordner = $_GET['o'];<br> // Hier wird ein Array (Variable "galerie") angelegt<br> $galerie = array();<br> //Ordner öffnen<br> $dir = opendir ("../Bilder/Fotos/Web_klein/$ordner");<br> //Datei lesen ohne die Verzeichnisse darüber<br> while ($bild = readdir ($dir)){<br>  if ($bild != "." && $bild != ".." && $bild != "Thumbs.db")<br>  array_push($galerie,$bild);<br> }<br> closedir($dir);<br> //Zählen der Einträge in $galerie für das spätere festlegen des Endpunktes für die for-Schleife im body<br> $x = count($galerie);</p> <p>?></p> <p>Body (für die ersten 5 Bilder, folgende ähnlich):</p> <p><?php<br> // Bestimmen des Startpunktes und des Endpunktes der for-Schleife (Bild 1-5)<br> for ($i = 0; $i < 5 and $i < $x; $i++){<br> echo "<a href="vorschau.php?t=" . $titel .  "&o=" . $ordner . "&bn=" . $galerie[$i] . ""><img src="../Bilder/Fotos/Web_klein/" . $ordner . "/" . $galerie[$i] . "" style=" border-width: 3px; border-color: #FFFFFF; "/></a>&nbsp;";<br> }<br> ?></p> <p>Während er lokal und bei allen anderen Fotoalben die Bilder sortiert nach Dateinamen (001.jpg, 002.jpg, ..., 200.jpg) wiedergibt, macht er das bei dem oben verlinkten Album nicht. Weiß jmd. wieso und sagt es mir?<br> Kann ich hier mit einer Sortierung beim Auslesen Abhilfe schaffen?</p> <p>Das war es erstmal, ich hoffe ich habe nicht wesentliche Angaben<br> vergessen oder übermäßig viele unwesentliche gemacht.</p> <p>Beste Grüße</p> <p>zwerg Alex</p> <p>P.S.<br> Sowohl lokal als auch auf dem Server nutze ich PHP5</p> https://forum.selfhtml.org/self/2006/sep/29/php-probleme-nach-erstmaliger-servereinrichtung/1028179#m1028179 dedlfix 2006-09-29T15:23:54Z 2006-09-29T15:23:54Z PHP Probleme nach erstmaliger Servereinrichtung <p>echo $begrüßung;</p> <blockquote> <p>1)<a href="http://zwergenspiegel.de/index.php" rel="nofollow noopener noreferrer">Vorschaltseite</a><br> Hier will der Grafikcounter einfach nicht funktionieren. Die erscheinende Fehlermeldung kann ich leider nicht interpretieren.</p> </blockquote> <p>Warning: fopen(Counter/counter.txt) [function.fopen]: failed to open stream: Permission denied in /[...]/grafikcounter.php on line 21</p> <p>Der Rest sind Folgefehler. Die Meldung sagt aus, dass die Datei nicht geöffnet werden konnte, weil eine Berechtigung dazu fehlt.</p> <blockquote> <p>Ich vermute, dass es daran liegt, dass auf dem Server die Textdatei nicht angelegt werden kann, wobei ich nicht weiß, warum.</p> </blockquote> <p>Das kommt drauf an, was in Zeile 21 des Scripts steht. Wenn die Datei gelesen werden soll, hat der Webserver, bzw. der User unter dem das Script läuft, kein Leserecht. Soll die vorhandene Datei zum Schreiben geöffnet werden, braucht der User das Schreibrecht. Soll die Datei angelegt werden, benötigt der User das Recht, in dem Verzeichnis zu schreiben. Aber bitte nicht mit der chmod-777-Kanone auf diesen Spatzen schießen sondern erstmal das <a href="http://de.wikipedia.org/wiki/Chmod" rel="nofollow noopener noreferrer">Rechtekonzept auf Unix-Maschinen</a> verstehen und dann genau das benötigte Recht vergeben. Bei Fragen bitte nochmal nachfragen.</p> <blockquote> <p>// Hier wird der Titel automatisch über "GET" von "fotos.php" übergeben<br> $titel = $_GET['t'];</p> </blockquote> <p>Das Übergeben des Parameters (vom Webserver zu PHP) hat bereits vor Aufruf deines Scripts stattgefunden. Du muss einfach nur noch die in $_GET bereitgestellten Werte nutzen. $_GET ist ein Array wie jedes andere auch (mit Ausnahme seiner superglobalen Verfügbarkeit). Eine weiteren "Übernahme" ist dabei nicht erforderlich.</p> <blockquote> <p>$ordner = $_GET['o'];<br> $dir = opendir ("../Bilder/Fotos/Web_klein/$ordner");</p> </blockquote> <p>Das ist eine Sicherheitslücke. Wenn jemand als Parameter o statt eines einfachen Ordnernamens etwas wie ../../../ordnername übergibt, kann er auf beliebige Ordner zugreifen, für die der PHP-User das Leserecht hat. Prüfe vorher den Inhalt von $_GET['o'] auf unerlaubte Zeichen (beispielsweise den / ), bzw. dass nur erlaubte Zeichen drin sind (z.B. Buchstaben und Ziffern), oder gegen eine Liste der erlaubten Verzeichnisse.</p> <blockquote> <p>if ($bild != "." && $bild != ".." && $bild != "Thumbs.db")</p> </blockquote> <p>Die Thumbs.db kannst du löschen. Die benötigt nur dein lokales Bilderanschauprogramm.</p> <blockquote> <p>array_push($galerie,$bild);</p> </blockquote> <p>Statt <a href="http://de.php.net/manual/en/function.array-push.php" rel="nofollow noopener noreferrer">array_push()</a> benutzt man im Allgemeinen $array[] = $wert; (siehe dazu auch die Note/Anmerkung auf der Handbuchseite).</p> <blockquote> <p>echo "<a href="vorschau.php?t=" . $titel .  "&o=" . $ordner . "&bn=" . $galerie[$i] . ""><img src="../Bilder/Fotos/Web_klein/" . $ordner . "/" . $galerie[$i] . "" style=" border-width: 3px; border-color: #FFFFFF; "/></a>&nbsp;";</p> </blockquote> <p>Um nicht die " in mit "" begrenzten Strings maskieren (") zu müssen, kannst du den String in '' einfassen. Die zusätzliche Funktionalität der "" verwendest du ja hier nicht. Auch ist es möglich, Attributwerte in HTML-Code in '' einzufassen.<br> &o= ist übrigens kein gültiges HTML. Statt & solltest du dessen Entity &amp; verwenden. (Es wären auch andere Trennzeichen möglich, wie beispielsweise das Semikolon (;). Dieses muss nicht entitisiert werden. Man muss dann aber, <a href="http://de.php.net/manual/en/ini.core.php#ini.arg-separator.input" rel="nofollow noopener noreferrer">arg_separator.input</a> anpassen, damit das Parsen der URL weiterhin funktioniert.)</p> <blockquote> <p>Während er lokal und bei allen anderen Fotoalben die Bilder sortiert nach Dateinamen (001.jpg, 002.jpg, ..., 200.jpg) wiedergibt, macht er das bei dem oben verlinkten Album nicht. Weiß jmd. wieso und sagt es mir?</p> </blockquote> <p>Die Dateien liegen nicht sortiert im Dateisystem. Bringe sie selbst in die gewünschte Ordnung, indem du das Array mit den Dateinamen wie gewünscht sortierst.</p> <p>echo "$verabschiedung $name";</p> https://forum.selfhtml.org/self/2006/sep/29/php-probleme-nach-erstmaliger-servereinrichtung/1028177#m1028177 stareagle 2006-09-29T15:24:49Z 2006-09-29T15:24:49Z PHP Probleme nach erstmaliger Servereinrichtung <p>Moin,</p> <blockquote> <p>1)<a href="http://zwergenspiegel.de/index.php" rel="nofollow noopener noreferrer">Vorschaltseite</a><br> Hier will der Grafikcounter einfach nicht funktionieren. Die erscheinende Fehlermeldung kann ich leider nicht interpretieren.<br> Ich vermute, dass es daran liegt, dass auf dem Server die Textdatei<br> nicht angelegt werden kann, wobei ich nicht weiß, warum.<br> Weiß hier jmd. Rat?</p> </blockquote> <p>Das sieht so aus, als ob der User unter dem der Webserver (wahrscheinlich Apache) läuft keine Schreibrechte auf das Verzeichnis hat, in das du schreiben willst. Was für ein Server/Webspace ist es genau und hast du event. SSH-Zugang? Event. zeigt auch dein FTP-Programm die Rechte an. Ferne wäre Besitzer und Gruppe des Verzeichnisses in geschrieben werden soll interessant.</p> <blockquote> <ol start="2"> <li>»» Während er lokal und bei allen anderen Fotoalben die Bilder sortiert nach Dateinamen (001.jpg, 002.jpg, ..., 200.jpg) wiedergibt, macht er das bei dem oben verlinkten Album nicht. Weiß jmd. wieso und sagt es mir?<br> Kann ich hier mit einer Sortierung beim Auslesen Abhilfe schaffen?</li> </ol> </blockquote> <p>Es gibt eine Funktion, um Arrays zu sortieren: http://www.php.net/manual/en/function.sort.php</p> <p>Damit solltest die Bilder im Array sortieren können.</p> <p>Gruß</p> <p>Stareagle</p> <p></p> https://forum.selfhtml.org/self/2006/sep/29/php-probleme-nach-erstmaliger-servereinrichtung/1028178#m1028178 zwerg http://zwergenspiegel.de 2006-09-29T15:49:24Z 2006-09-29T15:49:24Z PHP Probleme nach erstmaliger Servereinrichtung <blockquote> <p>Das sieht so aus, als ob der User unter dem der Webserver (wahrscheinlich Apache) läuft keine Schreibrechte auf das Verzeichnis hat, in das du schreiben willst.</p> </blockquote> <p>Das wird wohl stimmen; daran habe ich bisher nicht gedacht. Weiß<br> jetzt in welche Richtung ich nach einer Problemlösung suchen muss.</p> <blockquote> <blockquote> <p>Kann ich hier mit einer Sortierung beim Auslesen Abhilfe schaffen?</p> </blockquote> <p>Es gibt eine Funktion, um Arrays zu sortieren: http://www.php.net/manual/en/function.sort.php</p> </blockquote> <p>Danke für den Link, ich werde mich hier einlesen.<br> Ich denke ich komme jetzt - dank deiner Hilfe - erstmal<br> alleine zu recht.</p> <p>Gruß<br> Alex</p> https://forum.selfhtml.org/self/2006/sep/29/php-probleme-nach-erstmaliger-servereinrichtung/1028184#m1028184 zwerg http://zwergenspiegel.de 2006-09-29T15:52:45Z 2006-09-29T15:52:45Z Danke! Mir wurde geholfen :-) <p>Danke für deine ausführliche und hilfreiche Antwort. Speziell auch<br> für die Hinweise, die eigentlich garnicht erfragt hatte. Werde<br> versuchen, deinen Hinweisen nachzugehen und mir erstmal alleine<br> weiter zu helfen.<br> Ansonsten hört ihr wieder von mir *g*</p> <p>Was wär ich nur ohne selfhtml - weiter so!</p> <p>Gruß<br> Alex</p> https://forum.selfhtml.org/self/2006/sep/29/php-probleme-nach-erstmaliger-servereinrichtung/1028180#m1028180 zwerg http://zwergenspiegel.de 2006-10-02T10:03:33Z 2006-10-02T10:03:33Z PHP Probleme nach erstmaliger Servereinrichtung <blockquote> <blockquote> <p>$ordner = $_GET['o'];<br> $dir = opendir ("../Bilder/Fotos/Web_klein/$ordner");</p> </blockquote> <p>Das ist eine Sicherheitslücke. Wenn jemand als Parameter o statt eines einfachen Ordnernamens etwas wie ../../../ordnername übergibt, kann er auf beliebige Ordner zugreifen, für die der PHP-User das Leserecht hat. Prüfe vorher den Inhalt von $_GET['o'] auf unerlaubte Zeichen (beispielsweise den / ), bzw. dass nur erlaubte Zeichen drin sind (z.B. Buchstaben und Ziffern), oder gegen eine Liste der erlaubten Verzeichnisse.</p> </blockquote> <p>Kannst du mir das genauer erklären? Ich hab das jetzt mal<br> versucht und bei mir hat das nicht geklappt. Also wenn ich<br> was anderes eingeben, als erwartet kommt nur ne Fehlermeldung:<br> "... failed to open dir: No such file or directory in ..."</p> <blockquote> <blockquote> <p>if ($bild != "." && $bild != ".." && $bild != "Thumbs.db")</p> </blockquote> <p>Die Thumbs.db kannst du löschen. Die benötigt nur dein lokales Bilderanschauprogramm.</p> </blockquote> <p>Hab das mal eingefügt für den Fall, dass ich mal versehentlich<br> thumbs.db mitkopiere, weil er die Thumbs in Windoof immer wieder<br> anlegt.</p> <blockquote> <blockquote> <p>Während er lokal und bei allen anderen Fotoalben die Bilder sortiert nach Dateinamen (001.jpg, 002.jpg, ..., 200.jpg) wiedergibt, macht er das bei dem oben verlinkten Album nicht. Weiß jmd. wieso und sagt es mir?</p> </blockquote> <p>Die Dateien liegen nicht sortiert im Dateisystem. Bringe sie selbst in die gewünschte Ordnung, indem du das Array mit den Dateinamen wie gewünscht sortierst.</p> </blockquote> <p>Klappt jetzt mit "sort".</p> <p>Gruß<br> zwerg Alex</p> https://forum.selfhtml.org/self/2006/sep/29/php-probleme-nach-erstmaliger-servereinrichtung/1028181#m1028181 dedlfix 2006-10-02T10:54:31Z 2006-10-02T10:54:31Z PHP Probleme nach erstmaliger Servereinrichtung <p>echo $begrüßung;</p> <blockquote> <blockquote> <blockquote> <p>$ordner = $_GET['o'];<br> $dir = opendir ("../Bilder/Fotos/Web_klein/$ordner");<br> Das ist eine Sicherheitslücke. Wenn jemand als Parameter o statt eines einfachen Ordnernamens etwas wie ../../../ordnername übergibt, kann er auf beliebige Ordner zugreifen, für die der PHP-User das Leserecht hat. Prüfe vorher den Inhalt von $_GET['o'] auf unerlaubte Zeichen (beispielsweise den / ), bzw. dass nur erlaubte Zeichen drin sind (z.B. Buchstaben und Ziffern), oder gegen eine Liste der erlaubten Verzeichnisse.</p> </blockquote> </blockquote> <p>Kannst du mir das genauer erklären? Ich hab das jetzt mal versucht und bei mir hat das nicht geklappt. Also wenn ich was anderes eingeben, als erwartet kommt nur ne Fehlermeldung:<br> "... failed to open dir: No such file or directory in ..."</p> </blockquote> <p>Wenn sich am Ende ../Bilder/Fotos/Web_klein/../../../irgendwoanders ergibt, jemand also in $_GET['o'] ein ../../../irgendwoanders abgelegt hat, wird effektiv der Inhalt von ../irgendwoanders ausgelesen. Natürlich muss das einen existierenden Pfad ergeben, aber das kann man durch Probieren herausfinden. Wenn der Angreifer dann auch noch die Fehlermeldung und damit den Pfad zum Script angezeigt bekommt, kann er sogar noch das Probieren etwas abkürzen.</p> <blockquote> <blockquote> <blockquote> <p>if ($bild != "." && $bild != ".." && $bild != "Thumbs.db")<br> Die Thumbs.db kannst du löschen. Die benötigt nur dein lokales Bilderanschauprogramm.<br> Hab das mal eingefügt für den Fall, dass ich mal versehentlich<br> thumbs.db mitkopiere, weil er die Thumbs in Windoof immer wieder anlegt.</p> </blockquote> </blockquote> </blockquote> <p>Eventuell müsstest du noch ein strtolower() oder strtoupper() auf $bild anwenden, um es dann mit einem klein oder groß geschriebenen thumbs.db zu vergleichen, da Unix im Gegensatz zu Windows Unterschiede in der Schreibweise beachtet.</p> <p>echo "$verabschiedung $name";</p> https://forum.selfhtml.org/self/2006/sep/29/php-probleme-nach-erstmaliger-servereinrichtung/1028182#m1028182 zwerg http://zwergenspiegel.de 2006-10-03T02:11:40Z 2006-10-03T02:11:40Z PHP Probleme nach erstmaliger Servereinrichtung <blockquote> <p>Wenn sich am Ende ../Bilder/Fotos/Web_klein/../../../irgendwoanders ergibt, jemand also in $_GET['o'] ein ../../../irgendwoanders abgelegt hat, wird effektiv der Inhalt von ../irgendwoanders ausgelesen. Natürlich muss das einen existierenden Pfad ergeben, aber das kann man durch Probieren herausfinden. Wenn der Angreifer dann auch noch die Fehlermeldung und damit den Pfad zum Script angezeigt bekommt, kann er sogar noch das Probieren etwas abkürzen.</p> </blockquote> <p>Ich muss also ne Funktion finden, die "/" verbietet beim übergeben.<br> Richtig?<br> Was hat derjenige den im "schlimmsten Fall" davon, dass er<br> die Verzeichnisse auslesen kann? Kann er auch die Zugangsdaten<br> von MySQL-Datenbanken auslesen, wenn er die Datei findet?<br> Homepage besser erstmal wieder offline nehmen oder betroffene<br> Seiten per .htaccess schützen?<br> Oder "no risk no fun? ;-)</p> <blockquote> <p>Eventuell müsstest du noch ein strtolower() oder strtoupper() auf $bild anwenden, um es dann mit einem klein oder groß geschriebenen thumbs.db zu vergleichen, da Unix im Gegensatz zu Windows Unterschiede in der Schreibweise beachtet.</p> </blockquote> <p>Da muss ich mich erst wieder einlesen. Aber danke für die Tipps.</p> <p>Manno man. Jedesmal, wenn ich denke, ich bin mit irgend<br> was fertig kommt wieder irgendwas.</p> <p>zwerg Alex</p> https://forum.selfhtml.org/self/2006/sep/29/php-probleme-nach-erstmaliger-servereinrichtung/1028183#m1028183 dedlfix 2006-10-03T07:08:38Z 2006-10-03T07:08:38Z PHP Probleme nach erstmaliger Servereinrichtung <p>echo $begrüßung;</p> <blockquote> <p>Ich muss also ne Funktion finden, die "/" verbietet beim übergeben.</p> </blockquote> <p>Es gibt mehrere Möglichkeiten. Eine wäre, die Namen der erlaubten Verzeichnisse gegen eine definierte Liste zu prüfen. Desweiteren könnte man prüfen, ob ein / im Dateinamen vorkommt, z.B. mit <a href="http://de.php.net/manual/en/function.strpos.php" rel="nofollow noopener noreferrer">strpos()</a>. Beachte dabei die Handbuchseite und den Unterschied zwischen 0 und false beim Rückgabewert der Funktion. Ebensogut könntest du mit einer <a href="http://de.php.net/manual/en/ref.ctype.php" rel="nofollow noopener noreferrer">ctype</a>-Funktion auf erlaubte Zeichen prüfen (beispielsweise ctype_alnum() oder ctype_alpha()). Die ctype-Funktionen stehen aber nicht überall zur Verfügung. Du müsstest das vorher mit phpinfo() auf dem Zielsystem prüfen. Und auch die Verwendung Regulärer Ausdrücke wäre möglich, meist aber erst empfehlenswert, wenn es keine einfachere Lösung gibt.</p> <p>Was du im Fall nicht erlaubter Werte machst, ist dir überlassen. Ablehnen mit einer entsprechenden Meldung oder Verwenden eines Default-Wertes wären zwei Vorschläge.</p> <blockquote> <p>Was hat derjenige den im "schlimmsten Fall" davon, dass er die Verzeichnisse auslesen kann? Kann er auch die Zugangsdaten von MySQL-Datenbanken auslesen, wenn er die Datei findet?</p> </blockquote> <p>Er kann auf alle Dateien zugreifen, auf die du mit deinen Rechten auch zugreifen kannst. Dazu können auch Zugangsdaten und andere Hinweise auf Schwachstellen zählen. Was man mit fremden übernommenen Rechnern alles anstellen kann siehst du beispielsweise täglich in deiner Mailbox.</p> <p>Was in deinem konkreten Fall möglich ist, kommt auf den Rest der Scripte an. Wenn du das ermittelte Verzeichnis an ein Bildanzeigescript weitergibst, und du dort prüfst, dass die anzuzeigende Datei auch wirklich ein Bild ist, ist die Wahrscheinlichkeit des Datenausspähens schon wieder gesunken.<br> Zum Prüfen, ob es sich bei einer Dati um eine Grafikdatei handelt eignet sich <a href="http://de.php.net/manual/en/function.getimagesize.php" rel="nofollow noopener noreferrer">getimagesize()</a>. Die Funktion gibt ein Array mit Informationen zum Bild zurück oder false, falls es kein Bild sein sollte. Bei false könnte man die Anzeige/Ausgabe der Datei verweigern.</p> <p>echo "$verabschiedung $name";</p>