» Seltsames PHP Formular / MySQl Problemchen

Eames

Aktives Mitglied
Thread Starter
Dabei seit
26.09.2003
Beiträge
2.608
Reaktionspunkte
15
Hallo zusammen,

ich habe nach nun 3 jähriger PHP Abstinenz wieder meine alten CMS Systeme rausgekramt, und bin gerade dabei die wieder alle lauffähig zu machen.

So. Nun aber mal zu meinem Problem:

Bei Formularen, werden anscheinend aus mir nicht erklärbaren Gründen, die Variablen nicht übergeben.

Hier mal z. Bsp. ein Login Script:

Das Script zeigt zuerst ein LoginFormular an, um Benutzer und Passwort einzugeben. Danach sollte es ins CMS weiterleiten und eine SessionID generieren. Das Script lief ja auch schon ... Aber anscheinend wird die Variable $Start nicht übergeben, die im SubmitButton steckt.

Es wird dadurch auch keine Fehlermeldung für den User ausgegeben.

Denn erst nach dem Absenden des Formulars entsteht ja erst die Variable $Start, um dem Script in selbiger Seite zu signalisieren, dass es losgehen kann mit dem Usercheck ...

PHP:
<?php
session_start();
if(empty($PHPSESSID)){
$PHPSESSID=session_id();
}

include("config/db/db_config.php");


if ($Action=="LogOut"){

$result    = mysql_query ("update ".$Tab_user." set tracker='0', SID='' WHERE SID='".$SID."'") or Show_error(__LINE__,__FILE__,"Uuups! The Server Made A BooBoo ...",mysql_error());
session_destroy();
mysql_close($db);

}


if (IsSet($Start)){

echo "Start!";

$result     = mysql_query("select * from ".$Tab_user." WHERE user='$user' AND pass='$pass'") or Show_error(__LINE__,__FILE__,"Uuups! The Server Made A BooBoo ...",mysql_error());
$numrows    = mysql_affected_rows();

if ($numrows > 0) {

$User_ID 	= mysql_result($result,0,"id");
$Counter 	= mysql_result($result,0,"Counter");
$Counter++;

$result    = mysql_query ("update ".$Tab_user." set tracker='1', SID='".$PHPSESSID."', Counter=".$Counter." WHERE user='".$user."' ") or Show_error(__LINE__,__FILE__,"Uuups! The Server Made A BooBoo ...",mysql_error());
$numrows   = mysql_affected_rows();
mysql_close($db);

Header ("Location: module/index.php?SessionID=".$PHPSESSID.""); exit;
} else $Check="Ihre Zugangsdaten sind falsch!";

}

?>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>.:: Photolux | Login ::.</title>

<style>

body{
font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 10px; color: Red; text-decoration: none;
color: #000000;
background-color: #FFFFFF;
overflow-y: auto;
}

table, td {
border-collapse: collapse;
font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 10px; color: #ffffff; text-decoration: none;
}

.Hinweis{
font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 10px; color: #ffffff; text-decoration: none;
}

.Button{
text-decoration: none; 
border-top-width: 1px; 
border-right-width: 1px; 
border-bottom-width: 1px; 
border-left-width: 1px;
font-size: 10px; 
color: #ffffff; 
font-family: Verdana, Arial, Helvetica, sans-serif; 
border-color: #CCCCCC #6C7C93 #6C7C93 #CCCCCC; 
background-color: #374C6D;
width:200px;
}

input
{
color: #333333;
background-color: #eaeaea;
width:200px;
}

</style>

</head>
<body scroll="no">



<?php

echo "<table width=\"100%\" height=\"90%\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\"><tr><td align=\"center\" valign=\"middle\">";
echo "<p align=\"center\"><img src=\"config/images/logo.gif\" border=\"0\"></p>";
echo "<table width=\"100%\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\">";

echo "<tr bgcolor=\"#333333\"><td align=\"center\" height=\"30\"><b>.:: LOGIN ::.</b></td></tr>";

if (!Empty($Check)) echo "<tr bgcolor=\"red\"><td align=\"center\" class=\"Hinweis\" height=\"20\"><b>".$Check."</b></td></tr>";

echo "<tr><td height=\"20\" bgcolor=\"#424242\"><img src=\"images\pixel.gif\" width=\"1\" height=\"1\"></td></tr>";

echo "<form action=\"index.php?SessionID=".$PHPSESSID."\" method=\"post\">";

echo "<tr bgcolor=\"#424242\"><td align=\"center\"><input type=\"text\" name=\"user\" value=\"Benutzer?\"></td></tr>";
echo "<tr bgcolor=\"#424242\"><td align=\"center\"><input type=\"password\" name=\"pass\" value=\"Login?\"></td></tr>";
echo "<tr bgcolor=\"#424242\"><td height=\"20\"><img src=\"images\pixel.gif\" width=\"1\" height=\"1\"></td></tr>";
echo "<tr bgcolor=\"#424242\"><td align=\"center\"><input type=\"submit\" value=\"&raquo;&raquo;&nbsp;Login&nbsp;&raquo;&raquo;\" name=\"Start\" class=\"Button\"></td></tr>";

echo "</form>";

echo "<tr bgcolor=\"#424242\"><td height=\"20\"><img src=\"images\pixel.gif\" width=\"1\" height=\"1\"></td></tr>";

echo "</table>";

echo "</td></tr></table>";

?>

</body>
</html>

Kann das an der Codierung von Safari liegen?

Grübel ... :rolleyes:

Gruss . Mikalux

P.s.:

So schauts aus, und die SessionID wird komsicherweise generiert ...

Seite1.jpg


Seite2.jpg
 
Zuletzt bearbeitet:
Das liegt daran, dass man in den letzten drei Jahren dazu übergegangen ist, das automatische Registrieren von globalen Variablen, die Werte aus Formularfeldern repräsentieren, abzuschalten.

Stichwort register_globals bei de.php.net mal anschauen ;)

So wird aus $Start jetzt $_GET ['Start']*und aus $Action ab sofort $_GET ['Action'].

Das weitere Verwenden Deiner Scripte im öffentlichen Bereich dürfte unsicher sein, in Deinem Falle könnte ich die Login-Adresse mit dem zusätzlichen Parameter "index.php?numrows=1" dazu bringen, zu glauben, die Abfrage hätte positive Werte zurückgegeben.
 
Klasse Antwort

Hilarious schrieb:
Das liegt daran, dass man in den letzten drei Jahren dazu übergegangen ist, das automatische Registrieren von globalen Variablen, die Werte aus Formularfeldern repräsentieren, abzuschalten.

Stichwort register_globals bei de.php.net mal anschauen ;)

So wird aus $Start jetzt $_GET ['Start']*und aus $Action ab sofort $_GET ['Action'].

Das weitere Verwenden Deiner Scripte im öffentlichen Bereich dürfte unsicher sein, in Deinem Falle könnte ich die Login-Adresse mit dem zusätzlichen Parameter "index.php?numrows=1" dazu bringen, zu glauben, die Abfrage hätte positive Werte zurückgegeben.

Hallo Hilarious,

danke für Deine ausführliche und informative Antwort!

Da habe ich ja etwas verpasst :rolleyes:

Sieht aber nun nach mehr Tipparbeit aus ... Aber wenn das meine Probleme löst ... ;)

Gleich mal austesten!

Gruss . Mikalux
 
Hmm. Ich denke mal das * war ein Tippfehler. Denn mit gibt es einen Parse Error. Ohne keinen. Aber funktionieren tut es noch nicht.

Muss mal das Manual wälzen ;)
 
Na Klasse :D

Jetzt funktionieren meine Scripte wieder!
Und ich zweifelte schon an meinem Verstand ...

Gruss . Mikalux
 
Äh, ja, sorry. Das Sternchen war die Hast...

Hier noch ein Tipp zur "Wiedergutmachung" :) :
Im Prinzip kannst Du zum Debuggen Dir (inzwischen) ganz komfortabel anzeigen lassen, was Dein Formular an Dein Skript übertragen wollte. Binde einfach solch eine Funktion ein, und lass sie bei Bedarf am Ende der Seite ausgeben. Dann findet man schnell den ein oder anderen Wert wieder:

Code:
function HosenRunter () {
    $values = get_defined_vars ();
    echo "<pre>\n";
    print_r ($values);
    echo "</pre>\n";
    return TRUE;
}

// Irgendwann am Ende einer Seite:

HosenRunter ();

Die Ausgabe wird Dir bestimmt weiterhelfen, gerade im Zusammenhang mit Formularen.

Viel Erfolg!
 
Eine Frage hätte ich jeodch noch:

Hilarious schrieb:
Das weitere Verwenden Deiner Scripte im öffentlichen Bereich dürfte unsicher sein, in Deinem Falle könnte ich die Login-Adresse mit dem zusätzlichen Parameter "index.php?numrows=1" dazu bringen, zu glauben, die Abfrage hätte positive Werte zurückgegeben.

Interessanter Aspekt! Jedoch was würdest Du damit anfangen?

Ich meine, das sagt Dir doch nichts über den Unsernamen und das Passwort aus ...

Das Script ist nur für mich privat auf meinem Powerbook. ;)
(Bin doch nur Grafikdesigner und kein Programmierer, ist ein Zeitvertreib.)

Aber iterressieren tut es mich jetzt schon ...
 
Zuletzt bearbeitet:
Mal angenommen, Du würdest innerhalb Deines Skriptes folgende Konstruktion anwenden:

PHP:
// $Username kommt vom Eingabefeld 'Username'
// $Password kommt vom Eingabefeld 'Password'
// Deine Sitzungsverwaltung prüft beim Neuladen der Seite,
// ob der Benutzer authorisiert ist. Wurde er bereits vorher
// authorisiert, hat das Skript zuvor bereits eine Sitzungsvariable
// 'DenKennIch' auf TRUE gesetzt.
// In deinem Prozess fragst Du also zu Beginn ab:

<?

    if (($Username == 'james_bond')
        && ($Password == 'moneypenny')) {
        $Auth = TRUE;
    }

// später:
// Die geheimen Kontodaten dürfen natürlich nur
// für james_bond sichtbar sein, sonst ist Ihre
// Majestät in Gefahr:

    if ($Auth) {
        $sql = "SELECT * FROM 'kontobewegungen' LIMIT 0,30";
        if ($resultrsrc = mysql_query ($sql, $connID)) {
            while ($details = mysql_fetch_assoc ($resultrsrc)) {
                print_r ($details);
                // Jetzt gebe ich die geheimen Daten aus.
            }
        }
    } else {
        echo "Du bist ja gar nicht der richtig Bond. Geh' wech!";
        exit (); // oder so...
    }

    // So bitte nicht, wenn register_globals = On ist.
    // Überhaupt -- so bitte nicht ;)
?>

Auf ersten Blick sieht das recht sicher aus. Was aber, wenn ich der böse Dr. No bin und Dir an die Kronjuwelen möchte. Dann werde ich mir Zeit nehmen und ein wenig Fantasie entwickeln und möglicherweise mir vorstellen können, wie Du das programmiert hast. Ich probiere also, da ich mich mit PHP auskenne, aus, ob ich nicht ein wenig an das Skript übertragen kann, um es aus dem Gleichgewicht zu bringen.

Da man eine Variable, die irgendwas mit Authentifizierung zu tun tun, schnell $auth, $Auth oder $authenticated nennt liegt nahe, das da mal anzusteuern (auf Deinem Server):

Code:
http://irg.end.wo/kontoanzeige.php?Auth=1

Ist register_globals nun eingeschaltet, macht der PHP-Parser ganz einfach die Variable $Auth aus meinem Adressparameter ("?Auth=1") und somit dürfte im Skript die Aussage "if ($Auth)" war sein, da sie ja einen Wert enthält (nämlich "1").

Und schon bin ich "drin", ohne dass ich jemals das Kennwort von James Bond zu wissen brauchte.

Noch schlimmer sieht's aus, wenn Du Deine Programmierung veröffentlichst, weil Dein CMS ne echt tolle Sache ist. Mal angenommen: Jetzt gehen interessierte Nutzer zu Sourceforge und laden das mikaluxCMS herunter, installieren es, und wiegen sich in Sicherheit. Und Schwups, tanzen im Dezember lustige Weihnachtsmänner auf der Startseite des Nutzers, der Dein mikaluxCMS im Einsatz hat -- Du und der Nutzer wollten nichts Böses, aber Du bist allein gegen Hunderte Kids zwischen 14 und 18, die alle mal den ganz großen Mist bauen wollen.

So passiert bei einer WebSite einer Polizeidienststelle, die das CMS "PHPNuke" im Einsatz hatte (vor dem Ding kann man nur warnen).

:D
 
Zuletzt bearbeitet:
Hi zusammen,
solche Login-Daten würde ich sowieso nur per POST übertragen, weil sie dann nicht in der URL sichtbar sind.

Keine sichtbaren Variablen - keine Angriffsfläche für Dr. No. :D


Grüße
Chewie
 
Grübel ...

Danke für die Erklärung! Hört sich vernünftig an. Dann werde ich mir da mal was einfallen lassen ...

Ein anderes Problem hat sich ergeben. Seit ich nun mit den neuen $_ Variablen Arbeiten möchte, bekomme ich nur noch Parse Fehler ...

Zum Beispiel:

PHP:
<?php
if($_COOKIE['username']){
** $good_login = 1;
** fpassthru (secure.php");
}
?>

ergibt:

Parse error: parse error in /Library/WebServer/Documents/test.php on line 4

Gruss . Mikalux
 
Nun, in diesem Falle fehlt ein Anführungszeichen im Argument von fpassthru. ;)
 
Chewie schrieb:
Hi zusammen,
solche Login-Daten würde ich sowieso nur per POST übertragen, weil sie dann nicht in der URL sichtbar sind.

Keine sichtbaren Variablen - keine Angriffsfläche für Dr. No. :D


Grüße
Chewie

Das Angriffsszenario könnte man für POST ebenso entwickeln, hier hilft inzwischen sogar der Firefox mit dem WebDeveloper-PlugIn. Ist register_globals eingeschaltet, würde es auch weiterhin mit dieser GET-Methode funktionieren, auch wenn Du das Formular eigentlich per POST verwenden möchtest. Da der Parser ja den Parameter direkt in eine globale Variable überführt, hätte ich diese Unterscheidung geschmeidig umgangen.
 
Hilarious schrieb:
Nun, in diesem Falle fehlt ein Anführungszeichen im Argument von fpassthru. ;)

Oha! War noch früh heute morgen ;)

Ich habe es korrigiert, jedoch erscheint nun wieder eine Fehlermeldung, schon in Zeile1 !?

PHP:
<?php 
if($_COOKIE['username']){ 
** $good_login = 1; 
** fpassthru ("secure.php"); 
} 
?>

Parse error: parse error in /Library/WebServer/Documents/test.php on line 1

Ich habe das Gefühl mein php spinnt ... :rolleyes:
 
Sowas passiert ;)

Wenn ich die Sternchen als Tabulatoren interpretiere, läuft's bei mir (natürlich findet er secure.php nicht). Manchmal (vor allem auf'm Mac) kommt es dazu, dass durch Übernahmen von Skripten aus dem Browser oder von DOSen unsichtbare Zeichen ihren Weg in den Quelltext finden.

Abhilfe: Öffne Dein Skript mit TextWrangler und lasse Dir auch die unsichtbaren Zeichen anzeigen. Vielleicht gibt es dort ja etwas, das nicht dorthin gehört.
 

Anhänge

  • Screenshot.jpg
    Screenshot.jpg
    19,1 KB · Aufrufe: 54
Ich habe mir mal die unsichtbaren Zeichen anzeigen lassen ... Aber ausser LineBreaks konnte ich nun nichts finden. :rolleyes:

Mikalux
 
Zurück
Oben Unten