substr
peter
- php
guten morgen zusammen,
ich hab ein kleines problem.
und zwar möchte ich gerne eine navigation haben, die ihre inhalte aus ordnern automatisch bezieht.
soweit funktioniert auch alles. die ordner müssen zwar noch von hand eingetragen werden, aber das kommt noch...
jetzt sollten die ordner ja keine leerzeichen enthalten. aus diesem grund wollte ich mit einem "substr" die "_" durch leerzeichen ersetzen.
funktioniert auch!
jedoch brauche ich noch den wert ohne den substr.
kann mir hilfestellung geben wie ich das umsetze?
ich danke euch.
<?php
$verzeichnis = array (
"portfolio/ordner_1/",
"portfolio/ordner_2/",
"portfolio/ordner_3/"
);
if ($_GET) {
$link = $_GET["link"];
$name = $_GET["name"];
}
for ($zaehler = 0; $zaehler < count($verzeichnis); $zaehler++) {
// Verzeichnisnamen extrahieren!
$verzeichnisname = explode("/", $verzeichnis[$zaehler]);
$verzeichnisname = $verzeichnisname[1];
// Generiere Linknamen: Lösche erste 3 Zeichen und ersetze _ durch Leerzeichen
$verzeichnisname = substr(str_replace("_", " ", $verzeichnis[$zaehler]), 10, -1);
if ($link == $verzeichnisname) {
// Verzeichnisnamen ausgeben
echo '<li><span class="active">';
echo ucwords($verzeichnisname) . "</span>\n";
echo '<ul>' . "\n";
// Verzeichnisdateien einlesen
$verz_handle = openDir($verzeichnis[$zaehler]);
while ($datei = readDir($verz_handle)) {
if (substr_count($datei, "text.txt") > 0) {
$datei_handle = fOpen($verzeichnis[$zaehler] . $datei, "r"); // Verzeichnisdatei öffnen
$inhalt = fRead($datei_handle, 1000); // Verzeichnisdatei teilw. einlesen
fClose($datei_handle);
ereg("(.*)", $inhalt, $titel); // und Titelbeschreibung daraus extrahieren!
if ($name == $datei) {
echo "<div class=aktuell>$titel[1]</div>"; // Geöffnete Verzeichnisdatei wird markiert
}
else {
// Link zur Verzeichnisdatei setzen
echo "<li class='txt abstand'>$titel[1]</li>\n";
}
}
}
closeDir($verz_handle);
echo "\n</li></ul>\n";
}
else {
// Link zum Verzeichnis setzen
echo '<li> ';
echo "<a href=\"" . $_SERVER["PHP_SELF"] . "?link=$verzeichnisname\">";
echo ucwords($verzeichnisname) . "</a></li>\n";
}
}
?>
entschuldigt,
war eine dumme frage.
einfach eine neue variable aufmachen und nicht einfach überschreiben.
viele grüße
peter
guten morgen zusammen,
ich hab ein kleines problem.
und zwar möchte ich gerne eine navigation haben, die ihre inhalte aus ordnern automatisch bezieht.
soweit funktioniert auch alles. die ordner müssen zwar noch von hand eingetragen werden, aber das kommt noch...
jetzt sollten die ordner ja keine leerzeichen enthalten. aus diesem grund wollte ich mit einem "substr" die "_" durch leerzeichen ersetzen.
funktioniert auch!
jedoch brauche ich noch den wert ohne den substr.
kann mir hilfestellung geben wie ich das umsetze?
ich danke euch.
<?php
$verzeichnis = array (
"portfolio/ordner_1/",
"portfolio/ordner_2/",
"portfolio/ordner_3/"
);if ($_GET) {
$link = $_GET["link"];
$name = $_GET["name"];
}for ($zaehler = 0; $zaehler < count($verzeichnis); $zaehler++) {
// Verzeichnisnamen extrahieren!$verzeichnisname = explode("/", $verzeichnis[$zaehler]);
$verzeichnisname = $verzeichnisname[1];
// Generiere Linknamen: Lösche erste 3 Zeichen und ersetze _ durch Leerzeichen
$verzeichnisname = substr(str_replace("_", " ", $verzeichnis[$zaehler]), 10, -1);if ($link == $verzeichnisname) {
// Verzeichnisnamen ausgeben
echo '<li><span class="active">';
echo ucwords($verzeichnisname) . "</span>\n";
echo '<ul>' . "\n";// Verzeichnisdateien einlesen
$verz_handle = openDir($verzeichnis[$zaehler]);
while ($datei = readDir($verz_handle)) {
if (substr_count($datei, "text.txt") > 0) {
$datei_handle = fOpen($verzeichnis[$zaehler] . $datei, "r"); // Verzeichnisdatei öffnen
$inhalt = fRead($datei_handle, 1000); // Verzeichnisdatei teilw. einlesen
fClose($datei_handle);
ereg("(.*)", $inhalt, $titel); // und Titelbeschreibung daraus extrahieren!if ($name == $datei) {
echo "<div class=aktuell>$titel[1]</div>"; // Geöffnete Verzeichnisdatei wird markiert
}
else {
// Link zur Verzeichnisdatei setzen
echo "<li class='txt abstand'>$titel[1]</li>\n";
}
}
}
closeDir($verz_handle);
echo "\n</li></ul>\n";
}
else {
// Link zum Verzeichnis setzen
echo '<li> ';
echo "<a href="" . $_SERVER["PHP_SELF"] . "?link=$verzeichnisname">";
echo ucwords($verzeichnisname) . "</a></li>\n";
}
}
?>
Hallo
<?php
$verzeichnis = array (
"portfolio/ordner_1/",
"portfolio/ordner_2/",
"portfolio/ordner_3/"
);if ($_GET) {
$link = $_GET["link"];
$name = $_GET["name"];
}
`$_GET`{:.language-php} ist bei Aufruf eines Skripts über einen HTTP-Request immer gesetzt. Ob `$_GET["link"]`{:.language-php} oder `$_GET["name"]`{:.language-php} gesetzt sind, ist trotzdem nicht sicher (nach dem hier vorgestellten Code).
> ~~~php
for ($zaehler = 0; $zaehler < count($verzeichnis); $zaehler++) {
> // Verzeichnisnamen extrahieren!
>
> $verzeichnisname = explode("/", $verzeichnis[$zaehler]);
$verzeichnisname
enthält nun jeweils:
$verzeichnisname[0] = "portfolio";
$verzeichnisname[1] = "ordner_1";
$verzeichnisname[2] = "";
$verzeichnisname = $verzeichnisname[1];
// Generiere Linknamen: Lösche erste 3 Zeichen und ersetze _ durch Leerzeichen
$verzeichnisname = substr(str_replace("_", " ", $verzeichnis[$zaehler]), 10, -1);
1\. Woher kommt `$verzeichnis`{:.language-php}? Sollte da nicht `$verzeichnisname`{:.language-php} bzw. `$verzeichnisname[1]`{:.language-php} (Wozu umherkopieren, wenn es auch direkt nutzbar ist?) stehen?
2\. Der Unterstrich wird durch ein Leerzeichen ersetzt (wie gewollt).
3\. Die Ursprungszeichenkette "ordner\_1" hat nur 8 Zeichen. Deine Anwendung von substr gibt aber eine Zeichenkette von Position 10 bis zum vorletzten Zeichen zurück, die es nicht geben kann, da die Zeichenkette dafür zu kurz ist.
4\. Deine Aufgabe "Lösche erste 3 Zeichen und ersetze \_ durch Leerzeichen" würde bei richtiger Anwendung "ner\_1" ausspucken. Ist \*das\* gewollt?
> ~~~php
else {
> // Link zum Verzeichnis setzen
> echo '<li> ';
> echo "<a href=\"" . $_SERVER["PHP_SELF"] . "?link=$verzeichnisname\">";
> echo ucwords($verzeichnisname) . "</a></li>\n";
> }
> }
Benutze $_SERVER["SCRIPT_NAME"]
statt $_SERVER["PHP_SELF"]
, maskiere $verzeichnisname
im Parameterteil der URL mit urlencode
und mit htmlspecialchars
im Linktext.
echo "<li><a href="" . $_SERVER["SCRIPT_NAME"] . "?link=" . urlencode($verzeichnisname) . "">" . htmlspecialchars(ucwords($verzeichnisname)) . "</a></li>\n";
Tschö, Auge
hallo,
oh, da haste recht.
habs wie folgt geändert:
if ($_GET) {
$link = $HTTP_GET_VARS["link"];
$name = $HTTP_GET_VARS["name"];
}
Hallo
<?php
$verzeichnis = array (
"portfolio/ordner_1/",
"portfolio/ordner_2/",
"portfolio/ordner_3/"
);if ($_GET) {
$link = $_GET["link"];
$name = $_GET["name"];
}
>
> `$_GET`{:.language-php} ist bei Aufruf eines Skripts über einen HTTP-Request immer gesetzt. Ob `$_GET["link"]`{:.language-php} oder `$_GET["name"]`{:.language-php} gesetzt sind, ist trotzdem nicht sicher (nach dem hier vorgestellten Code).
>
> > ~~~php
for ($zaehler = 0; $zaehler < count($verzeichnis); $zaehler++) {
> > // Verzeichnisnamen extrahieren!
> >
> > $verzeichnisname = explode("/", $verzeichnis[$zaehler]);
$verzeichnisname
enthält nun jeweils:
$verzeichnisname[0] = "portfolio";
$verzeichnisname[1] = "ordner_1";
$verzeichnisname[2] = "";
>
> > ~~~php
$verzeichnisname = $verzeichnisname[1];
> > // Generiere Linknamen: Lösche erste 3 Zeichen und ersetze _ durch Leerzeichen
> > $verzeichnisname = substr(str_replace("_", " ", $verzeichnis[$zaehler]), 10, -1);
- Woher kommt
$verzeichnis
? Sollte da nicht$verzeichnisname
bzw.$verzeichnisname[1]
(Wozu umherkopieren, wenn es auch direkt nutzbar ist?) stehen?
$verzeichnis
is das array wo die ordner eingetragen werden.
kann ich das kürzer fassen?
eigentlich möchte ich dass die ordner automatisch ausgelesen werden. jedoch hab ich es noch nicht hinbekommen. es wird mir zwar in ein array geschrieben, jedoch bekomme ich es nicht eingebunden. da muss ich nochmal schauen.
- Der Unterstrich wird durch ein Leerzeichen ersetzt (wie gewollt).
- Die Ursprungszeichenkette "ordner_1" hat nur 8 Zeichen. Deine Anwendung von substr gibt aber eine Zeichenkette von Position 10 bis zum vorletzten Zeichen zurück, die es nicht geben kann, da die Zeichenkette dafür zu kurz ist.
es wird mir derzeit der komplette pfad ausgegeben. also inkl. portfolio/...
darum sind es 10 zeichen.
- Deine Aufgabe "Lösche erste 3 Zeichen und ersetze _ durch Leerzeichen" würde bei richtiger Anwendung "ner_1" ausspucken. Ist *das* gewollt?
nee, es werden die zeichenkette "ordner_1 ausgegebn"
else {
// Link zum Verzeichnis setzen
echo '<li> ';
echo "<a href="" . $_SERVER["PHP_SELF"] . "?link=$verzeichnisname">";
echo ucwords($verzeichnisname) . "</a></li>\n";
}
}
>
> Benutze `$_SERVER["SCRIPT_NAME"]`{:.language-php} statt `$_SERVER["PHP_SELF"]`{:.language-php}, maskiere `$verzeichnisname`{:.language-php} im Parameterteil der URL mit `urlencode`{:.language-php} und mit `htmlspecialchars`{:.language-php} im Linktext.
>
> echo "<li><a href=\"" . $\_SERVER["SCRIPT\_NAME"] . "?link=" . urlencode($verzeichnisname) . "\">" . htmlspecialchars(ucwords($verzeichnisname)) . "</a></li>\n";
>
> Tschö, Auge
>
das ganze is nur das menü.
derzeit verscueh ich die bilder in den content teil zu laden.
das mache ich wie folgt:
hier wird die variable zu dem verzeichnis festgelegt. unter anderem lade ich damit txt dateien.
~~~php
$link = $HTTP_GET_VARS['link'] ;
if (!isset($var)) {
// Festlegung der leeren VAR $site
if (!isset($link)) {
$link = "ordner-1";
}
$pfad = "./portfolio/".$link;
}
?>
nun das bilderladen:
<?php
// Öffnet ein Unterverzeichnis mit dem Namen "daten"
$imagesfolder = openDir("portfolio/ordner_1");
// Verzeichnis lesen
while ($image = readDir($imagesfolder)) {
// Höhere Verzeichnisse nicht anzeigen!
if ($image != "." && $image != "..") {
// Dateityp filtern. Es werden nur .php-Dateien angezeigt
if (strstr($image, ".gif") ||
strstr($image, ".png") ||
strstr($image, ".jpg")) {
// Dateiendung vom Dateinamen filtern
$name = explode(".", $image);
// Link erstellen
echo "<img src='portfolio/ordner_1/$image' alt='$name[0]' />\n";
}
}
}
closeDir($imagesfolder); // Verzeichnis schließen
?>
das funktioniert auch einwandfrei.
jedoch wenn ich jetzt statt "portfolio/ordner_1" in die openDir funktion die variable $pfad
eintragen möchte funktioniert es nicht mehr.
ich verstehe leider nicht warum das nicht funktioniert?!?
viele grüeß
peter
Hi,
oh, da haste recht.
habs wie folgt geändert:
if ($_GET) {
$link = $HTTP_GET_VARS["link"];
$name = $HTTP_GET_VARS["name"];
}
Das ist immer noch Unfug.
Wenn die PHP-Version nicht uralt ist, also $\_GET kennt - dann stehen dir die Werte auf in diesem Array zur Verfügung.
Sie dann noch aus den veralteten $HTTP\_xy\_VARS zu holen, ist Nonsense - nicht nur vom Prinzip her, sondern weil diese auch explizit deaktiviert sein können, und dann fällt dein Script mit obigem Code immer noch auf die Nase.
Und bitte zitiere \*sinnvoll\*, und nicht immer das komplette Vorposting!
MfG ChrisB
--
RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
Hallo,
if ($_GET) {
$link = $HTTP_GET_VARS["link"];
$name = $HTTP_GET_VARS["name"];
}
> Das ist immer noch Unfug.
> Wenn die PHP-Version nicht uralt ist, also $\_GET kennt - dann stehen dir die Werte auf in diesem Array zur Verfügung.
> Sie dann noch aus den veralteten $HTTP\_xy\_VARS zu holen, ist Nonsense - nicht nur vom Prinzip her, sondern weil diese auch explizit deaktiviert sein können, und dann fällt dein Script mit obigem Code immer noch auf die Nase.
und unabhängig davon, ob die alten "long arrays" zur Verfügung stehen oder nicht - bei Verwendung von $\_GET ist es immer noch unsinnig[1], oft sogar schädlich[2], die Inhalte umzukopieren.
> Und bitte zitiere \*sinnvoll\*, und nicht immer das komplette Vorposting!
ACK.
So long,
Martin
[1] Ich will nicht ausschließen, dass es Fälle gibt, die ein einfaches Umkopieren rechtfertigen. Mir will aber im Moment keiner einfallen.
[2] schädlich deshalb, weil es die Herkunft verschleiert: $link sieht man nicht mehr an, dass es eine potentiell gefährliche Eingabe von außen ist. $\_GET['link'] dagegen schon.
--
Lieber mit Betty im Wald
als mit Waldi im Bett.
Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
wie kann ich das ganze denn anders schreiben?
also ich will jetzt keine lösung, lieber etwas zum nachlesen?
es is shcon einw neig her dass ich das letzte mal eine website so umgesetzt hab.
viele grüße
peter
if ($_GET) {
$link = $HTTP_GET_VARS["link"];
$name = $HTTP_GET_VARS["name"];
}
>
>
> und unabhängig davon, ob die alten "long arrays" zur Verfügung stehen oder nicht - bei Verwendung von $\_GET ist es immer noch unsinnig[1], oft sogar schädlich[2], die Inhalte umzukopieren.
>
> > Und bitte zitiere \*sinnvoll\*, und nicht immer das komplette Vorposting!
>
> ACK.
>
> So long,
> Martin
>
>
> [1] Ich will nicht ausschließen, dass es Fälle gibt, die ein einfaches Umkopieren rechtfertigen. Mir will aber im Moment keiner einfallen.
> [2] schädlich deshalb, weil es die Herkunft verschleiert: $link sieht man nicht mehr an, dass es eine potentiell gefährliche Eingabe von außen ist. $\_GET['link'] dagegen schon.
Hi,
jetzt hast du schon wieder fast alles zitiert ...! *seufz*
Schau dir doch *bitte* mal an, wie andere hier zitieren - was sie, weil unnötig, komplett wegkürzen, und wie/wo sie ihre eigenen Antwortbestandteile unterbringen, wenn sie *konkret* auf etwas zuvor geschriebenes Bezug nehmen.
wie kann ich das ganze denn anders schreiben?
also ich will jetzt keine lösung, lieber etwas zum nachlesen?
Als Grundlagentutorials kann ich http://tut.php-q.net/de/ empfehlen, auch noch http://www.php-einfach.de/php-tutorial/php-tutorial.php
Und für darüber hinausgehendes in erster Linie das offizielle Manual.
MfG ChrisB
jetzt hast du schon wieder fast alles zitiert ...! *seufz*
es tut mir leid. ich werde mir mühe geben
Als Grundlagentutorials kann ich http://tut.php-q.net/de/ empfehlen, auch noch http://www.php-einfach.de/php-tutorial/php-tutorial.php
danke frü den link.
was variablen sind hab ich auch shcon verstanden.
oftmals hapert es an den zusätzlichen zeichen.
ich hab mittlerweile auch verstanden dass mien skript sicherheitslücken hat.
jedoch hab ich noch nciht verstanden, wie ich die shcließen kann.
mit $POST
?
oder hab ich da nochetwas vergessen?
ich blicke noch nciht so ganz hinter den unsicherheitsfaktor.
ist es so besser?
$link = $POST['link'] ;
if (in_array("/portfolio/".$link, $verzeichnis)) {
$pfad = "/portfolio/".$link;
}
viele grüße
peter
Hi,
ich hab mittlerweile auch verstanden dass mien skript sicherheitslücken hat.
jedoch hab ich noch nciht verstanden, wie ich die shcließen kann.
mit$POST
?
Nein.
Erstens heißt es $_POST, analog zu $_GET, und zweitens handelt es sich dabei genauso um von außen kommende Werte, die alles mögliche enthalten können - also entsprechend geprüft bzw. behandelt werden müssen, bevor man sie verwendet.
ist es so besser?
$link = $POST['link'] ;
if (in_array("/portfolio/".$link, $verzeichnis)) {
$pfad = "/portfolio/".$link;
}
Das ist zumindest schon mal ein möglicher Ansatz, wenn du in $verzeichnis dann alle Pfadnamen explizit aufgelistet hast, die erlaubt sein sollen. (Wenn alle mit "/portfolio/" anfangen, kannst du dieses Präfix aber auch aus dem Array und der Überprüfung heraus nehmen.)
> ich blicke noch nciht so ganz hinter den unsicherheitsfaktor.
Wenn du nicht bspw. wie oben gegen einer Liste erlaubter Werte prüfst, sondern bspw. \*nur\* sowas machen würdest
`$pfad = "/portfolio/".$POST['link'];`{:.language-php}
- dann könnte ich dir bspw. den Wert "../irgendwas" an dein Script übergeben, und schon wäre ich aus dem vorgegebenen Verzeichnis „ausgebrochen“, und dein Script verwendet plötzlich Dateien aus einem ganz anderen Pfad als dem, den du beabsichtigt hattest.
MfG ChrisB
--
RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
Hi!
[2] schädlich deshalb, weil es die Herkunft verschleiert: $link sieht man nicht mehr an, dass es eine potentiell gefährliche Eingabe von außen ist. $_GET['link'] dagegen schon.
Das Hauptproblem ist eher, dass mit steigender Projektgröße durch die zusätzlichen Variablen die Übersicht leidet. Bei $_GET['link'] ist die Herkunft und Aufgabe in der Regel klar, bei $link hingegen müsste man gegebenenfalls erst nachforschen, wie und wo sie entstanden ist.
Gefährlich werden die Inhalte nur, wenn man den Kontextwechsel missachtet. Für den sind aber auch alle anderen variablen Werte als potentiell "gefährlich" einzustufen, auch die, die aus "befreundeten" Systemen kommen, wie dem eigenen DBMS.
Was ich sagen will: Man sollte das Augenmerk der Gefährlichkeit nicht zu einseitig auf direkte Nutzereingaben legen, das lenkt sonst womöglich von den anderen Gefahrenpotentialen ab. Oder anders: Der Inhalt einer Variablen kann mir aus technischer Sicht vollkommen egal sein, wenn ich die Regeln des Ausgabemediums ausreichend berücksichtige, in das dieser Inhalt eingefügt werden soll.
Lo!
Hallo
oh, da haste recht.
habs wie folgt geändert:
if ($_GET) {
$link = $HTTP_GET_VARS["link"];
$name = $HTTP_GET_VARS["name"];
}
Ganz schlecht. Erstens ist immer noch nicht sicher, ob diese Elemente existieren und zweitens ist `$HTTP_GET_VARS`{:.language-php} sowas von veraltet (wurde mit PHP 4.2 durch `$_GET`{:.language-php} ersetzt, ich weiß nicht mal, ob es in PHP 5 noch drinnen ist). Benutze also `$_GET`{:.language-php} und frage direkt ab, ob dessen Elemente "link" und "name" existieren. Die Kritik am Umkopieren bleibt. Du kannst, nach der Bestätigung der Existenz, `$_GET["link"]`{:.language-php} und `$_GET["name"]`{:.language-php} direkt verwenden.
> > > ~~~php
for ($zaehler = 0; $zaehler < count($verzeichnis); $zaehler++) {
> > > // Verzeichnisnamen extrahieren!
> > >
> > > $verzeichnisname = explode("/", $verzeichnis[$zaehler]);
> > > $verzeichnisname = $verzeichnisname[1];
> > > // Generiere Linknamen: Lösche erste 3 Zeichen und ersetze _ durch Leerzeichen
> > > $verzeichnisname = substr(str_replace("_", " ", $verzeichnis[$zaehler]), 10, -1);
- Woher kommt
$verzeichnis
? Sollte da nicht$verzeichnisname
bzw.$verzeichnisname[1]
(Wozu umherkopieren, wenn es auch direkt nutzbar ist?) stehen?
$verzeichnis
is das array wo die ordner eingetragen werden.
Oh, habe ich übersehen. Damit erledigt sich auch meine diesbezügliche Nachfrage.
eigentlich möchte ich dass die ordner automatisch ausgelesen werden. jedoch hab ich es noch nicht hinbekommen. es wird mir zwar in ein array geschrieben, jedoch bekomme ich es nicht eingebunden. da muss ich nochmal schauen.
In $verzeichnis[$zaehler]
steht beim ersten Durchlauf "portfolio/ordner_1/", in $verzeichnisname
"ordner_1". Für die Navigation hast du alle nötigen Werte.
- Die Ursprungszeichenkette "ordner_1" hat nur 8 Zeichen. Deine Anwendung von substr gibt aber eine Zeichenkette von Position 10 bis zum vorletzten Zeichen zurück, die es nicht geben kann, da die Zeichenkette dafür zu kurz ist.
es wird mir derzeit der komplette pfad ausgegeben. also inkl. portfolio/...
darum sind es 10 zeichen.
Siehe oben, wg. "übersehen". Wenn du an der Stelle "ordner_1" extrahieren und anpassen willst, warum nutzt du dann nicht gleich $verzeichnisname[1]
, wo genau dieser Wert drin steht?
$linkText = str_replace("_", " ", ucfirst($verzeichnisname[1]));
# ergibt: "Ordner 1"
Damit hast du den Schritt der Umwandlung des ersten Buchstabens in einen Großbuchstaben gleich miterschlagen. Ich habe, ausgehend von deinem Array mit jeweils nur einem Wort im Verzeichnisnamen ucfirst
anstatt ucwords
benutzt. Gibt es Namen mit mehreren Worten, ist ucwords
eventuell angebrachter. Bleibt für die Ausgabe nur noch das folgende zu beachten:
Benutze
$_SERVER["SCRIPT_NAME"]
statt$_SERVER["PHP_SELF"]
, maskiere$verzeichnisname
im Parameterteil der URL miturlencode
und mithtmlspecialchars
im Linktext.
Jetzt angepasst (ohne ucwords/ucfirst):
echo "<li><a href="" . $_SERVER["SCRIPT_NAME"] . "?link=" . urlencode($verzeichnisname) . "">" . htmlspecialchars($verzeichnisname) . "</a></li>\n";
$link = $HTTP_GET_VARS['link'] ;
if (!isset($var)) {
// Festlegung der leeren VAR $site
if (!isset($link)) {$link = "ordner-1";
}
$pfad = "./portfolio/".$link;
}
?>
Hieß der Pfad nicht eben noch "/portfolio/ordner\_1" (beachte den \*Unter\*strich)?
Dein Aufbau reißt eine Sicherheitslücke in dein Skript. Du übernimmst direkt Eingaben des Besuchers in den Pfad. Du überprüfst nicht, ob diese Eingabe den Erwartungen entspricht (Gibt es diesen Pfad und wenn ja, ist das betreffende Verzeichnis für das Auslesen durch den Benutzer da?). Dazu bietet sich in deinem Fall in\_array an, da du ein Array der erlaubten Pfade da hast. Achte dann aber auch auf die Slashes!
~~~php
if (in_array("/portfolio/".$link, $verzeichnis)) {
$pfad = "/portfolio/".$link;
}
nun das bilderladen:
<?php
// Öffnet ein Unterverzeichnis mit dem Namen "daten"
$imagesfolder = openDir("portfolio/ordner_1");
// Verzeichnis lesen
while ($image = readDir($imagesfolder)) {
// Höhere Verzeichnisse nicht anzeigen!
if ($image != "." && $image != "..") {
// Dateityp filtern. Es werden nur .php-Dateien angezeigt
if (strstr($image, ".gif") ||
strstr($image, ".png") ||
strstr($image, ".jpg")) {
// Dateiendung vom Dateinamen filtern
$name = explode(".", $image);
// Link erstellen
echo "<img src='portfolio/ordner_1/$image' alt='$name[0]' />\n";}
}
}
closeDir($imagesfolder); // Verzeichnis schließen
?>
Der Kommentar "Dateityp filtern. Es werden nur .php-Dateien angezeigt" ist falsch, es sollen ja nur Bilder ausgegeben werden. Einen Dateinamen kann man aber fälschen, nur auf die Dateiendung zu prüfen ist daher Unfug.
Prüfe stattdesen mit [getimagesize](http://de3.php.net/manual/de/function.getimagesize.php) auf die im Arrayelement 2 zurückgegebene Konstante des Dateityps. Bei der [Funktionsbeschreibung für exif_imagetype](http://de3.php.net/manual/de/function.exif-imagetype.php) findest du eine Liste der möglichen Konstanten. Für dich sind 1, 2 und 3 relevant, ich fasse sie unten mit range über ein Array zusammen und prüfe den ermittelten Wert gegen das Array.
~~~php
$test = getimagesize($image);
if (in_array($test[2], range(1,3)) {
# Der Typ des Bildes ist entweder GIF, JPG oder PNG
$name = explode(".", $image);
$ausgabe = '<img src="portfolio/ordner_1/'.$image.'" alt="'. htmlspecialchars($name[0]).'" />';
}
das funktioniert auch einwandfrei.
jedoch wenn ich jetzt statt "portfolio/ordner_1" in die openDir funktion die variable$pfad
eintragen möchte funktioniert es nicht mehr.
Wie gesagt: "-" != "_".
Tschö, Auge