Archiv verlassen und diese Seite im Standarddesign anzeigen : doppelter seitenaufruf.. warum?
enforcer 06-02-2007, 14:34 OK... Ich fange einfach mal von Grund auf an und erkläre was ich zusammengebaut habe.
Ich habe eine index.php. Auf dieser Seite wird über include("$_GET["page"]"); eine Seite eingebunden, die dann wechseln soll.
Die Variable wird bei mehrseitigen Formularen über den action-Teil geändert.
Die Änderung erfolgt so:
<form id="form1" name="form1" method="post" action="
<?php
$url_alt = $_SERVER["PHP_SELF"]."?".$_SERVER["QUERY_STRING"];
// Auslesen der gesamten URL
$url_neu = str_replace($_GET["page"], "order" , $url_alt );
// Auslesen des Wertes der Variablen und ersetzen durch neue Var
echo $url_neu;
// Ausgabe der neuen URL...
?>">
D.h. die POST-Daten werden an die neue URL übermittelt. Eigentlich dachte ich das funktioniert so. Aber auf der letzten Seite möchte ich die Daten per Mail verschicken.
Diese Mail wird nun immer 2 Mail verschickt. Leider weiß ich nicht so ganz warum. Ich vermute, dass die Seite 2 mal aufgerufen wird. Aber auch hier weiß ich nicht warum das so sein sollte...
Bin langsam am verzweifeln, da ich alles nur ungern nochmal neu schreiben würde.
Ich bin für jeden Tip dankbar. Auch für Kritik. Aber bitte versucht bei Kritik auch einen Verbesserungsvorschlag zu machen mit dem nicht nur Profis was anfangen können!
Danke
Grüße Tobias
und was hilft uns dieser codeschnipsel da oben?
enforcer 06-02-2007, 14:46 so rufe ich die neue Seite auf. Aber das ist wohl egal.
Auf der index.php steht folgendes:
include($_GET["page"].".php");
in dem Browser wird folgende URL direkt eingegeben:
http://localhost/index.php?page=components/module/order
Es wird also die order.php in der index.php eingebunden. In der order.php wird über mail() eine Mail verschickt. Diese Mail wird aber immer 2 Mail verschickt und ich weiß nicht warum.
Wenn ich die order.php über
http://localhost/components/module/order.php aufrufe, dann gehts und die Mail wird nur ein mal verschickt...
Original geschrieben von enforcer
Auf der index.php steht folgendes:
include($_GET["page"].".php");
Dann beseitige bitte diese immense Sicherheitslücke als allererstes!
enforcer 06-02-2007, 14:58 Da ich nicht der Profi bin (wie schon beschrieben)... wie binde ich dann Seiten ein, bzw. wie übergebe ich neue Seiten, wenn nicht über $_GET?
Wenigstens ein Stichwort wonach ich suchen muss....
Ich habe versucht mich daran zu halten
http://www.it-academy.cc/article/1470/Include+sicher+verwenden.html
Die Endung erst im Script hinzufügen...
Original geschrieben von enforcer
Wenigstens ein Stichwort wonach ich suchen muss....
http://www.google.de/search?q=sicherheitsl%C3%BCcke+%24_GET+include
Ja, ich weiss - wahnsinnig schwer, auf sowas selber zu kommen ...
Auf der index.php steht folgendes: include($_GET["page"].".php");
Brandgefährlich!!
Bei aktivierten Url-Wrappern holst du dir damit u.U. Tot und Teufel ins Haus!!
Edit:
Och, viel zu spät...
enforcer 06-02-2007, 15:06 Ich habe ja schon geschrieben wie ich vorgegangen bin...
Ich habe in Google "inlude $_GET" eingegeben und unter anderem obige Seite erhalten.
Da stehts so drin, so hab ichs gemacht.
Aber abgesehen von dem Sicherheitsproblem verstehe ich immer noch nicht, warum meine Mail dann 2mal verschickt wird.
Sollte dies hier ein Forum sein, indem Fragen weniger Wissenden nicht gerne gesehen sind, dann ist das ok und ich such mir ein anderes.
Aber bitte sagt mir das dann.
Zur Sicherheit
Was wäre wenn ich schreibe:
include("folder".$GET["page"].".php");
Dann müsste die File doch auf meinem Server im Ordern folder liegen und die endung php haben, oder?
Das wäre doch dann sicher...
Shurakai 06-02-2007, 15:13 Wenn ich auf meine Page schreibe: Spring von der Brücke, um eine Million Euro zu bekommen und du bei google nach "Million Euro" suchst, würdest du es dann auch tun?
Im Internet steht _SEHR_ viel Scheiße über sowas!
Nimm n vernünftiges switch-case Konstrukt und filtere nur die erlaubten Seiten heraus. Beispiele gibts dazu genug.
Hauptsache das $_GET kommt aus dem include raus, weil damit wäre es mir ein leichtes, Zugriff auf alle deine Daten zu bekommen :-)
Griecherus 06-02-2007, 15:15 Du solltest den übergebenen Parameter gegen eine Liste gültiger Datei-Namen checken, dann hast du da auch keine Sicherheitslücke in der Größe eines Scheunentors mehr.
$pages = array(
'page_a.ext',
'page_b.ext',
'page_c.ext',
);
$page = $_GET['page'];
if (in_array($page, $pages))
{
include $page;
}
else
{
die; // oder bspw. inkludieren der startseite
}
Original geschrieben von enforcer
Sollte dies hier ein Forum sein, indem Fragen weniger Wissenden nicht gerne gesehen sind, dann ist das ok und ich such mir ein anderes.
Aber bitte sagt mir das dann.
Im Gegenteil.
Aber ein wenig Grundlagenwissen setzen wir schon voraus, und Themen wie gerade dieses naive Einbinden von allem möglichen per include wurden schon zigfach behandelt.
Dieses Problem musst du zuerst beseitigen - andernfalls ist deine Seite mit allerhöchster Wahrscheinlichkeit so leicht angreifbar, dass alles weitere was du vielleicht mit Hilfe von hier erstellst schon morgen wieder von jedem x-beliebigen über's www gelöscht werden könnte.
Was wäre wenn ich schreibe:
include("folder".$GET["page"].".php");
Dann müsste die File doch auf meinem Server im Ordern folder liegen und die endung php haben, oder?
Nein, maximal letzteres - aber aus dem Verzeichnis folder kommt damit jeder heraus, der weiss wie man ins nächsthöhere Verzeichnis wechselt.
enforcer 06-02-2007, 15:43 also dann eher so
switch($_GET["page"])
case seite1: include("seite1.php"); break;
case seite2: include("seite2.php"); break;
Ich hoffe schon, dass ich etwas Grundwissen mitbringe, aber über dieses Einbinden steht nichts in meinen 2 Büchern bzgl. Sicherheitsaspekt. Und das suchen bei Google war dann wohl auch nicht das wahre, da ich mich an falsche Infos gehängt habe.
Wenn ich wüsste wo ich darüber nachlesen kann wie ich Seiten sicher einbinde ohne Sie fest zu definieren wie bei switch-case würde ich da nachlesen.
ich kann doch für eine HP mit 100 Seiten keine 100 cases aufstellen...
und Themen wie gerade dieses naive Einbinden von allem möglichen per include wurden schon zigfach behandelt.
war ja ursprücnglich eigentlich gar nicht meine Frage
Original geschrieben von enforcer
also dann eher so
switch($_GET["page"])
case seite1: include("seite1.php"); break;
case seite2: include("seite2.php"); break;
Nur, wenn du irgendwo auch die beiden Konstanten seite1 und seite2 definiert hast - hast du?
Ich hoffe schon, dass ich etwas Grundwissen mitbringe, aber über dieses Einbinden steht nichts in meinen 2 Büchern bzgl. Sicherheitsaspekt.
Was muss dazu erst in Büchern stehen, damit man sowas erkennt?
Du nimmst einfach das als Dateinamen, was per Parameter übergeben wird. Dass dieser Parameter sich durch jeden Benutzer beliebig ändern lässt, sollte klar sein.
Also sollte mit gesundem Menschenverstand ebenso glasklar sein, dass das ohne Überprüfung des Wertes ein erhebliches Risiko darstellt.
Wenn ich wüsste wo ich darüber nachlesen kann wie ich Seiten sicher einbinde ohne Sie fest zu definieren wie bei switch-case würde ich da nachlesen.
ich kann doch für eine HP mit 100 Seiten keine 100 cases aufstellen...
Du musst nicht über jeden Kleinkram etwas nachlesen - du darfst es auch mit selbst Nachdenken versuchen.
Beispielsweise ein Array liesse sich auch sehr simpel nutzen, um darin erlaubte Werte zu definieren, und dann den übergebenen Wert dagegen abzuprüfen - und entsprechend zu reagieren.
war ja ursprücnglich eigentlich gar nicht meine Frage
Mag sein, aber es ist dein allerdringendstes Problem, welches zuallererst gelöst werden muss, damit du nicht dich selbst und andere gefährdest.
(Weil dein Server sonst ganz schnell bspw. zur Spam-Schleuder, oder auch zum Warez- oder Kinderporno-Hostingservice werden kann.)
enforcer 06-02-2007, 16:12 OK. Nächster versuch.
Ich habe eine Datei sessions.inc.php erstellt.
Da hab ich nun folgendes drinstehn:
$sections = array();
$sections['startseite'] = "components/com_content/start.php";
$sections['seite1'] = "components/com_content/seite1.php";
In meiner index.php wird das nun wie folgt eingebunden:
if(isset($_GET['page']) AND isset($sections[$_GET['page']]))
{
include $sections[$_GET['page']];
}
else
{
include $sections['start'];
}
Ist das nun sicher? :dontknow:
Ja, das ist schon besser.
(Allerdings bleibt es IMHO nach wie vor eine Unsitte, bei fehlerhaften Parametern kommentarlos auf die Startseite zu verzweigen. Für solche Fälle ist eine 404 Not Found-Seite die richtigere Wahl.)
enforcer 06-02-2007, 16:21 ok.. Dann werd ich mal alles umbauen und mich wegen meinem Problem mit den doppelten Mails nochmal melden..
Danke vielmals.
enforcer 06-02-2007, 16:59 ok.. hab nun alles umgebaut.
Die Email kommen trotzdem noch doppelt an... warum?
in der Datei steht nur:
mail('meine@email.de', 'Test6', 'Hallo, das ist ein Test');
aufgerufen wird diese über
domain.de/index.php?page=test
wobei test im array festgelegt ist.
Wenn ich die Datei direkt aufrufe domain.de/folder1/folder2/file.php
dann wird die Email nur einmal verschickt. Kommt dies durch das includen?
Das lässt sich so pauschal kaum sagen.
Erst mal solltest du feststellen, ob das mit allen Browsern der Fall ist (beim Firefox erinnere ich mich da dunkel an Probleme mit gewissen Vorlade-Techniken o.ä.)
Und ein Blick in die Server-Logs (oder eigene Protokollierung der Umgebung wie $_SERVER und Request-Variablen) könnte auch nicht schaden, vielleicht fällt dabei ja was auf.
|
-
- |