+apache: Datenübergabe funktioniert nicht?
Andreas-Lindig
- php
Hallo Forum,
mein neu installieres PHP mit neuem apache laeuft nicht richtig, und zwar werden die Seiten zunaechst richtig aufgerufen, aber mir scheint, immer dann, wenn man Daten an das naechste Script uebergibt kommen die nicht an. Die PHP-info() Ausgabe sieht ganz gut aus:
http://extra.andeas-lindig.de/php_fragen/php_info.html,
aber:
PhpMyAdmin z.B. zeigt zunaechst alle Datenbanken und Tabellen an, aber wenn man eine Datenbank anklickt: "keine Tabellen gefunden"
Ich habe mal ein einfaches Testscript geschrieben:
<?
echo "angeklickte Nummer: ".$nummer; <-beachte hier!
echo "<br><br><br>";
?>
<form action="<?$PHP_SELF?>" >
<input name="nummer" type="radio" value="1"> 1<br>
<input name="nummer" type="radio" value="2"> 2<br>
<input name="nummer" type="radio" value="3"> 3<br><br>
<input type="submit">
</form>
zu testen hier:
http://extra.andeas-lindig.de/php_fragen/php_test.php
Die uebergebene Nummer des Radio-Buttons sollte ja oben in die Seite geschrieben werden. Wird sie bei mir aber nicht - im query-String erscheint sie allerdings, also z.B.:
'http://localhost/php_test.php?nummer=1'
vielen Dank, Andreas
Hallo Forum,
mein neu installieres PHP ...
Daran hängt es. Seit 4.2 ist register_globals standardmäßig ausgeschaltet. Du solltest im Forum und Archiv ne Menge dazu finden.
<?
$nummer = $_POST["nummer"];
echo "angeklickte Nummer: ".$nummer; <-beachte hier!
echo "<br><br><br>";
?>
<form action="<?$PHP_SELF?>"
method="post">
<input name="nummer" type="radio" value="1"> 1<br>
<input name="nummer" type="radio" value="2"> 2<br>
<input name="nummer" type="radio" value="3"> 3<br><br>
<input type="submit">
</form>
...oder oben $_GET["nummer"] und method="get".
http://www.php.net/manual/en/language.variables.predefined.php
Gruß, Jan
hallo, Jan
Du solltest im Forum und Archiv ne Menge dazu finden.
tja, wenn man da mal reinkommt...
$nummer = $_POST["nummer"];
Bitte??? soll ich jetzt alle meine Scripte umschreiben?
Ich habe nicht nur dieses Testscript, sondern z.B. einen funktionierenden online-shop mit Redaktionssystem.
<form action="<?$PHP_SELF?>"
method="post">
Hier habe ich nur vergessen zu schreiben. 'method' steht im Script auf 'get', damit du in der Adresszeile Deines Browsers was sehen kannst.
Gruß, Andreas
Moin!
$nummer = $_POST["nummer"];
Bitte??? soll ich jetzt alle meine Scripte umschreiben?
Ich habe nicht nur dieses Testscript, sondern z.B. einen funktionierenden online-shop mit Redaktionssystem.
Ja, sollst du. Hättest du es man gleich schon so gemacht, wie seit einiger Zeit von PHP vorgeschlagen. Mindestens seit PHP Version 4.1 gibt es die Arrays $_POST etc, und auch der Hinweis, dass in neueren Versionen aus Sicherheitsgründen register_globals=off geschaltet ist, sollte mittlerweile ziemlich häufig auch in diesem Forum zu lesen gewesen sein. Dass du dir auf diese Weise einige Sicherheitslücken eingebaut haben könntest, ist dir hoffentlich klar. Ich verweise zu Erklärungszwecken nur auf http://forum.de.selfhtml.org/archiv/2002/6/15268/#m85650 (und den Thread insgesamt), um zu zeigen, an was man alles denken muß, wenn man programmiert.
Das Problem ist immer, dass mit register_globals=on der Benutzer Variablen im Skript erzeugen kann, die später unter Umständen nicht initialisiert werden, und dann vorbelegt durch den Angreifer im weiteren Verlauf des Skriptes verwendet werden - was unter Umständen verheerende Auswirkungen haben kann. Man _kann_ auch mit register_globals=on sichere PHP-Skripte programmieren, aber es ist deutlich aufwendiger.
- Sven Rautenberg
Ja, sollst du.
Oh, je...
Hättest du es man gleich schon so gemacht, wie seit einiger Zeit von PHP vorgeschlagen.
ja, ich bin mangels Internet-Anschluß ehrlich gesagt nicht so auf dem Laufenden.
Mindestens seit PHP Version 4.1 gibt es die Arrays $_POST etc
siehst Du, und ich hatte bisher Version 4.0.2
...dass in neueren Versionen aus Sicherheitsgründen register_globals=off geschaltet ist, sollte mittlerweile ziemlich häufig auch in diesem Forum zu lesen gewesen sein.
wie gesagt kann ich nur selten hier sein.
Dass du dir auf diese Weise einige Sicherheitslücken eingebaut haben könntest, ist dir hoffentlich klar...
nein bisher nicht
Das Problem ist immer, dass mit register_globals=on der Benutzer Variablen im Skript erzeugen kann, die später unter Umständen nicht initialisiert werden, und dann vorbelegt durch den Angreifer im weiteren Verlauf des Skriptes verwendet werden...
da heißt, er schickt im query-String eine variabel=wert mit?
aber dann muß er doch meine Variablennamen kennen, oder? bzw. 'wird nicht initialisiert' hieße für mich jetzt eine Fehlermeldung, aber die Variable wird im Script doch gar nicht wieder aufgerufen.
Gruß, Andreas
Ja, sollst du.
Oh, je...
Niemand hat gesagt, dass es einfach wird. Aber ab PHP Version 4.3 gibts auch keine Arrays $HTTP_POST_VARS (usw.) mehr - die Umstellung betrifft also einige Skripte (aber bei denen kann man mit Suchen/Ersetzen einfach umstellen).
Auch du kannst mit Suchen/Ersetzen die im Skript verwendeten Variablen in PHP-kompatible Versionen wandeln. Aber du mußt etwas aufpassen und den jeweiligen Kontext der Operation betrachten. Ausgaben funktionieren beispielsweise auf die alte Art so:
echo "Sie haben $eingabe eingegeben!";
Wenn du $eingabe durch $_POST['eingabe'] ersetzt (so simpel ist das im Prinzip), dann wird diese Zeile eine Fehlermeldung ausgeben. Denn Arrays kann man nicht einfach so innerhalb von Strings ansprechen, sondern muß z.B. geschweifte Klammern drumherumsetzen.
echo "Sie haben $_POST['eingabe'] eingegeben!"; ist falsch
echo "Sie haben {$_POST['eingabe']} eingegeben!"; ist richtig.
echo "Sie haben ".$_POST['eingabe']." eingegeben!"; ist auch richtig
Die letzte Variante benutzt schlichte Stringverkettung für die Ausgabe.
Das Problem ist immer, dass mit register_globals=on der Benutzer Variablen im Skript erzeugen kann, die später unter Umständen nicht initialisiert werden, und dann vorbelegt durch den Angreifer im weiteren Verlauf des Skriptes verwendet werden...
da heißt, er schickt im query-String eine variabel=wert mit?
aber dann muß er doch meine Variablennamen kennen, oder? bzw. 'wird nicht initialisiert' hieße für mich jetzt eine Fehlermeldung, aber die Variable wird im Script doch gar nicht wieder aufgerufen.
Richtig, die Variablennamen müßte er kennen. Aber er kann ja auch gut raten. Meist sind die Namen doch hinreichend trivial gewählt, oder sie tauchen in Formularen und URL-Zeilen auf - daran kann man ja mal testweise herummanipulieren.
"Nicht initialisiert" bedeutet, dass du mitten im Skript plötzlich den Wert einer Variablen benutzt, ohne ihn ihr vorher zugewiesen zu haben. Wenn du das Mörderskript, was ich im Link auseinandergenommen habe, mal genauer durchsiehst: Ganz am Anfang wird eine mySQL-Abfrage durchgeführt, und wenn die Erfolg hat, werden gewisse Variablen auf Startwerte gesetzt. Wenn aber mySQL gerade nicht antwortet, dann werden die Startwerte nicht gesetzt, und eingeschmuggelte Werte wären wirksam.
Bei der Prüfung auf Sicherheit geht es nicht darum, was ein durchschnittlich dummer Benutzer am System anrichten kann, sondern was ein maximal informierter Angreifer anrichten könnte. Ein Skript ist sicher, wenn sich damit nichts außer dem _gewünschten_ Zweck anstellen läßt. Es ist nun leider ziemlich aufwendig, zu beweisen, dass ein Skript sicher ist, deshalb ist leichter zu prüfen, ob möglicherweise undefinierte Systemzustände erreicht werden können, wenn man alle unglücklichen Umstände, die ja theoretisch eintreten können, auch wirklich eintreten. Und wenn man dann in Programmbereiche vorstoßen kann, zu denen man eigentlich gar nicht kommen dürfte, dann ist das Skript unsicher.
- Sven Rautenberg
dankeschön nochmal für die Zusatzinformationen
Richtig, die Variablennamen müßte er kennen. Aber er kann ja auch gut raten. Meist sind die Namen doch hinreichend trivial gewählt, oder sie tauchen in Formularen und URL-Zeilen auf - daran kann man ja mal testweise herummanipulieren.
das stimmt allerdings
---
kann ich denn diese Arrays '$_POST[]' etc. auch bei register_globals=on benutzten? Mein Hoster hat nämlich die Einstellung so.
Gruß, Andreas
Moin!
kann ich denn diese Arrays '$_POST[]' etc. auch bei register_globals=on benutzten? Mein Hoster hat nämlich die Einstellung so.
Ja klar, das ist sogar sehr empfehlenswert. Allerdings hast du dann keinen Sicherheitsgewinn, weil Variablen ja immer noch eingeschleppt werden können. Aber sollte der Provider irgendwann mal umstellen, hast du keine Probleme.
- Sven Rautenberg
Hallo Andreas
$nummer = $_POST["nummer"];
Bitte??? soll ich jetzt alle meine Scripte umschreiben?
Ich habe nicht nur dieses Testscript, sondern z.B. einen funktionierenden online-shop mit Redaktionssystem.
Ich glaube die Entscheidung, register_globals auszuschalten, war schon länger angekündigt und ist eigentlich auch sinnvoll.
Wenn du nicht alles umschreiben willst, mußt du register_globals in der php.ini wieder auf 'on' setzen, oder dir mal
http://www.php.net/manual/en/function.import-request-variables.php
anschauen.
Gruß, Jan
Hallo, Andreas,
- PhpMyAdmin z.B. zeigt zunaechst alle Datenbanken und Tabellen an, aber wenn man eine Datenbank anklickt: "keine Tabellen gefunden"
Darauf weiß ich leider keine Antwort. Benutzt du die neuste Version?
<?
^^^ Benutze lieber die volle PI-Syntax: <?php
echo "angeklickte Nummer: ".$nummer; <-beachte hier!
echo "<br><br><br>";
^^^^^^^^^^^^ Pfui! ;)
?>
Wenn register_globals ausgeschaltet ist, musst du die GET-Parameter aus den Arrays $HTTP_GET_VARS bzw $_GET lesen:
$HTTP_GET_VARS['nummer'] bzw. besser $_GET['nummer']
waere nett, wenn mir jemand sagen koennte, welche Zeilen ich da genau noch einstellen muþ, ich habe davon n‰mlich keine ahnung.
Lass register_globals lieber aus und gewöhne dich daran, die o.g. Arrays zu benutzen. Siehe auch http://www.php.net/manual/de/language.variables.predefined.php und http://www.php.net/manual/de/security.registerglobals.php. Im Archiv findest du auch viel Material zu register_globals.
Mathias
Hi!
Bei mir gehts!!!
Hi!
Bei mir gehts!!!
was, die Testdatei?
ja, klar, die liegt ja auch bei meinem Provider und da funktionieren alle meine Scripte - bisher auch bei mir zuhause, nur eben jetzt nicht mehr. Es geht um die Einrichtung meiner häuslichen Testumgebung.
Gruß, Andreas
Hallo Andreas
Könnte es sein, dass deine Scripte auf der php Version 4.1 basieren?
In diesem Fall ist zu beachten, dass aus Sicherheitsgründen der Gebrauch von globalen Variablen wie get und post ab der version 4.2.X standardmässig gesperrt wurden.
In der Datei php.ini kann die entsprechende anpassung vorgenommen werden...ist alledings nicht zu empfehlen.
Ausführliche angaben unter:
http://www.kofler.cc/pdf/mysql-update-php42.pdf
Gruss roman
Vielen Dank an alle,
das waren ja richtig schnelle Informationen.
jetzt muß ich mich da mal einlesen und kucken...
Gruß, Andreas