Hilfe bei einem etwas aufwendigeren Script

Hallo liebe Experten,

da Ihr mir beim letzten mal sehr gut weiterhelfen konntet,
muss ich mich nun erneut an euch wenden.

Dieses Script soll ein Login über einen Datenabgleich mit einer Datenbank mal werden.

Im Anschluss mein Code mit dem Problem im //Komentar erläutert.

Seite eins des Codes :

//Das hier ist die erste Seit meines Problems, allerdings wird hier kein Fehler angezeigt.
Login
Geben Sie das Passwort ein:

Seite zwei des Codes :

/*An den Stellen mit ??? ist der Code in ordnung, sollen nur Platzhalter für Richtige Datenbank Verbindungen sein.

Das Problem soll laut Komodo in der Zeile 33 liegen und lautet: unexpected T_IF

Das zweite Problem ist, dass wenn es funktionieren würde ich mit dem Code nur den ersten Datensatz in assoc ausgegeben bekomme.
Sinnvoll wäre aber alle Datensätze aus der db ??? zu bekommen. Also wenn Ihr hierfür auch noch eine Idee hättet wäre ich
sehr froh.
*/

<?php $link = mysql_connect ( "????","????","????") ;<br /> if ( ! $link )
 {
 //hat nicht geklappt 
 echo "Es konnte keine Verbindung hergestellt werden" ;
 die;
 }

 if ( ! mysql\_select\_db ("????") ) ;
 {
 //hat nicht geklappt 
 echo "Konnte nicht die Datenbank auswählen: " . mysql\_erro() ;
 die;
 }

 //Datenbank Abfrage
 $query = "SELECT \* FROM ????" ;

 $result = mysql\_query( $query ) ;

 $datensatz = myaql\_fetch\_assoc( $result ) ;

 $VarP = $datensatz["Passwort"] 



if($\_REQUEST['Send'] && $\_REQUEST['Passwort'] == $VarP)
{
 session\_start();
 session\_register("Passwort");
 $\_SESSION['Passwort'] = $VarP
}

?&gt:stuck\_out\_tongue\_winking\_eye:asswortgeschützter Bereich<?php if($_SESSION['Passwort'] == $VarP)<br />{
 echo"Sie sind erfolgreich eingeloggt!
Hier gelangen Sie zum [geschützten Inhalt](%255C%2522geschuetz.php%255C%2522).";
}
else
{
 echo"Sie sind nicht berechtigt die Seite zu betreten!";
}

?\>

Vielen Dank für eure Mühe und Zeit

Mit freundlichen Grüßen

Dominique

MOD: Code in pre eingeschlossen, FAQ:30

Das zweite Problem ist, dass wenn es funktionieren würde ich
mit dem Code nur den ersten Datensatz in assoc ausgegeben
bekomme.
Sinnvoll wäre aber alle Datensätze aus der db ??? zu
bekommen.

das waere ueberhaupt nicht sinnvoll. man stellt einer db eine konkrete frage und moechte die kuerzest moegliche antwort haben. immer. dazu sind db-server entwickelt. die koennen das besser. immer.
wenn jemand das ergebnis einer db-abfrage in der applikation filert hat er das problem nicht verstanden, oder weiss mit einer db nix anzufangen.

dein problem ist zu loesen mit:

$row = select \* from user where pass=$pass
if ($row)
 anmeldeprocedere
else
 anmeldungfehlgeschlagen




> /\*An den Stellen mit ???? ist der Code in ordnung, sollen nur  
> Platzhalter für Richtige Datenbank Verbindungen sein.  
>   
> Das Problem soll laut Komodo in der Zeile 33 liegen und  
> lautet: unexpected T\_IF  
>   
> \*/  
> 
>     
> if ( ! mysql\_select\_db ("????") ) ;

...
semikolon falsch


> $datensatz = myaql\_fetch\_assoc( $result ) ;

...
tippfehler


> $VarP = $datensatz["Passwort"]  
> if($\_REQUEST['Send'] && $\_REQUEST['Passwort'] == $VarP)

...
semikolon falsch deshalb unexpcted if



> 

das mit den semikolons hatte man dir schon gesagt.

Hallo Jörg,

Danke für deine tolle Antwort.
Das mit den Tipfehlern hat mir echt weiter geholfen.

Meine Idee bei der Sache mit der Datenbank war, dass ich nun hingegangen bin und ein zweites Feld hinzugefügt habe. „Benutzername“
Deshalb wollte ich das die Mysql alle datensätze herausgibt und das dann php den User findet wo Benutername und Passwort zusammenpassen und mit den Eingaben auf der ersten Seite übereinstimmen.
Das ganze soll dann bringen, das ich den User für den gesicherten Bereich identifiziert habe um die Anrede dann zu personalisieren.

Funktionniert noch nicht ganz so wie es soll nachdem ich den „Benutzernamen“ noch hinzugefügt hatte.
Jetzt taucht kein Fehler mehr auf, er lässt mich einfach gar nicht mehr rein obwohl alle Eingaben in das Login Feld richtig sind.

Ist das was ich mir da vorstelle mit deiner $row = (SQL); If ($row); auch möglich ?

Ich hab den Code noch ohne $row gelassen, da ich nicht recht weiß wo es hin soll, ich kann mir nur vorstellen das es an die Stelle meins Querry soll.

So sieht der aktuelle Code aus.

Seite 1:

Login
Geben Sie das Passwort ein:

Geben Sie den Benutzernamen ein:

Seite 2:

<?php $link = mysql_connect( "????","????","????") ;
if ( ! $link ) { //hat nicht geklappt echo "Es konnte keine Verbindung hergestellt werden" ; die; } if ( ! mysql\_select\_db( "????" ) ) { //hat nicht geklappt echo "Konnte nicht die Datenbank auswählen: " . mysql\_error() ; die; } //Datenbank Abfrage $query = "SELECT \* FROM ????"; $result = mysql\_query( $query ) ; $datensatz = mysql\_fetch\_assoc( $result ) ; $VarP = $datensatz["Passwort"] ; $VarB = $datensatz["Benutzername"] ; if($\_REQUEST['Send'] && $\_REQUEST['Passwort'] == $VarP . $\_REQUEST['Send'] && $\_REQUEST['Benutzername'] == $VarB ) { session\_start(); session\_register("Passwort"); $\_SESSION['Passwort'] = $VarP ; session\_start(); session\_register("Benutzername"); $\_SESSION['Benutzername'] = $VarB ; } ?&gt:stuck\_out\_tongue\_winking\_eye:asswortgeschützter Bereich<?php if(($_SESSION['Passwort'] == $VarP) .($_SESSION['Benutzername'] == $VarB ) )
{ echo"Sie sind erfolgreich eingeloggt! Hier gelangen Sie zum [geschützten Inhalt](%255C%2522geschuetz.php%255C%2522)."; } else { echo"Sie sind nicht berechtigt die Seite zu betreten!"; } ?\> Vielen Dank für deine Hilfe und Zeit. Mit freundlichen Grüßen Dominique

Hi Dominique,

kannst Du Dir bitte abgewöhnen den ganzen Quelltext einzufügen und nur die relevanten Bereiche zu Posten? das macht Übersichtlicher und verschwendet nicht die Zeit derer, die Dir helfen könnten…

Im übrigen ist $_REQUEST relativ unsicher, weil es auch leicht mit GET Variablen befüllt werden kann…
Du solltest Dir besser angewöhnen auf $_GET und $_POST zurückzugreifen, je nachdem, wann Du es brauchst…

Ansonsten würde ich Dir raten, das ganze sehr stark zu vereinfachen…

$sqlstring = "SELECT \* FROM datenbank WHERE username='$\_POST[Benutzername]' AND passwort='$\_POST[Passwort]';
$query = mysql\_query($sqlstring);
$treffer = mysql\_num\_rows($query);
if ($treffer == 1) 
 {
 echo "User ist authorisiert";
 $\_SESSION['check'] = true;
 }
else $\_SESSION['check'] = false;

Ich weiss nicht, ob Deine kryptischen if-klauseln funktionieren können…
Für mich sieht es jedenfalls etwas komisch aus *grübels*

Grüße
Munich

$sqlstring = „SELECT * FROM datenbank WHERE
username=’$_POST[Benutzername]’ AND
passwort=’$_POST[Passwort]’“;

Achtung, was du hier vorschlägst, ist anfällig für SQL Injection: Man könnte sich hier (relativ) einfach einloggen, ohne das richtige Passwort zu kennen.

Gruß,

Andreas

$sqlstring = „SELECT * FROM datenbank WHERE
username=’$_POST[Benutzername]’ AND
passwort=’$_POST[Passwort]’“;

Achtung, was du hier vorschlägst, ist anfällig für SQL
Injection: Man könnte sich hier (relativ) einfach einloggen,
ohne das richtige Passwort zu kennen.

Kann man nicht.

Sein simpler und effektiver Schutz funktioniert imho:

> > $sqlstring = "SELECT \* FROM datenbank WHERE username='$\_POST[Benutzername]' AND passwort='$\_POST[Passwort]';  
> > $query = mysql\_query($sqlstring);  
> > $treffer = mysql\_num\_rows($query);  
> > <u>if ($treffer == 1) {</u>  
> > echo "User ist authorisiert";  
> > $\_SESSION['check'] = true;  
> > }  
> > else $\_SESSION['check'] = false;

Da Einzige, was ein Angreifer machen könnte, wäre
eine Eingabe wie:

 Benutzername: ' OR name != '' OR name ='
 Passwort: 1

was aber schwerlich eine ‚1‘ in mysql_num_rows()
erzeugen dürfte. Oder hast Du eine andere
Idee?

Grüße

CMБ

Hallo liebe Experten,

Vielen Dank für eure zahlreiche Hilfen.

Ich wollte mich auch noch einmal bei euch entschuldigen das ich immer den ganzen Code gepostet habe. Ich bin halt nicht nur Php und MySQL Anfänger. :wink:

Am besten ist es wahrscheinlich euch mein Problem genau zu schlidern.

Das was ich bisher über php weiß kann ich von einer lern CD und einem tollen Link den mir auch ein super netter Helfe in wer-weiss-was zukommen lassen hat.

Mein problem ist es, dass ich einen Login irgen wie erstellen muss und den jeweiligen User identifizieren muss und dies auch für die folgenden Seiten nach dem Login beibehalten muss.
Da ich nur über kleines basiswissen verfüge versuche ich mir das irgend wie zusammen zu basteln.

Es wäre daher super wenn Ihr mir auch bei Euren Hilfestellungen netterweise sagen könntet wo ich die Code Stücke einsetzen muss und wo ich drauf achten muss.

Vielen Dank für Euer Verständniss, Eure Hilfe, Mühe und Zeit.

Mit freundlichsten Grüßen

Dominique

Hi,

Sein simpler und effektiver Schutz funktioniert imho:

$sqlstring = "SELECT * FROM datenbank WHERE username=’$_POST[Benutzername]’ AND passwort=’$_POST[Passwort]’;
[…]
if ($treffer == 1) {

Da Einzige, was ein Angreifer machen könnte, wäre
eine Eingabe wie:

Benutzername: ’ OR name != ‚‘ OR name =’
Passwort: 1

was aber schwerlich eine ‚1‘ in mysql_num_rows()
erzeugen dürfte.

na ja, wenn es nur einen Satz in der Tabelle ‚datenbank‘ gibt, klappt es. :wink:

Ansonsten könnte man, wenn man einen gültigen Benutzernamen NAME kennt oder erraten kann, das hier benutzen:

 Benutzername: NAME' OR passwort 'foo
 Passwort: foo

Ganz allgemein wird’s ein wenig aufwendiger:

 Benutzername: foo' AND username 'foo' OR username = (select min(username) from datenbank) OR passwort 'foo
 Passwort: foo

Ich hoffe, ich habe mich nicht vertan.

Gruß,

Andreas

Hallo,

Benutzername: NAME’ OR passwort 'foo
Passwort: foo

OK, benötigt aber natürlich die Kenntniss des tatsächlichen
Benutzernamens ‚NAME‘ (wie Du sagtest) - und die Kenntniss
des Spaltennamens ‚passwort‘. Daher besser:

 ...
 Benutzername: NAME' OR '1'='1
 Passwort: 
 ...

Ganz allgemein wird’s ein wenig aufwendiger:

Benutzername: foo’ AND username ‚foo‘ OR username = (select min(username) from datenbank) OR passwort 'foo

Ich hoffe, ich habe mich nicht vertan.

Hast Du nicht (Respekt), nur hier muß der Spaltenname
‚username‘, der Spaltenname ‚passwort‘ *und* der
Tabellenname ‚datenbank‘ bekannt sein (nicht realistisch).

Ich habe es eben mit LIMIT(1) versucht, aber noch
nicht hinbekommen :wink:

Grüße

CMБ

nur hier muß der Spaltenname
‚username‘, der Spaltenname ‚passwort‘ *und* der
Tabellenname ‚datenbank‘ bekannt sein (nicht realistisch).

Klar, dieses Schemainformationen brauche ich dafür. Aber mit etwas Glück verraten mir die Fehlermeldungen genug, wenn ich einen Syntaxfehler in der Anfrage erzeuge. :smile: Oder die Anwendung ist Open Source oder oder oder …

Gruß,

Andreas

Hallo Munich,

Vielen Dank für deine Hilfe.
Das mit dem Code wusste ich noch nicht. Sorry. Bin halt nicht nur php und MySQL Anfänger.
Ich habe nur jetzt ein Problem.

Komodo zeigt einen Fehler an.

Was habe ich falsch gemacht?

(Wenn echo :smile:

Parse error: parse error, unexpected T_STRING on line 25

(wenn echo weg dann:smile:

Parse error: parse error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING on line 26

Hier die veränderten Code Teile:

(Datenbank Kontakt herstell Code…)

(??? stehen wie immer als Platzhalter für Datenbank Verbindung)

$sqlstring = "SELECT * FROM ??? WHERE Benutzername=’$_POST[Benutzername]’ AND Passwort=’$_POST[Passwort]’;
$query = mysql_query($sqlstring);
$treffer = mysql_num_rows($query);
if ($treffer == 1)
{
echo „User ist authorisiert“;
$_SESSION[‚check‘] = true;
}
else $_SESSION[‚check‘] = false;

Hteml…

<?php if(($_SESSION['Passwort'] == true) .($_SESSION['Benutzername'] == true ) )
{ echo"Sie sind erfolgreich eingeloggt! Hier gelangen Sie zum [geschützten Inhalt](%255C%2522geschuetz.php%255C%2522)."; } else { echo"Sie sind nicht berechtigt die Seite zu betreten!"; } ?\> Mit freundlichsten Grüßen Dominique

Fehlermeldungen lesen lernen
Hi Dominique,

anhand der Fehlermeldung kannst Du sehen, in welcher Zeile der Fehler zu liegen scheint…

Parse error: parse error, unexpected T_STRING on line 25
(wenn echo weg dann:smile:
Parse error: parse error, unexpected
T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or
T_NUM_STRING on line 26

die beiden Fehlermeldungen sagen, dass es irgendwo zwischen Zeile 24 und 27 (zum ersten mal) hakt…

Hier die veränderten Code Teile:
Hteml…

Du machst es mir schwer, wenn Du Teile aus dem Code kürzt und Dich dann doch nicht auf den wesentlichen Teil beschränkst…
Deswegen bitte nochmal die Zeilen 24 bis 27…
Die Verbindungsdaten etc sind übrigens komplett irrelevant weil das ja alles funktioniert.
Nur wenn jemand nachfragt solltest Du den Code, von dem Du eigentlich sicher sein solltest, dass er geht auch posten (Ausser der übrige Code ist so komplex, dass man es wegen übermässig vieler Variablen etc nicht mehr deuten könnte).

http://www.php-fehlermeldungen.de

Die Fehlermeldung deutet denke ich darauf hin, dass Du eine Array Variable mit Hochkommas in ein echo mit semikolon geschrieben hast…

also ein
echo „Hallo $row[‚user‘]“;
richtig wäre hier (auch wenn etwas unschön):
echo „Hallo $row[user]“;

Grüße
Munich