PHP Variablen werden nicht weiter gegeben?

chrigu

chrigu

Aktives Mitglied
Thread Starter
Dabei seit
08.03.2004
Beiträge
155
Reaktionspunkte
0
Erlerne gerade den Umgang mit PHP und den Formularen, leider will es noch nicht so richtig, denn die Variablen werden scheinbar nicht ausgelesen.

//Ich habe hier mal als Beispiel das Formular:

PHP:
<html>
<body>
Bitte tragen Sie zwei Zahlen ein, und senden Sie das Formular ab:<br>
<form action="ud01.php" method="get">
<p> Wert 1: <input name="w1"></p>
<p> Wert 2: <input name="w2"></p>
<p><input type="submit"><input type="reset"></p>
</form>
</body>
</html>

// Das an die entsprechende PHP Seite: ud01.php weitergeleitet wird:

PHP:
<html>
<body>
<?php
	$erg = $_GET['$w1'] + $_GET['$w2'];
	echo "Die Summe von " . $_GET['$w1'] . " und " . $_GET['$w2'] . " ist $erg";
?>
</body>
</html>

// Ich erhalte dann als Ergebnis:

<html>
<body>
Die Summe von und ist 0
</body>
</html>

Kann mir jemand sagen wo hier der Wurm drin steckt?
Danke im voraus!
 
Zuletzt bearbeitet:
kein problem:

das zweite file muss so aussehen:

<html>
<body>
<?php
$erg = $w1+$w2;
echo "Die Summe von $w1 und $w2 ist $erg";
?>
</body>
</html>
 
@adi:

Hä? Unfug… ;)
Wenn die Globals Off sind, so wie es ab PHP5 standard ist, dann klappt das nicht. Außerdem ist das auch unsicher so.

@chrigu

Ersteinmal… warum übergibst du aus einem Formular mit GET? Mach das lieber mit POST.

Ich poste dir mal einen Auszug aus einem CMS, das ich gerade bastel, da kannst du sehen wie die Vars mit POST sicher übergeben werden.

PHP:
<?php
require_once('config.inc.php');
require_once('function.inc.php');
$date=date('Y.m.d');
echo'
    <html>
    <head>
    <meta http-equiv="content-type" content="text/html;charset=iso-8859-1"> 
    <meta http-equiv="expires" content="0">
    <meta http-equiv="pragma" content="no-cache">
    <meta name="robots" content="noindex,nofollow"> 
    <meta name="author" content="Olaf Beitzel, Yves Vogl">
    <link rel="stylesheet" type="text/css" href="default.css">
    <link rel="shortcut icon" href="img/'.$favicon[7].'">
    <title>Content Management System</title>
    </head>
    ';
$get_colours=mysql_query("Select hexcode from $db_tab_colours where id='$_POST[colour_id]'",$handler);
$colours=mysql_fetch_array($get_colours);
$replace_new=new replace();
$replace_new->replace_hexcode(&$colours['hexcode']);
unset($replace_new);
echo'
    <body bgcolor="'.$colours['hexcode'].'">
    ';
if($_POST['action']=='insert')
    {
    mysql_db_query($db_dbase,"insert into $db_tab (root_id,date,name) VALUES ('$_POST[root_id]','$date','$_POST[name]')");
    echo"<meta http-equiv=refresh content=\"0; URL=level0.php\">";
    }  
else
    {
    echo'
        <form action="'.$_SERVER['PHP_SELF'].'" method="post">
            <input type="hidden" name="action" value="insert">
            <input type="hidden" name="root_id" value="'.$_POST['root_id'].'">
            <input type="text" name="name" value="name"><br>
            <input type="submit" value="Insert">
        </form>
        ';
    }
?>
</body>
</html>
 
@aldi1981

Leider habe ich das auch schon probiert, aber das geht nur wenn die register_globals in der php.ini auf "on" sind, so viel ich jedenfalls weiss. Nun, wegen dieser angeblichen Sicherheitslücke will ich die auf "off" haben.

Ich habe in der FAQ gelesen, dass man die Variablen $w1 und $w2 in $_GET['w1'] oder $_POST['w1'] umändern sollte, doch hier habe ich Mühe, weil das doch so funktionieren sollte und es eben nicht tut. Ich werde die Vermutung nicht los, dass in meinem Script irdendwo ein Bug liegt.

Wer hat heute Adleraugen?
 
Aufs einfachste reduziert…

So sieht das Formular aus
PHP:
        <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
            <input type="text" name="value1"><br>
            input type="text" name="value2"><br>

            <input type="submit" value="Calculate">
        </form>


Die Variablen stehen dann als $_POST['value1'] und $_POST['value2'] nach Submitting des Formulars zur Verfügung.


Wenn du trotzdem mit GET arbeiten möchtest, kannst du das tun. Aber ich finde das unüblich und nicht sehr sinnig.

Zur Not kannst du übrigens mit $_REQUEST['varname']; an die entsprechenden Variablen wenn du dir nicht sicher bist, ob diese mit POST oder GET überliefert wurden.

Liebe Grüße


Yves
 
Hier, so funktioniert dein Script (hab das mal alles auf seine PHP Datei gecodet).

PHP:
<html>
<body>
<?php
if(isset($_POST['action']))
    {
    $result=$_POST['value_1']+$_POST['value_2'];
    echo 'Die Summe von '.$_POST['value_1'].' und '.$_POST['value_2'].' ist '.$result.'<p><a href="'.$_SERVER['PHP_SELF'].'" target="_self">Zur&uuml;ck</a>';
    }
else
    {
    echo'
        <form action="'.$_SERVER['PHP_SELF'].'" method="post">
            <input type="hidden" name="action" value="calc">
            <input type="text" name="value_1" value="Wert1"><br>
            <input type="text" name="value_2" value="Wert2"><br>
            <input type="submit">
        </form>
        ';
    }
?>
</body>
</html>


Liebe Grüße

Yves
 
uups, das geht für mich ein bisschen zu schnell, da ich am Grundlagen erlernen bin, aber danke für deine Hilfe.

Das letzte Beispiel ist für mich noch zu weit weg von meinem können, es scheint das du Formular und "Rechner" in einer Seite verpackt hast, das ist sicher komfortabler.

Wie müsste ich es aber machen, dass die Werte im ersten File mit dem Formular ud01.htm nach ud01.php übergeben werden? Das
PHP:
<form action="<?php_echo_$_SERVER['PHP_SELF'];_?>" method="post">
hast du mir bereits gegeben, nur wird die Seite mit dem "rechner" ud01.php nicht aufgerufen, was müsste ich da noch ändern?

Gruss Chrigu
 
Hi,

das Action-Parameter in einem HTML Formular gibt die Seite an, die aufgerufen werden soll.

Das
PHP:
<?php_echo_$_SERVER['PHP_SELF'];_?>
verweist quasi nur auf die gleiche Seite, auf der es definiert wurde.


Wenn du nun die Seite „ergebnis.php“ aufrufen möchtest, dann musst du einfach nur im Formular die entsprechende Seite als Action Parameter angeben.

Also

PHP:
<form action="ergebnis.php" method="post">

Alles klar?


Liebe Grüße

Yves
 
Soweit alles klar, nur das es einfach nicht funktioneren will ;-)

Ich komme immer wieder zum gleichen Ergebnis wie am Anfang:

<html>
<body>
Die Summe von und ist 0
</body>
</html>

Hast du einen Fehler gefunden in meinen zwei ersten Files, wo du sagen könntest das es darum nicht funktioniert?

Gruss Chrigu
 
Original geschrieben von chrigu
// Das an die entsprechende PHP Seite: ud01.php weitergeleitet wird:

PHP:
<html>
<body>
<?php
	$erg = $_GET['$w1'] + $_GET['$w2'];
	echo "Die Summe von " . $_GET['$w1'] . " und " . $_GET['$w2'] . " ist $erg";
?>
</body>
</html>

// Ich erhalte dann als Ergebnis:

<html>
<body>
Die Summe von und ist 0
</body>
</html>
[/B]
&nbsp;
also ich glaub, daß ganze könnt schon funktionieren. wenn du anstatt $_GET['$w1'], $_GET['w1'] schreiben würdest. weil $_GET weiß ja, daß es sich um eine variable handelt, die du auslesen willst.
Oder wenn du dein Forumlar mit post betreibst, dann nimmst halt $_POST['w1']

hoffentlich funzt das jetzt auch :rolleyes:
 
Original geschrieben von chrigu
Hast du einen Fehler gefunden in meinen zwei ersten Files, wo du sagen könntest das es darum nicht funktioniert?
&nbsp;


siehe sungeri ;)

übernimm doch meinen 2. teil der allinone lösung. also das was in der if bedingung steht.
 
Jetzt hatte ich doch Hoffnung, dass alles funktioniert und dann kam die Enttäuschung.
Es will ned

Hier noch mal mein Inhalt, sofern ihr noch nicht die Nerven verloren habt, ich will das unbedingt zum laufen bringen, weil es doch so einfach ist.

// formular:
PHP:
<html>
<body>
Bitte_tragen_Sie_zwei Zahlen_ein,_und_senden_Sie_das_Formular_ab:<br>
<form action="ud01.php"_method="post">
<p> Wert 1: <input name="w1"></p>
<p> Wert 2: <input name="w2"></p>
<p><input type="submit"><input type="reset"></p>
</form>
</body>
</html>

// das file ud01.php
PHP:
<html>
<body>
<?php

	$erg = $_POST['w1'] + $_POST['w2'];
	echo "Die Summe von " . $_POST['w1'] . " und " . $_POST['w1'] . " ist " . $erg . "<p>";

?>
</body>
</html>

Gruss Chrigu
 
Mach mal den _ bei method="post" weg.

Funktioniert denn mein Script?

Ansonsten zip mal beide Dateien und hängt diese hier an den Thread.

Wir kümmern uns dann drum :D

Yves
 
irh könnts auch kompliziert machen.... :eek:
 
Hurra! Es geht jetzt!

Ich hatte die Seiten im Dreamweaver MX geschrieben, als ich die Seiten mit TextEdit geöffnet und neu abgesichert habe liefen Sie komischerweise wieder, früher hatte ich ähnliche Probleme mit HTML Seiten und Dreamweaver :rolleyes:

Gruss Chrigu
 
Original geschrieben von Yves
register globals = off ist nicht kompliziert, sondern klug.
&nbsp;

Hmmm... Was ist daran eigentlich schlimm daran?
 
Original geschrieben von sungeri
&nbsp;

Hmmm... Was ist daran eigentlich schlimm daran?
&nbsp;

Stichwort „Injection“.

Das ist ein riesiges Sicherheitsloch, da ich jeglichen Datentyp injizieren kann bei On.

Yves
 
Was ist, wenn ich die relevanten Variablen per Session registriere. Kann man die auch injizieren?
Und wie mach ich das überhaupt ;)
 
Wenn man einmal kapiert hat wie es funktioniert versteht man, warum die letzten Bugfixes nur Flickwerk ohne grosse Bedeutung sein können. Nehmen wir einmal folgenden SQL Query, der etwa von der News/index.php ausgeführt wurde (dieser war Angriffsziel der letzten Angriffe):
"update ".$prefix."_stories set score=score+$score, ratings=ratings+1 where sid='$sid'"

Das Problem tritt nun auf, wenn die Variable $score einen etwas modifizierten Inhalt hat. So ging der Autor von PHPNuke aus, dass $score eine Zahl zwischen 1 und 5 ist. Man kann aber -wenn man böswillig ist- über den Browser der Variablen einen anderen Inhalt geben. Ersteinmal der Normalfall ($score=2), folgendes SQL Kommando wird ausgeführt:
"update nuke_stories set score=score+2, ratings=ratings+1 where sid=2"

Ganz normal. Wenn aber der USer über den Browser die berühmte Zeile aufruft:
http://localhost/modules.php?name=News&op=rate_article&score=4,counter=92&sid=1
Erhält die Variable $score einen ganz anderen Wert und zwar $score="4,counter=92". Sinn macht dies erst, wenn man sich die Folgen im Query String genau ansieht:
"update nuke_stories set score=score+2, counter=92, ratings=ratings+1 where sid=2"

Ergebnis: Durch eine einfache Änderung in der Browserzeile wird die Spalte Counter verändert - das war so nicht geplant.

Wie funktiniert der Bugfix
Kurz zum Bugfix: Im vorliegenden Fall ist das Problem klar, sobald die Variable $score einen anderen Wert als eine Zahl hat stimtm irgendwas nicht. Eine einfache Prüfung dessen mit "if (!is_numeric($score))" klärt die Frage und die Sache ist gegessen.

Wo ist das Problem?
Wo ist nun weiter das Problem? Im ersten Absatz habe ich hofentlich klar gemacht, wie gross das Gefährdungspotential ist - bei einem kleinen Fehler und nicht ausreichenden Prüfungen kann man bereits riskieren dass der vorgenommene SQL Query ungewollt erweitert wird. Das Code schreiben wird zr Sissifussarbeit. Eine Lösung muss her - eine allgemeine Lösung.

Eine Lösungsidee
Dsa Problem bei PHPNuke ist vor allem die Menge an (unüberschaubaren) Codezeilen. Wer jetzt hier alle SQl Injection Möglichkeiten ausklammern will wird nächstes Jahr noch daran sitzen. Mir kam folgende Idee: Sämtliche SQL Queries laufen über die sql_layer.php; Man hat also wenigstens schonmal eine zentrale Schnittstelle an der die vorgenommenen SQL Queries abgefangen werden können.
Ich habe viele Möglichkeiten durchgespielt (Checksummenbildung für die Queries, Abfragestufen für die Queries mit UPDATE und Insert) und bin am Ende bei einer äusserst einfachen Lösung gelandet.
So steht bei jedem SQL Query am Anfang fest wie viele Spalten verändert werden, bei obigen Beispiel sind es etwa 2. Erst wenn ein "böser" User im Browserstring rumspielt werden daraus mehr - etwa 3 oder 4 etc. Man muss der sql_layer.php "nur" mitteilen, wie viele Spalten verändert werden müssen und prüfen ob auch wirklich nur diese Zahl geändert wird. Falls nein liegt offensichtlich ein Problem vor und es wird nicht in die DB geschrieben. Das ganz ehabe ich als (primitives SKript) schon verwirklicht mit Erfolg.

Umsetzung
Bevor ich nun das Skript hier vorstelle ein Aufruf: Jeder der ein eigenes VKP herausbringt sollte sich die Idee durch den Kopf gehen lassen und ggfs. umsetzen. Es muss nicht unbedingt über meinen Weg geschehen - aber ich denke das System als solches bietet sehr viel Sicherheit. PHPNuke umzubauen macht wenig Sinn - wenn dann muss FB direkt die Änderungen aufnehmen. Ich habe ihm eine Mail geschrieben mit Code Beispielen, hoffentlich geht er darauf ein.
Noch eine Bitte: Ich habe in den letzten Studnen sehr viel Zeit in das ganze Thema und die Entwicklugn dieser Idee gesetzt. Es wäre schön, wenn diese Idee und das Codebeispiel genutzt werden, wenn man mich "in Memoriam" irgendwo im erstellten Code erwähnt.

Das Skript
Hier ist es nun. Das ganze geht in 3 Schritten vor sich:
1. Auslesen der Kommata-Anzahl
2. Von den Kommata auf die Spaltenzahl schließen
3. Die ausgelesenen mit der angegebenen Spaltenzahl vergleichen

Ich habe mich in diesem Beispiel nur auf das UPDATE konzentriert! Es empfiehlt sich, zuerst zu prüfen ob ein INSERT oder ein UPDATE vorgenommen wird und dann entsprechend die Spalten zu zählen. Ich werde das fertige Skript hierzu noch erstellen - im Moment ging es mir um eine rasche Verbreitung der Idee.

Ansatzpunkt ist zuerst die sql_layer.php, hier wird eine zusätzliche Variable angegeben zur Übergabe der Spaltenzahl. Die Variable erhält einen Standardwert damit auch alte Aufrufe dieser Funktion die diesen Wert nicht übergeben weiter funktionieren. Da ich hier nur von einem UPDATE ausgehe ist es recht leicht: Anhand der Kommate den SQl String in Teile zereilen, die Teile zählen - das sind die Spalten.

function sql_query($query, $id, $spaltenzahl='')
{

global $dbtype;
global $sql_debug;
$sql_debug = 0;
if($sql_debug) echo "SQL query: ".str_replace(",",", ",$query)."";
switch ($dbtype) {

case "MySQL":
{
if($spaltenzahl!='')
{
# 1. Kommata in Querystring zählen
$temp=explode(",",$sqlx);
$sqlzahl=count($temp);

# 2. Aus Kommata auf Spaltenzahl schließen
$sqlspalten=$sqlzahl;

# 3. Wenn Spaltenzahl != $Spaltenzahl sofort aussteigen
if($sqlspalten!=$spaltenzahl)
exit("nice try - guy");
}
$res=@mysql_query($query, $id);
return $res;
}
break;;

Das wars schon - ich hoffe die prinzipielle Idee kam rüber. Ich habe hier nur mySQL angepasst. Der Aufruf der Funktion sähe dann folgendermaßen aus (am Beispiel der News/index.php):

$result = sql_query("update ".$prefix."_stories set score=score+$score, ratings=ratings+1 where sid='$sid'", $dbi, 2);

Fertig. Ich muss nun zum einen die SQl Layer anpassen - je nachdem ob ein INSERT oder ein UPDATE vorgenommen wird - um auch wirklich die genaue Spaltenzahl zu erhalten. Ich hoffe die Idee findet Anklang und vermeht sich rasch. Wenn FB darauf eingeht wird es hofentlich in die nächste PHPNuke Version einfließen, angemailt mit Beispielen und dem Angebot zur Hilfe habe ich Ihn jedenfalls.
Quelle: Netz-id.de


Liebe Grüße

Yves
 
Zurück
Oben Unten