post
Karl Hinzer
- php
Hallo,
vor einigen Jahren habe ich mal einen VHS PHP-Wochenendkurs belegt und u.a.. dieses kleine Programm erstellt. Heute wollte ich mich mal wieder mit PHP beschäftigen, aber nun funktioniert das Programm nicht mehr. Ich habe PHP5.2.0 installiert, im Kurs hatten wir noch PHP4 - ist das evtl. die Ursache für mein Problem?
Im Internet Explorer 7 starte ich ud05.htm , ich treffe meine Auswahl und dann sende ich das Formular ab.
Von ud05.php bekomme ich dann:
"Sie möchten also nach in ein Sterne Hotel ..."
ohne, dass meine Auswahl berücksichtigt wurde!
Ich würd mich sehr freuen, wenn da mal jemand einen Blick rein wirft - wahrscheinlich eine Kleinigkeit für Euch...
Vielen Dank schon mal im Voraus, Gruß Kalle
ud05.htm :
<html>
<body>
Bitte treffen Sie jeweils eine Auswahl und senden Sie das Formular
ab:
<form action = "ud05.php" method = "post">
<input type="radio" name="rziel" value="Gomera" checked>
Wandern auf Gomera<p>
<input type="radio" name="rziel" value="Lanzarote">
Sonnen auf Lanzarote <p>
<input type="radio" name="rziel" value="Fuerteventura">
Surfen auf Fuerteventura<p>
<hr>
<input type="radio" name="htyp" value="Drei" checked>
Drei-Sterne Hotel<p>
<input type="radio" name="htyp" value="Vier">
Vier-Sterne Hotel<p>
<input type = "submit">
<input type = "reset">
</form>
</body>
</html>
--------------------
ud05.php :
<html>
<body>
<?php
echo "Sie möchten also nach $rziel in ";
echo " ein $htyp Sterne Hotel<p>";
if ($rziel == "Gomera")
{
if ($htyp == "Drei") $ang = 7;
else $ang = 1;
}
else if ($rziel == "Lanzarote")
{
if ($htyp == "Drei") $ang = 12;
else $ang = 2;
}
else
{
if ($htyp == "Drei") $ang = 5;
else $ang = 4;
}
echo "Dazu haben wir $ang Angebote";
?>
</body>
</html>
Hi,
du musst in deinem php dokument die post-variablen reinholen:
$ziel = $_POST['rziel'];
usw.
das machst du mit allen elementen die du auswerten willst.
ud05.php :
<html>
<body>
<?php
echo "Sie möchten also nach $rziel in ";
echo " ein $htyp Sterne Hotel<p>";if ($rziel == "Gomera")
{
if ($htyp == "Drei") $ang = 7;
else $ang = 1;
}else if ($rziel == "Lanzarote")
{
if ($htyp == "Drei") $ang = 12;
else $ang = 2;
}else
{
if ($htyp == "Drei") $ang = 5;
else $ang = 4;
}echo "Dazu haben wir $ang Angebote";
?>
</body>
</html>
du musst die variablen $rziel und $htyp auch mit den werten des formulars füllen!
also so:
$rziel = $_POST["rziel"];
$htyp = $_POST["htyp"];
dann sollte es gehen!
Moin!
vor einigen Jahren habe ich mal einen VHS PHP-Wochenendkurs belegt und u.a.. dieses kleine Programm erstellt.
ud05.php :
<html>
<body>
<?php
echo "Sie möchten also nach $rziel in ";
echo " ein $htyp Sterne Hotel<p>";// der Rest des Skripts …
?>
So etwas lernt man bei der Volkshochschule? Ich kann es kaum glauben! Über die Sache mit [register_globals](http://de3.php.net/manual/de/security.globals.php) wollen wir mal hinweg sehen, aber in der Ausgabe klafft eine dicke [Cross-Site-Scripting](http://de.wikipedia.org/wiki/XSS)-Lücke. Stell dir mal vor, `$rziel = '<script type="text/javascript">doEvilJavaScriptHacking();</script>';`{:.language-php}, dann ergäbe die Ausgabe – richtig – HTML-Code mit eingebettetem JavaScript, z.B. um Sessions zu klauen, Exploits im Browser auszuführen, …
Ach nein, wir wollen doch nicht über register\_globals hinwegsehen: Du hast ja schon den Tipp bekommen, über `$_POST`{:.language-php} an die Variablen heranzukommen. Nun, wenn register\_globals eingeschaltet ist, d.h. das Formularfeld "rziel" korrespondiert direkt mit der Variablen `$rziel`{:.language-php}, bedeutet das, dass PHP \_nicht\_ danach schaut, ob rziel von GET, POST oder per Cookie übertragen wurde. Das komfortable an deinem Skript für einen Angreifer wäre dann, dass er nur den URI manipulieren bräuchte:
http://example.com/karl/hinzer/vhs/ud05.php?rziel=%3Cscript%20type=%22text/javascript%22%3EdoEvilJavaScriptHacking();%3C/script%3E
Damit enthält `$rziel`{:.language-php} den gleichen Schadcode wie oben.
> Heute wollte ich mich mal wieder mit PHP beschäftigen, aber nun funktioniert das Programm nicht mehr. Ich habe PHP5.2.0 installiert, im Kurs hatten wir noch PHP4 - ist das evtl. die Ursache für mein Problem?
Nein, wie schon gesagt, in deinem Kurs war register\_globals (php.ini-Einstellung) noch auf "on", aus Sicherheitsgründen sollte es aber deaktiviert, "off", sein.
Mein Tipp wenn du wieder mit PHP anfängst: Lies dir mal das Kapitel [Sicherheit](http://www.php.net/manual/de/security.php) in der PHP-Doku durch.
Viele Grüße,
Robert
Hallo Robert.
vor einigen Jahren habe ich mal einen VHS PHP-Wochenendkurs belegt und u.a.. dieses kleine Programm erstellt.
ud05.php :
<html>
<body>
<?php
echo "Sie möchten also nach $rziel in ";
echo " ein $htyp Sterne Hotel<p>";// der Rest des Skripts …
?>
>
> So etwas lernt man bei der Volkshochschule? Ich kann es kaum glauben!
Ich dachte eher „VHS == Video“ …?
Einen schönen Montag noch.
Gruß, Mathias
--
ie:% fl:| br:< va:) ls:& fo:) rl:( n4:~ ss:) de:] js:| mo:| zu:)
debian/rules
Hallo Robert,
vor einigen Jahren habe ich mal einen VHS PHP-Wochenendkurs belegt und u.a.. dieses kleine Programm erstellt.
So etwas lernt man bei der Volkshochschule? Ich kann es kaum glauben!
bitte berücksichtige:
a) vor einigen Jahren,
b) Volkshochschule
c) Wochenendkurs
a) vor einigen Jahren war die php.ini-Einstellung register_globals = On Standard.
Auch nachdem es im Auslieferungszustand standardmäßig auf off geändert wurde,
blieben doch viele Hoster zunächst noch bei on, um nicht ihre Kunden zu
vergraulen, deren Skripte sich darauf verließen.
Eine kleine Archivsuche zu diesem Thema bringt viele, viele Threads ans
Tageslicht. Es werden zwar weniger, aber ab und an gibt es wieder einen
wie diesen hier.
Wie gesagt, vor einigen Jahren war das Standard - und es fand sich genau
so in PHP-Büchern und erst recht in Tutorials. Kein Wunder, dass es so
auch in der
b) Volkshochschule gelehrt wurde. Dort, wie anderswo, gibt es enorme
Unterschiede in der Qualität des vermittelten Lehrstoffs wie auch in der
Qualität der Vermittlung. Die Zielgruppe der Volkshochschule ist nicht
die der Hochschulen, das Kursniveau wird daher im Normalfall Uniniveau
nicht erreichen - und will es auch nicht.
c) Was erwartest Du von einem Wochenendkurs, d.h. vielleicht 16 UE?
Wahrscheinlich "Einführung in PHP". Eventuell auch für Programmieranfänger.
Welche Inhalte (inklusive Übungen) kannst Du in diesem Zeitraum vermitteln?
Welches Wissen kannst Du voraussetzen? Wenig.
Sicherlich wäre es wünschenswert, wenn in einem Programmierkurs die Vermittlung von sicherheitsrelevantem Wissen ganz oben in der Prioritätenliste stände. Wenn Du jedoch wegen lauter "Sicherheit" nicht mal ein einfaches "Hallo Welt"-Beispiel zum Laufen bekommst, dann hat der Wochenendkurs (über dessen Sinn man eh' streiten könnte) ganz sicher das Ziel verfehlt.
Deswegen bitte ich Dich, nicht zu harsch zu urteilen, sondern die Umstände zu berücksichtigen. In diesen Jahren hat sich viel getan, auch in Sachen Sicherheit. In diesen Jahren wurde viel Wissen zusammengetragen, auch in Sachen Ausnutzen von Lücken. Klar, nicht nur Du, auch viele andere (selbst ich) haben hier Fragenden oft empfohlen, ihre bisherigen Unterlagen wegzuwerfen - und neue, bessere zu suchen und zu verwenden.
Dies ist ein Prozess, der ständig weitergeht. So gibt es selbst heute noch Seiten im Internet, die die unsäglichen Magic Quotes als Sicherheitsmaßnahme empfehlen. Ich kann es kaum glauben. *scnr*
Ich freue mich schon auf die Zeiten, wenn PHP6 Standard sein wird - und die Magic Quotes verschwunden sein werden. Auch das PHP-Handbuch ist in dieser Hinsicht nicht in jeder Hinsicht empfehlenswert. Man sollte das dritte Beispiel bei mysql_real_escape_string() lesen,dazu den Abschnitt Why not to use Magic Quotes.
Freundliche Grüße
Vinzenz
Moin!
bitte berücksichtige:
a) vor einigen Jahren war die php.ini-Einstellung register_globals = On Standard. Auch nachdem es im Auslieferungszustand standardmäßig auf off geändert wurde, blieben doch viele Hoster zunächst noch bei on, um nicht ihre Kunden zu vergraulen, deren Skripte sich darauf verließen.
Zwischenfrage: Gab es damals einfach weniger XSS-Attacken, weil das entsprechende Sicherheitsgespür (auf beiden Seiten) noch nicht vorhanden war?
Das mit den Hostern ist echt ein Hammer: Anstatt den Kunden darauf hinzuweisen, dass er unsicher programmiert und damit eventuell die Serversicherheit gefährdet, einfach „nett lächeln und winken“. Wahrscheinlich wurde stattdessen das Backup besser automatisiert.
Wie gesagt, vor einigen Jahren war das Standard - und es fand sich genau so in PHP-Büchern und erst recht in Tutorials.
Mein lieber Scholli.
Das erinnert mich an meinen Einstieg in C: Das Buch dafür (Titel leider entfallen) war alt und staubte in der Stadtbücherei vor sich hin, war aber sonst echt spitze: An jeder Stelle wurde darauf hingewiesen, dass man auf die Pointer aufpassen muss, sonst …
b) Kein Wunder, dass es so auch in der Volkshochschule gelehrt wurde. Dort, wie anderswo, gibt es enorme Unterschiede in der Qualität des vermittelten Lehrstoffs wie auch in der Qualität der Vermittlung.
Aber trotzdem bin ich bislang davon ausgegangen, dass dort keine „gefährlichen“ oder „falschen“ Inhalte vermittelt werden, schließlich sind es ja öffentlich-rechtliche, allgemeine Bildungseinrichtungen.
Die Zielgruppe der Volkshochschule ist nicht die der Hochschulen, das Kursniveau wird daher im Normalfall Uniniveau nicht erreichen - und will es auch nicht.
Sicheres Programmieren ist keine Sache der Intelligenz, dass kann man auch einfach „trainieren“, genauso, wie ein Bauarbeiter die Sicherheitsregeln für seine Arbeit „implantiert“ bekommt.
c) Was erwartest Du von einem Wochenendkurs, d.h. vielleicht 16 UE? Wahrscheinlich "Einführung in PHP". Eventuell auch für Programmieranfänger. Welche Inhalte (inklusive Übungen) kannst Du in diesem Zeitraum vermitteln? Welches Wissen kannst Du voraussetzen? Wenig.
Ich erwarte von so einem Kurs, dass er einen Überblick über die Programmiersprache gewährt, so dass man damit die ersten Schritte tätigen kann, wobei auch gewisse Fallen und Tricks nicht außen vor bleiben dürfen. Die meisten Sicherheitslücken, die täglich über heisec in die Welt getickert werden, sind im Grunde uralt: Buffer Overflows (seit wann gibt es Computer?), XSS (seit wann gibt es das WWW?), Phishing (seit wann gibt es Betrug?). Und trotzdem werden immer noch solche Fehler gemacht.
Sicherlich wäre es wünschenswert, wenn in einem Programmierkurs die Vermittlung von sicherheitsrelevantem Wissen ganz oben in der Prioritätenliste stände. Wenn Du jedoch wegen lauter "Sicherheit" nicht mal ein einfaches "Hallo Welt"-Beispiel zum Laufen bekommst, dann hat der Wochenendkurs (über dessen Sinn man eh' streiten könnte) ganz sicher das Ziel verfehlt.
So, was kommt denn meistens nach dem „Hallo Welt“ – richtig, „Hallo Du“, auf PHP:
<form action="[code lang=php]<?php echo htmlspecialchars($_SERVER['PHP_SELF']) ?>
" method="post">
<p><label for="derName">Name</label> <input type="text" name="Name" id="derName" size="25"></p>
<button type="submit">Grüßen</button>
</form>[/code]
<?php
if (array_key_exists('Name', $_POST) && ($name = $_POST['Name']))
echo '<p>', htmlspecialchars($name), '</p>';
?>
Deswegen bitte ich Dich, nicht zu harsch zu urteilen, sondern die Umstände zu berücksichtigen. In diesen Jahren hat sich viel getan, auch in Sachen Sicherheit.
Wahrscheinlich sind es die angesprochenen Qualitätsunterschiede zwischen einzelnen VHS: Ich kenne die in Nordhessen, weil mein Vater dort jahrelang als Dozent für EDV tätig war. In seine Kurse kamen Büroleute, die von der Schreibmaschine auf den PC umgeschult wurden, da gehörte sowohl Qualität als auch angesichts der ganzen Viren Sicherheit einfach dazu. Deshalb war ich so überrascht, dass es da teilweise so starke Abweichungen gibt. Es war nicht harsch gemeint, sonder ich war halt einfach überrascht.
Ich freue mich schon auf die Zeiten, wenn PHP6 Standard sein wird - und die Magic Quotes verschwunden sein werden.
Wie lange dauert das denn noch :-)
Auch das PHP-Handbuch ist in dieser Hinsicht nicht in jeder Hinsicht empfehlenswert.
Ich bin ja mal auf den „Month of PHP-Bugs“ gespannt, der „Month of Apple-Bugs“ ist bislang eher langweilig, erst eine böse Lücke dabei.
Viele Grüße,
Robert
echo $begrüßung;
Ich freue mich schon auf die Zeiten, wenn PHP6 Standard sein wird - und die Magic Quotes verschwunden sein werden.
Ganz weg sind sie leider nicht, nur muss man sie nun bewusst auswählen. Ein in PHP 5.2 hinzugekommenes Feature, das sich um die sichere Übernahme der Eingabedaten kümmern soll, nennt sich Filter Functions. Und da gibt es einen Filter namens FILTER_SANITIZE_MAGIC_QUOTES, der alle Werte durch add_slashes() schickt.
Wie lange dauert das denn noch :-)
Du musst dich schon noch gedulden, bis die TODO-Liste abgearbeitet ist.
echo "$verabschiedung $name";
$begrüßung = 'Moin!';
echo $begrüßung;
;-)
Ich freue mich schon auf die Zeiten, wenn PHP6 Standard sein wird - und die Magic Quotes verschwunden sein werden.
Ganz weg sind sie leider nicht, nur muss man sie nun bewusst auswählen.
Also nichts Neues im Wes^Hb, schade.
Ein in PHP 5.2 hinzugekommenes Feature, das sich um die sichere Übernahme der Eingabedaten kümmern soll, nennt sich Filter Functions. Und da gibt es einen Filter namens FILTER_SANITIZE_MAGIC_QUOTES, der alle Werte durch add_slashes() schickt.
Dann hättest du aber grad „sichere Übernahme“ in Anführungszeichen schreiben müssen. Mit diesem Filter gewinnt man nichts dazu, das alte Sicherheitsproblem wird nur umbenannt.
Ich habe mir die Manual mal angeschaut, was ich dabei vermisse, wäre eine Möglichkeit, echo nen Filter mitzugeben bzw. für Ein- und Ausgabe getrennte Filter zu definieren. Aber dieses Feature ist noch jung, wir wollen nicht meckern.
Viele Grüße,
Robert
echo $begrüßung;
Ein in PHP 5.2 hinzugekommenes Feature, das sich um die sichere Übernahme der Eingabedaten kümmern soll, nennt sich Filter Functions. Und da gibt es einen Filter namens FILTER_SANITIZE_MAGIC_QUOTES, der alle Werte durch add_slashes() schickt.
Dann hättest du aber grad „sichere Übernahme“ in Anführungszeichen schreiben müssen. Mit diesem Filter gewinnt man nichts dazu, das alte Sicherheitsproblem wird nur umbenannt.
Die Betonung liegt auf "diesem", denn es gibt ja noch jede Menge anderer geeigneterer Filter. Zum Beispiel lässt sich EMail-Header-Injection verhindern, indem man den Filter FILTER_SANITIZE_STRING zusammen mit dem Flag FILTER_FLAG_STRIP_LOW (entfernt Steuerzeichen) verwendet.
$from = filter_input(INPUT_POST, 'from', FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW);
Leider ist das ein wenig aufwendig und man muss sowohl diese Möglichkeit kennen und anwenden wollen als auch wissen, dass man die Steuerzeichen rausfiltern muss, aber dann hat man damit einen harmlosen From-Wert.
Ich habe mir die Manual mal angeschaut, was ich dabei vermisse, wäre eine Möglichkeit, echo nen Filter mitzugeben bzw. für Ein- und Ausgabe getrennte Filter zu definieren. Aber dieses Feature ist noch jung, wir wollen nicht meckern.
Dieses Feature ist eigentlich auf Eingabedaten zugeschnitten und arbeitet mit den EGPCS-Werten ($_*, Superglobals). Leider vermischt es teilweise die Behandlung von Eingabedaten mit der Ausgabeaufbereitung, doch das wird vielen Anwendern egal sein, die das EVA-Prinzip nicht kennen. Aber neben filter_input() gibt es auch filter_var(), dem man eine beliebige, auch selbst erstellte oder aus anderen Quellen stammende Variable übergeben kann, was sich dann für das echo verwenden lässt.
echo filter_var($row['field'], FILTER_SANITIZE_SPECIAL_CHARS);
Nötig ist das so nicht, dafür gibt es ja bereits htmlspecialchars() (es sei denn, man hängt noch zusätzliche Filter-Flags an). Und guter Stil ist das auch nicht. Wenn es erst einmal so gekommen ist, dass schon ungewünschte Daten in der Datenspeicherung gelandet sind, sollte man seine Eingabedatenbehandlung überdenken oder seine Anwendung mehr nach EVA strukturieren.
echo "$verabschiedung $name";