Such makros für verschiedene Seiten anlegen?
Jolt
- php
Hallo,
ich bastle grade an einer kleinen Seite und bin auf ein Problem gestoßen.
Die Index-Seite lädt php Dateien per include-Befehl in einen Rahmen.
Das wollte ich auch über eine Suchfunktion möglich machen.
Das an sich klappt auch.
Ich kenn mich damit noch überhaupt nicht aus, und weiß nicht genau was nötig ist damit ihr mir helfen könnt. Aber hier ist vorsichthalber mal die Suchfunktion an sich:
<FORM method=GET action="index.php?"><INPUT TYPE=text name=link size=31 maxlength=255 value="">
<INPUT TYPE=hidden name=hl value=de> <INPUT type=submit name=btnG VALUE="Suche"></FORM>
Wenn ich, sagen wir mal als Beispiel "seite1" eingebe, wird auch die datei mit dem Namen seite1.php geladen wie sie soll.
Ich möchte die Seite aber auch noch über alternative Suchbegriffe anzeigen lassen. Wie zB wenn ich einfach "1" eingebe... oder wenn ich Seite1 groß schreibe. Das ist doch bestimmt irgendwie möglich, oder?
Mahlzeit,
Die Index-Seite lädt php Dateien per include-Befehl in einen Rahmen.
Dass Du damit, wenn Du hier nicht SEHR VORSICHTIG bist, potentiell ein riesengroßes Scheunentor aufreißt, ist Dir bewusst?
<FORM method=GET action="index.php?"><INPUT TYPE=text name=link size=31 maxlength=255 value="">
<INPUT TYPE=hidden name=hl value=de> <INPUT type=submit name=btnG VALUE="Suche"></FORM>
Bitte schick Deinen HTML-Code mal durch einen Validator. Insbesonders entscheide Dich zwischen HTML (beliebige Groß- und Kleinschreibung) und XHTML (zwingend Kleinschreibung, ausnahmslos ALLE Attributwerte müssen in Anführungsstrichen geschrieben werden) - wobei ich letzteres empfehlen würde.
Das Fragezeichen bei der <form>-Action ist überflüssig.
Wenn ich, sagen wir mal als Beispiel "seite1" eingebe, wird auch die datei mit dem Namen seite1.php geladen wie sie soll.
Das heißt also, Deine index.php holt sich per $_GET["link"] den eingegebenen Namen und tut dann WAS damit? Vielleicht solltest Du - da es sich um ein PHP-Problem handelt, entsprechend relevanten PHP-Quellcode posten - wie Dein HTML-Formular aussieht, ist vollkommen irrelevant.
Ich möchte die Seite aber auch noch über alternative Suchbegriffe anzeigen lassen. Wie zB wenn ich einfach "1" eingebe... oder wenn ich Seite1 groß schreibe. Das ist doch bestimmt irgendwie möglich, oder?
Ja.
MfG,
EKKi
Mahlzeit,
Die Index-Seite lädt php Dateien per include-Befehl in einen Rahmen.
Dass Du damit, wenn Du hier nicht SEHR VORSICHTIG bist, potentiell ein riesengroßes Scheunentor aufreißt, ist Dir bewusst?
Nein, habe ich bisher wirklich nicht bedacht. Aber ich glaube ich ahne wo das Problem liegt.
Hast du Tips wie ich diese Sache etwas absichern könnte?
Bitte schick Deinen HTML-Code mal durch einen Validator. Insbesonders entscheide Dich zwischen HTML (beliebige Groß- und Kleinschreibung) und XHTML (zwingend Kleinschreibung, ausnahmslos ALLE Attributwerte müssen in Anführungsstrichen geschrieben werden) - wobei ich letzteres empfehlen würde.
Werd ich tun.
Das heißt also, Deine index.php holt sich per $_GET["link"] den eingegebenen Namen und tut dann WAS damit? Vielleicht solltest Du - da es sich um ein PHP-Problem handelt, entsprechend relevanten PHP-Quellcode posten - wie Dein HTML-Formular aussieht, ist vollkommen irrelevant.
Ich bin mir nicht ganz sicher welchen Teil du jetzt brauchst.
Aber ich vermute mal den Include-Befehl...
Sieht so aus:
<?php $link=$HTTP_GET_VARS['link'];
if (empty ($link)) { include ("beispielinhalt.php");}
else if (file_exists("$link.php"))
{ include("$link.php"); }
?>
Hoffe das reicht, damit du meine Frage beantworten kannst.
Und sorry wenn ich mich etwas schwer tue... Ich hab wie gesagt davon kaum Ahnung.
Mahlzeit,
Dass Du damit, wenn Du hier nicht SEHR VORSICHTIG bist, potentiell ein riesengroßes Scheunentor aufreißt, ist Dir bewusst?
Nein, habe ich bisher wirklich nicht bedacht. Aber ich glaube ich ahne wo das Problem liegt.
Was passiert denn z.B., wenn ich Dein Skript mit folgender URL aufrufe:
http://www.example.org/beispiel.php?link=../../../etc/passwd
Angenommen, Dein Skript läuft auf einem UNIX/Linux-System im Standard-Apache-Verzeichnis /var/www/htdocs und ist nicht ausreichend abgesichert - dann zeigt es mir schön die gesamte Passwort-Datei. Also bevor Du Benutzereingaben ungeprüft in Pfad- bzw. Dateiangaben einbaust, überlege Dir GENAU, was Du eigentlich willst.
Hast du Tips wie ich diese Sache etwas absichern könnte?
Ja. Betrachte grundsätzlich ALLE Eingaben als möglichen Einbruchsversuch: ALL INPUT IS EVIL!
Ich bin mir nicht ganz sicher welchen Teil du jetzt brauchst.
Aber ich vermute mal den Include-Befehl...Sieht so aus:
<?php $link=$HTTP_GET_VARS['link'];
if (empty ($link)) { include ("beispielinhalt.php");}
else if (file_exists("$link.php"))
{ include("$link.php"); }
?>
1. Das Array $HTTP_GET_VARS ist sowas von veraltet - nutze stattdessen $_GET!
2. Ausgehend von meinem Beispiel oben: file_exists("/var/www/htdocs/../../../etc/passwd") ergibt - bei mangelhaft abgesichertem Webserver - sehr wohl ein TRUE, so dass die zentrale Passwort-Datei ohne weitere Nachfragen ausgegeben wird.
Besser wäre z.B. folgende Konstruktion (ohne Anspruch auf Vollständigkeit):
if (empty($link))
{
$file = "beispielinhalt.php";
}
else
{
switch ($link)
{
case "1":
case "seite1":
case "tomaten":
$file = "seite1.php";
break;
case "2":
case "seite2":
case "bohnen":
$file = "seite2.php";
break;
case "3":
case "seite3":
case "steaks":
$file = "seite3.php";
break;
default:
$file = "beispielinhalt.php";
}
}
include($file);
So werden nur von Dir festgelegte Dateien includiert - und auch nur, wenn entsprechend gültige Parameter übergeben werden. Wenn nichts oder ein unbekannter Wert für "link" angegeben wird, erscheint wieder die Beispielseite.
Und sorry wenn ich mich etwas schwer tue... Ich hab wie gesagt davon kaum Ahnung.
Genau deswegen sollte Du alles lieber dreimal überdenken, bevor Du potentiell unsicheren Code auf die Welt loslässt. Und fragen hier im Forum ist schonmal ne gute Idee! :-)
MfG,
EKKi