» Seltsames PHP Formular / MySQl Problemchen

Dieses Thema im Forum "Web-Programmierung" wurde erstellt von Eames, 04.02.2005.

  1. Eames

    Eames Thread Starter MacUser Mitglied

    Beiträge:
    2.591
    Zustimmungen:
    14
    MacUser seit:
    26.09.2003
    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 ...

    [​IMG]

    [​IMG]
     
    Zuletzt bearbeitet: 04.02.2005
  2. Hilarious

    Hilarious MacUser Mitglied

    Beiträge:
    2.195
    Zustimmungen:
    5
    MacUser seit:
    25.11.2004
    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.
     
  3. Eames

    Eames Thread Starter MacUser Mitglied

    Beiträge:
    2.591
    Zustimmungen:
    14
    MacUser seit:
    26.09.2003
    Klasse Antwort

    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
     
  4. Eames

    Eames Thread Starter MacUser Mitglied

    Beiträge:
    2.591
    Zustimmungen:
    14
    MacUser seit:
    26.09.2003
    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 ;)
     
  5. Eames

    Eames Thread Starter MacUser Mitglied

    Beiträge:
    2.591
    Zustimmungen:
    14
    MacUser seit:
    26.09.2003
    Na Klasse :D

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

    Gruss . Mikalux
     
  6. Hilarious

    Hilarious MacUser Mitglied

    Beiträge:
    2.195
    Zustimmungen:
    5
    MacUser seit:
    25.11.2004
    Ä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!
     
  7. Eames

    Eames Thread Starter MacUser Mitglied

    Beiträge:
    2.591
    Zustimmungen:
    14
    MacUser seit:
    26.09.2003
    Eine Frage hätte ich jeodch noch:

    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: 04.02.2005
  8. Hilarious

    Hilarious MacUser Mitglied

    Beiträge:
    2.195
    Zustimmungen:
    5
    MacUser seit:
    25.11.2004
    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: 05.02.2005
  9. Chewie

    Chewie MacUser Mitglied

    Beiträge:
    306
    Zustimmungen:
    1
    MacUser seit:
    18.03.2003
    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
     
  10. Eames

    Eames Thread Starter MacUser Mitglied

    Beiträge:
    2.591
    Zustimmungen:
    14
    MacUser seit:
    26.09.2003
    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:

    Gruss . Mikalux
     
Die Seite wird geladen...