Entwickler-Ecke

Off Topic - [PHP] Problem mit einfachem Login - Script ...


Supernova - Mi 03.01.07 14:57
Titel: [PHP] Problem mit einfachem Login - Script ...
Hallo,

ich beginne mich mal wieder ein wenig mit PHP zu beschäftigen ... und hab mal Versucht ein Login-Script zu machen ...

index.php


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
<?php

  include('login');
  
   if(isset($_GET['logout'])) {
      unset($_SESSION['success']);
      header("Location: index.php");
    }
    
    
      

?>

<html>
<head>
    <title>Administrations - Login</title>
</head>
<body margin="5">
  <?php
    if(isset($_SESSION['success'])) {    
      echo "drin<br><a href='index.php?logout=true'>Logout</a>";  
    }else {
  ?>
  <form target="_self" method="post" name="main">
    Username: <input type="text" name="username"><br>
    Password: <input type="text" name="password"><br>
    <input type="submit" name="sender" value="Login">
  </form>
<?php } ?>
</body>
</html>


login.php


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
<?php

  include('mysql_connect.php');
  @session_start();
  
  $sql_action = @mysql_query("SELECT user_id FROM tbl_user WHERE username = $username AND password = $password");
  
  if(@mysql_num_rows($sql_action) == 1) {
    $_SESSION['success'] = true;
    return true;
  } else {
    return false;
  }

?>


So wenn ich dass Script teste bekomme ich irg. immer den Wert FALSE zurück ... kann mir da vllt. jemand helfen warum dass so ist ... ^^
Entschuldigt wenn das Script ein wenig unübersichtlich ist ... aber ich komm einfach nicht weiter ^^

Beste Grüße,
Andi


GTA-Place - Mi 03.01.07 15:03

1. Mach erstmal alle @ weg - wir wollen ja keine Fehlermeldungen unterdrücken :lol:.
2. Dann glaube ich, dass return nur in Funktionen geht - du hast es aber in einer If-Abfrage.
3. Ruft dein Formular die index.php auf - du hast aber nirgends die Login.php inkludiert.


Flamefire - Mi 03.01.07 15:25

also...zu dem code brauch ich nix sagen oder?
return nur in funktionen...und die action im formular setzen
vorschlag:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
<?php

  include('login[b].php[/b]');
  
   if(isset($_GET['logout'])) {
      unset($_SESSION['success']);
      header("Location: index.php");
    }
    
    
      

?>

<html>
<head>
    <title>Administrations - Login</title>
</head>
<body margin="5">
  <?php
    if(isset($_SESSION['success'])) {    
      echo "drin<br><a href='index.php?logout=true'>Logout</a>";  
    }else {
  ?>
  [b]<form method="post" name="main">[/b]
    Username: <input type="text" name="username"><br>
    Password: <input type="text" name="password"><br>
    <input type="submit" name="sender" value="Login">
  </form>
<?php } ?>
</body>
</html>

login.php

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
<?php

  if($_POST['sender']!=""){ //nur kontrolle bei neuem formularsenden
     include('mysql_connect.php');
     @session_start();
  
     $sql_action = @mysql_query("SELECT user_id FROM tbl_user WHERE username = $username AND password = $password");
  
     if(@mysql_num_rows($sql_action) == 1) $_SESSION['success'] = true;
   }//löschen wenn keine kontrolle

?>


LeoLöwe - Mi 03.01.07 15:29

Dein SQL-Query sieht falsch aus

Ausserdem - wieso packst du nicht die SQL-Abfrage mit in die andere Datei rein?


GTA-Place - Mi 03.01.07 15:31

Query sieht doch richtig aus :shock:

Und dann weis ich dich gleich noch auf die Gefahren von Suche bei Google XXS hin.


Martok - Mi 03.01.07 16:09

Wo kommen denn die Variablen $username und $password her? Die werden doch soweit ich das sehe an keiner Stelle aus den POST-Daten rausgeholt, oder?


Supernova - Mi 03.01.07 16:40

Erstmal besten Danke an alle die mir hier bis jetzt geholfen haben ^^

@GTA ... ich verstehe nich sonderlich viel was du mit XXS meinst, sorry, aber googlen bringt irg auch nix ...

@Martok ... Praktisch muss der Query dann so lauten:


Quelltext
1:
SELECT user_id FROM tbl_user WHERE username = $_POST['username'] AND password = $_POST['password']                    


Richtig ?


GTA-Place - Mi 03.01.07 16:44

Ist ja auch immer so schwer zu finden, wenn sich jeder XXS nennet :lol: -> Suche bei Google CROSS SITE SCRIPTING (oder gleich: Suche bei Google SQL-INJEKTION)

Ja, richtig, aber guck dir jetzt nochmal XXS an.


Supernova - Mi 03.01.07 17:01

Mhm ... Danke ...

Wenn ich nun diese Funktion einbinde ...

Quelltext
1:
2:
3:
4:
function check_string($string) {
    if((preg_match('/^[a-zA-Z0-9\-\_]+$/',$string))) return true;
    return false;
  }


sowie die PHP-Funktion


Quelltext
1:
htmlspecialchars();                    


dürfte das Script doch einigermaßen sicher sein, oder ?

Thanx a lot ...
Andi


Supernova - Mi 03.01.07 19:23

Hallo,

so ich habe jetz nochmal alles komplett überarbeitet ... aber irg. funktioniert das einloggen einfach nicht ... immer bekomme ich den wert FALSE zurück ...

administration_login.php


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
<?php

  include('mysql_connect.php');
  session_start();
    
  $sql_action = mysql_query('SELECT user_id FROM administration_user WHERE username = $_POST["username"] AND password = $_POST["password"]');
  
  if(@mysql_num_rows($sql_action) == 1) {
    $_SESSION['success'] = true;
  } else {
    echo '<center>Login fehlgeschlagen!</center>';
  }
  

?>


administration_login_form.php


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
<?php

  include('administration_login.php');
  
  if(isset($_GET['logout'])) {
    unset($_SESSION['success']);
    header('Location: administration_login_form.php');
  }

?>

<html>
  <head>
    <title>« dieFanz.de | Administrations-Login »</title>
  </head>
  <body>
    <br>
    <br>
    <br>
    <br>
    <center>
      <?php
      
        if(isset($_SESSION['success'])) {    
          echo "Sie sind eingeloggt.<br><a href='index.php?logout=true'>Logout</a>";  
        }else {
      
      ?>
      <form target="_self" method="post" name="login">
        Benutzername: <input type="text" name="username">
        <br>
        Kennwort:       <input type="password" name="password">
        <br>
        <br>
        <input type="submit" name="transmitter" value="Login">
      </form>
      
      <?php
      
        } 
        
      ?>
    </center>
  </body>
</html>


Ich weis einfach echt nicht mehr was ich falsch mache ... ich vermute es liegt am Query und den $_POST Variablen ...

Beste Grüße,
Andi

Edit:

Die Datenbankstruktur sieht folgendermaßen aus:


Quelltext
1:
2:
3:
4:
Feld       Typ             Null    Standard     Verweise    Kommentare    MIME
user_id    int(17)   Nein                                      // auto increment, Primärschlüssel
username    varchar(255)   Nein                 
password    varchar(255)   Nein


Marco D. - Mi 03.01.07 19:28


Quelltext
1:
<form target="_self" method="post" name="login">                    

Warum schreibst du bei target nicht den richtigen Dateinamen hin? So mache ich das immer und es klappt. ;) Tue es einfach mal!


Supernova - Mi 03.01.07 19:32

@Marco D. ... eig. ist es ja sinnlos, weil mit _SELF ja das obere script aufgerufen wird, und das hat ja die Datei includet ...


Marco D. - Mi 03.01.07 19:35

Probiere mal den Query manuell in phpMyAdmin auszuführen. Außerdem solltest du die Werte im Query in Anführungszeichen setzen (z.B. WHERE username='$username' ...=


Martok - Mi 03.01.07 19:37

Aha! Da hast du das falsche Attribut. Target gibt an, in welchem Frame die Seite aufgemacht werden soll.


Quelltext
1:
2:
3:
4:
<form target="_self" method="post" name="login">
         |
         V 
<form action="administration_login.php" method="post" name="login">


Marco D. - Mi 03.01.07 19:39

user profile iconMartok hat folgendes geschrieben:
Aha! Da hast du das falsche Attribut. Target gibt an, in welchem Frame die Seite aufgemacht werden soll.


Quelltext
1:
2:
3:
4:
<form target="_self" method="post" name="login">
         |
         V 
<form action="administration_login.php" method="post" name="login">

:autsch: Dass mir das nicht auffällt. :autsch:


Martok - Mi 03.01.07 19:46

Dein Unterbewusstsein hat das gemerkt, denn du hast ja oben von diesem Attribut geschrieben ;)
Habs auch nur wegen deinem Kommentar gesehen :mrgreen:


Marco D. - Mi 03.01.07 19:47

user profile iconMartok hat folgendes geschrieben:
Dein Unterbewusstsein hat das gemerkt, denn du hast ja oben von diesem Attribut geschrieben ;)
Habs auch nur wegen deinem Kommentar gesehen :mrgreen:

Es kam mir gleich sehr verdächtig vor. :zwinker:


Flamefire - Mi 03.01.07 19:47

FALSCH!!! Es kann gar nicht gehen! dein mysql-query ist falsch. so muss er heißen:

Quelltext
1:
$sql_action = mysql_query('SELECT user_id FROM administration_user WHERE username ="'.$_POST["username"].'" AND password = "'.$_POST["password"]'.'"');                    

ansonsten sucht er statt nach dem namen nach der zeichenkette $_POST["username"]
nicht nach dem inhalt davon!


Marco D. - Mi 03.01.07 19:49

user profile iconFlamefire hat folgendes geschrieben:
FALSCH!!! Es kann gar nicht gehen! dein mysql-query ist falsch. so muss er heißen:

Quelltext
1:
$sql_action = mysql_query('SELECT user_id FROM administration_user WHERE username ="'.$_POST["username"].'" AND password = "'.$_POST["password"]'.'"');                    

ansonsten sucht er statt nach dem namen nach der zeichenkette $_POST["username"]
nicht nach dem inhalt davon!

Entweder so, oder:

Quelltext
1:
 $sql_action = mysql_query('SELECT user_id FROM administration_user WHERE username="$_POST[username]" AND password="$_POST[password]"');                    


GTA-Place - Mi 03.01.07 20:11

user profile iconFlamefire hat folgendes geschrieben:
FALSCH!!! Es kann gar nicht gehen! dein mysql-query ist falsch. so muss er heißen:

Quelltext
1:
$sql_action = mysql_query('SELECT user_id FROM administration_user WHERE username ="'.$_POST["username"].'" AND password = "'.$_POST["password"]'.'"');                    

ansonsten sucht er statt nach dem namen nach der zeichenkette $_POST["username"]
nicht nach dem inhalt davon!

Nein, sucht er nicht :zwinker:


Flamefire - Mi 03.01.07 20:23

user profile iconGTA-Place hat folgendes geschrieben:
user profile iconFlamefire hat folgendes geschrieben:
FALSCH!!! Es kann gar nicht gehen! dein mysql-query ist falsch. so muss er heißen:

Quelltext
1:
$sql_action = mysql_query('SELECT user_id FROM administration_user WHERE username ="'.$_POST["username"].'" AND password = "'.$_POST["password"]'.'"');                    

ansonsten sucht er statt nach dem namen nach der zeichenkette $_POST["username"]
nicht nach dem inhalt davon!

Nein, sucht er nicht :zwinker:

Doch sucht er :wink:
probiers aus
das gaze würde sorum gehen

Quelltext
1:
$sql_action = mysql_query("SELECT user_id FROM administration_user WHERE username ='$_POST['username']' AND password = '$_POST['password']'");                    

und möglicherweise nicht mal so (ich glaub bei array müssen noch {} drum rum)

-->Merke: In Strings mit "" ersetzt er Variablen
In Strings mit '' nicht!


Supernova - Mi 03.01.07 23:10

Bei dem Query von Flamefire bekomm ich folgenden error:


Quelltext
1:
Parse error: syntax error, unexpected T_CONSTANT_ENCAPSED_STRING in C:\Programme\*\administration_login.php on line 6                    


Sry ^^


LeoLöwe - Mi 03.01.07 23:45

Was hab ich euch gesagt... Query is falsch... Aber neeee auf mich hört ja kener

Egal.

Also wenn du später mal längere Abfragen aufbaust empfehle ich dir eine andere Struktur zu wählen:

z.b. machst du das in deinem Fall dann so

SELECT user_id FROM administration_user WHERE username = $_POST["username"] AND password = $_POST["password"]

=>>>>


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
$sql = "SELECT user_id FROM administration_user WHERE username = '";
$sql .= $_POST['username'];
$sql .= "' AND password= '";
$sql .= $_POST["password"];
$sql .= "';";

//zum debuggen:
//echo $sql;

$sql_action = mysql_query($sql);


Das Debug-Query lass dir mal ausgeben und gib das mal von Hand in PHPMyAdmin ein.
Viel Glück!


Supernova - Mi 03.01.07 23:58

Jaaaa ... Vielen Dank an Alle ... es Funktioniert :D


Flamefire - Fr 05.01.07 08:20

du kannst meinen auch benutzen aber:

Quelltext
1:
$sql_action = mysql_query('SELECT user_id FROM administration_user WHERE username ="'.$_POST["username"].'" AND password = "'.$_POST["password"]'.'"');                    

|
|
|

Quelltext
1:
$sql_action = mysql_query('SELECT user_id FROM administration_user WHERE username ="'.$_POST["username"].'" AND password = "'.$_POST["password"].'"');                    

da war hinten ein hochkomma zuviel...


matze.de - Fr 05.01.07 11:41

Wie wärs ma mit sowas:


Quelltext
1:
2:
3:
4:
5:
6:
7:
[...]
$user = mysql_real_escape_string($_POST["username"]);
$pw = mysql_real_escape_string($_POST["password"]);

$sql = "SELECT `user_id` FROM `administration_user` WHERE `username` = '$user' AND password = '$pw'";
$result = mysql_query($sql);
[...]


Aber Passwörter gehören normalerweise gehasht in eine Datenbank....

mfg matze


Marco D. - Fr 05.01.07 14:41

user profile iconmatze.de hat folgendes geschrieben:
Wie wärs ma mit sowas:


Quelltext
1:
2:
3:
4:
5:
6:
7:
[...]
$user = mysql_real_escape_string($_POST["username"]);
$pw = mysql_real_escape_string($_POST["password"]);

$sql = "SELECT `user_id` FROM `administration_user` WHERE `username` = $user AND password = $pw";
$result = mysql_query($sql);
[...]


Aber Passwörter gehören normalerweise gehasht in eine Datenbank....

mfg matze


Warum setzt du die Werte der Datenfelder nicht in Anführungszeichen?

Quelltext
1:
$sql = "SELECT `user_id` FROM `administration_user` WHERE `username` = '$user' AND 'password' = '$pw'";                    


LeoLöwe - Fr 05.01.07 15:06

Zur krönung noch ein

$user = md5($user);

da einbauen 8)


Marco D. - Fr 05.01.07 15:08

Wenn ich aber ein langes Kennwort mit Sonderzeichen und Zahlen habe, dann dauert es sehr sehr lange, das zu knacken. ;)


Flamefire - Fr 05.01.07 15:44

willst du es knacken? wenn nicht dann benutz md5!
oder jeder dern bissl hacken kann kriegt alle deine pws
PS: und natürlich: md5($pw) nicht md5($user)...den usernamen zu verschlüsseln ist dumm...den brauchste ja noch im klartext


Marco D. - Fr 05.01.07 15:46

user profile iconFlamefire hat folgendes geschrieben:
willst du es knacken? wenn nicht dann benutz md5!
oder jeder dern bissl hacken kann kriegt alle deine pws
PS: und natürlich: md5($pw) nicht md5($user)...den usernamen zu verschlüsseln ist dumm...den brauchste ja noch im klartext

Da liegt ein Missverständnis vor. ;) Mein Post bezog sich auf den von LeoLöwe (einer davor), der aber wieder editiert wurde, also mein Post damit überflüssig wird. :zwinker:


BenBE - Mo 08.01.07 21:25

Darf ich den Thread-Ersteller bitte um Schadensersatz bitten, dass ich überhaupt weitergelesen habe? Bei so vielen Fehlern wird einem ja schon schlecht *g*

Die Sache wie man sich gegen XSS schützt, hat Matze.de korrekt gesagt ... Ferner sollte man generell ohne @ programmieren (wurde auch erwähnt). Die Eingabe-Daten sollten IMMER explizit aus den Arrays $_POST und $_GET gelesen werden - inzwischen mehrfach angedeutet, aber noch nicht so richtig umgesetzt ...

Ferner wird in dieser Datei nirgends die verwendete Session mit session_start initialisiert, geschweige denn korrekt gelöscht (beim logout).

Auch kann ich bei dieser Login\Logout-Page keinerlei Schutz gegen Suche in Wikipedia XSRF-Angriffe erkennen. Bitte DRINGEND nachholen, sonst endest Du wie Google, wo Dir jeder einen Link unterjubeln kann, der die Default-Interface-Sprache auf japanisch einstellt ... (Funktioniert wirklich, hab's mal getestet :P).

Ferner habe ich in diesem Thread noch keinen gesehen, der die Rückgaben der Datenbank-Abfragen prüft ... @matze.de: Auch wenn Du da bei BattleArms nicht viel zu tun hast - bei reinem PHP solltest Du da noch etwas stärker drauf achten!!!

Fazit: Bisher würde ich keinen der gebrachten Vorschläge auf meinen Server loslassen - nicht mal im Safe-Mode*!!!

*Der auch nicht wirklich was bringt ...


Marco D. - Mo 08.01.07 22:54

user profile iconBenBE hat folgendes geschrieben:
Ferner wird in dieser Datei nirgends die verwendete Session mit session_start initialisiert, geschweige denn korrekt gelöscht (beim logout).

Wie wird sie denn 'korrekt gelöscht'?
Ich mache das so:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
// gibt true zurück, wenn der User eingeloggt ist
// gibt false zurück, wenn der User nicht eingeloggt ist
function IsLoggedIn() {
  if (empty($_SESSION['name']))
    return false;
    else return true;
}

//loggt den User aus und entfernt alle $_SESSION-Variablen
function Logout() {
  $_SESSION['name'] = '';
  $_SESSION['id'] = '';
  $_SESSION['language'] = '';
  $_SESSION['ip'] = '';
}

user profile iconBenBE hat folgendes geschrieben:

Fazit: Bisher würde ich keinen der gebrachten Vorschläge auf meinen Server loslassen - nicht mal im Safe-Mode*!!!

Warum nicht?


BenBE - Mo 08.01.07 23:06

user profile iconMarco D. hat folgendes geschrieben:
user profile iconBenBE hat folgendes geschrieben:
Ferner wird in dieser Datei nirgends die verwendete Session mit session_start initialisiert, geschweige denn korrekt gelöscht (beim logout).

Wie wird sie denn 'korrekt gelöscht'?


Bitte nimm mir den Kommentar nicht übel, aber RTFM [http://php.net/manual/en/ref.session.php] soll [http://php.net/session_cache_expire] manchmal [http://php.net/session_start] helfen [http://php.net/session_destroy] ;-)

user profile iconMarco D. hat folgendes geschrieben:
Ich mache das so:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
// gibt true zurück, wenn der User eingeloggt ist
// gibt false zurück, wenn der User nicht eingeloggt ist
function IsLoggedIn() {
  if (empty($_SESSION['name']))
    return false;
    else return true;
}

//loggt den User aus und entfernt alle $_SESSION-Variablen
function Logout() {
  $_SESSION['name'] = '';
  $_SESSION['id'] = '';
  $_SESSION['language'] = '';
  $_SESSION['ip'] = '';
}

Wenn man schon die Session-Verwaltung von PHP verwendet, dann sollte man sie auch korrekt abfragen ... Sehe ich in keiner deiner beiden funktionen ...

user profile iconMarco D. hat folgendes geschrieben:
user profile iconBenBE hat folgendes geschrieben:

Fazit: Bisher würde ich keinen der gebrachten Vorschläge auf meinen Server loslassen - nicht mal im Safe-Mode*!!!

Warum nicht?

Da bisher kaum konstruktive Vorschläge in den betroffenen Quelltext übernommen wurden und ich mich zusammenreißen musste, um dich nicht gleich heimzusuchen :P


Marco D. - Mo 08.01.07 23:11

Ok. Schaue ich mir bei Gelegenheit mal an. ;)