Kleine Denkprobleme bei Login-Script

  • Hallo,


    ich möchte auf meiner Seite ein Loginscript machen,
    mit Sessions und Mysql,
    sodass wenn der Benutzername z.B. Admin ist und das PW richtig
    ich erweiterte Funktionen habe, wie z.B. dass mir auf der Gästebuchseite
    angezeigt wird,
    welche Beiträge freigeschaltet sind, welche nicht,
    und dass ich Beiträge löschen kann, freischalten,
    Kommentieren usw...
    Nun soll aber auch jemand anderes z.B. mit dem Benutzernamen Nicki
    diese Rechte nicht haben.


    So müsste ich also einfach ... if mysql benutzername == Admin{ echo "blablabla";}
    else echo blablabla.


    Wie kann ich das aber bewerkstelligen, wenn ich mehrere habe, also mehrere Benutzer mitsamt verschiedenen Berechtigungen?
    Also es sollte möglichst komfortabel gehen...

  • Spontan würde ich sagen, mache das einfach in die Tabelle? :/
    Tabellenstruktur "Ansatz":

    Code
    1. id | username | password | email | deleteComments | enableComments | ...
    2. ---|----------|----------------------------------|-----------------------|----------------|----------------| ...
    3. 1 | Admin | 1f3870be274f6c49b3e31a0c6728957f | admin@meineSeite.de | true | true | ...
    4. 2 | Sarkkan | 1sdfe2744536cdsa49basdaadc6728af | sarkkan@meineSeite.de | false | true | ...


    Und PHP-Code wäre dann ganz grob so:

    PHP
    1. <span class="syntaxdefault">$result </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> mysql_query</span><span class="syntaxkeyword">(</span><span class="syntaxstring">"SELECT * FROM user WHERE username = '"</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">$_POST</span><span class="syntaxkeyword">[</span><span class="syntaxstring">'username'</span><span class="syntaxkeyword">].</span><span class="syntaxstring">"' AND password = '"</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">md5</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$_POST</span><span class="syntaxkeyword">[</span><span class="syntaxstring">'password'</span><span class="syntaxkeyword">]).</span><span class="syntaxstring">"' LIMIT 1;"</span><span class="syntaxkeyword">);<br /><br /></span><span class="syntaxdefault">$user </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> mysql_fetch_assoc</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$result</span><span class="syntaxkeyword">);<br /><br />if(</span><span class="syntaxdefault">$result </span><span class="syntaxkeyword">!==</span><span class="syntaxdefault"> false</span><span class="syntaxkeyword">){<br /></span><span class="syntaxdefault">    $_SESSION</span><span class="syntaxkeyword">[</span><span class="syntaxstring">'user'</span><span class="syntaxkeyword">]</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> $user</span><span class="syntaxkeyword">;<br />}<br /><br />[...]<br /><br />if(</span><span class="syntaxdefault">$_SESSION</span><span class="syntaxkeyword">[</span><span class="syntaxstring">'user'</span><span class="syntaxkeyword">][</span><span class="syntaxstring">'deleteComments'</span><span class="syntaxkeyword">]</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">===</span><span class="syntaxdefault"> true</span><span class="syntaxkeyword">){<br /></span><span class="syntaxdefault">    </span><span class="syntaxkeyword">...<br />}</span><span class="syntaxdefault"> else </span><span class="syntaxkeyword">{<br /></span><span class="syntaxdefault">    die</span><span class="syntaxkeyword">(</span><span class="syntaxstring">"Sie haben hierfür keinerlei Befugnisse"</span><span class="syntaxkeyword">);<br />}</span><span class="syntaxdefault"> </span>


    Edit: Hier scheint mir wohl ein = zuviel reingerutscht zu sein^^ Danke an Peter1978

  • Zitat
    PHP
    1. <span class="syntaxdefault"></span><span class="syntaxkeyword">if(</span><span class="syntaxdefault">$result </span><span class="syntaxkeyword">!===</span><span class="syntaxdefault"> false</span><span class="syntaxkeyword">){<br /></span><span class="syntaxdefault">    $_SESSION</span><span class="syntaxkeyword">[</span><span class="syntaxstring">'user'</span><span class="syntaxkeyword">]</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> $user</span><span class="syntaxkeyword">;<br />}<br /><br /></span><span class="syntaxdefault"> </span>


    sry
    hier ist doch ein = zuviel


    gruß

  • &quot;Peter1978&quot; schrieb:


    sry
    hier ist doch ein = zuviel


    gruß


    Upps, stimmt^^
    Editiere das sofort^^


    Und falls jemand fragt wieso ich solche Strikten Vergleiche verwende, damit hab ich angefangen nachdem ich folgenden Code gefunden habe:

    PHP
    1. <span class="syntaxdefault">$a </span><span class="syntaxkeyword">= </span><span class="syntaxstring">'string'</span><span class="syntaxkeyword">;<br /></span><span class="syntaxdefault">$b </span><span class="syntaxkeyword">= </span><span class="syntaxdefault">0</span><span class="syntaxkeyword">;<br /><br />if ( </span><span class="syntaxdefault">$a </span><span class="syntaxkeyword">== </span><span class="syntaxdefault">true </span><span class="syntaxkeyword">&& </span><span class="syntaxdefault">$b </span><span class="syntaxkeyword">== </span><span class="syntaxdefault">false </span><span class="syntaxkeyword">&& </span><span class="syntaxdefault">$a </span><span class="syntaxkeyword">== </span><span class="syntaxdefault">$b </span><span class="syntaxkeyword">)<br />{<br /> echo ( </span><span class="syntaxstring">'universe broken' </span><span class="syntaxkeyword">);<br />} </span><span class="syntaxdefault"></span>


    Ihr könnt ja mal raten was dieses kleine Code-Stück ausgibt (:
    Jeder der hier nun mit "universe broken" geantwortet hat, tat recht^^ Und ja.. laut PHP ist 'string' gleich 0 ^^ wobei 'string' gleichzeitig auch true ist :D
    Würden wir hier nun mit Strikten Vergleichen arbeiten würde er schon bei $a === true aufhören :wink:

  • Bitte :D
    Das steht zumindest so in meinem PHP-Buch.


    Wenn auch auf Typgleichheit verglichen wird, muss der Interpreter wohl nicht die Werte (Typen) so umwandeln, dass es zusammenpasst und vergleichbar ist, da ja beide Seiten den gleichen Typ haben müssen. (Würd ich jetzt mal so sagen, kann aber auch einen ganz anderen Grund haben, klingt jedenfalls logisch so)

  • Hallo,


    danke, so habe ich das gemeint.


    wie mache ich das denn mit der md5 Passwortverschlüsselung?
    Einfach bei Mysql die spalte als varchar machen
    und dann immer im php-teil mit md5 drauf zugreifen und schreiben?


    Und das mit den Comments würde ich dann mit einem char machen,
    falls es aktivert ist, also 1 dann kann man es machen, wenn nicht, dann ist es 0.


    Geht das so?

  • Du speicherst die Passwörter md5-verschlüsselt in der Datenbank (am besten mit einem 32 großen char, da ja immer gleich lang). Das eingegebene Passswort beim Login verschlüsselst du dann auch immer mit md5 und vergleichst diesen Wert mit dem entsprechenden aus der Datenbank. Sind beide gleich sind auch die Passwörter, die dahinter stecken (so gut wie immer) gleich.


    "Das mit den Comments" kannst du als boolean speichern.

  • Hallo,


    ich bin mittlerweile schon soweit:



    Was mich wundert ist,
    dass ich keine Ausgabe bekomme,
    wenn ich falsche eingaben getätigt habe.
    Auch wenn ich anstatt den neuen if Vergleich ein else nehme,
    bekomme ich mein echo nicht ausgegeben.


    Gibt es ansonsten noch fehlerhaftes?
    Die Sessions muss ich noch machen, wollte nur mal sehen,
    ob das so schon funktioniert.
    Auch das Passwort habe ich noch unverschlüsselt gelassen, der momentanen
    Einfachheit wegen.


    Danke für die HIlfe.

  • Hi,


    der Fehler liegt hier:

    PHP
    1. <span class="syntaxdefault">if </span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$daten</span><span class="syntaxkeyword">[</span><span class="syntaxstring">'benutzer'</span><span class="syntaxkeyword">]</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> $_POST</span><span class="syntaxkeyword">[</span><span class="syntaxstring">'benutzer'</span><span class="syntaxkeyword">]</span><span class="syntaxdefault"> AND $daten</span><span class="syntaxkeyword">[</span><span class="syntaxstring">'kennwort'</span><span class="syntaxkeyword">]</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> $_POST</span><span class="syntaxkeyword">[</span><span class="syntaxstring">'kennwort'</span><span class="syntaxkeyword">])</span><span class="syntaxdefault"> </span>


    Vergleichen tut man mit == bzw. ===


    LG

  • Hallo,


    ok... blöder Fehler...


    Ich bin jetzt fertig,
    außer, dass ich noch das Passwort verschlüsseln muss... (gibts irgendwo nen md5 umwandler?).


    Ist das ganze denn so jetzt einigermaßen sicher?

  • Nen md5-Umwandler gibts bestimmt irgendwo, aber den dir selber zu schreiben dauert auch nicht viel länger, als das Suchen.


    Du solltest die Benutzereingaben vor der MySQL-Abfrage durch mysql_real_escape_string() laufen lassen. Sonst ist man mit Eingaben beim Passwort wie blablabla' OR 1 = '1 sehr schnell eingeloggt.

  • Was ist ein md5-Umwandler? O.o
    Also um aus einem Wort einen md5-Hash zu generieren gibt es in php die Funktion md5() und wenn du aus nem md5-Hash den Ursprungswert haben willst, da muss ich dir leider sagen, dass geht nicht (:


    Vllt noch ein Tipp:
    "Berechne" zuerst und erst dann die Ausgabe.
    Also anstelle von ihm Code zu schauen ob sich der benutzer eingeloggt hat, beziehungsweise die Benutzereingaben richtig sind, mach das lieber am anfang und starte dann die Ausgabe (: