Login Bereich erstellen

Du solltest aber den Benutzernamen für MySQL escapen, sonst kann man eine MySQL-Injection ganz leicht durchführen!
PHP:
$username = $_POST['username'];
$username = mysql_real_escape_string($username);


Außerdem verstehe ich nicht ganz, wieso per PHP überprüft wird, ob Benutzername und Passwort übereinstimmen und nicht per MySQL...
 
ich auch nicht, ich habs ja aus dem tutorial :)

was bedeutet "escapen"****? was ist eine MySQL-Injection?

ich hab gegoogelt und so langsam check ich auch mal was :)

Code:
<?php
// Datenbankabfrage zur Ueberpruefung der Logindaten
$query = "SELECT * FROM users WHERE user='{$_POST['username']}' AND password='{$_POST['password']}'";
mysql_query($query);

// Wir haben $_POST['password'] nicht geprueft, es koennte also alles darin
// stehen, was der User will. Zum Beispiel:
$_POST['username'] = 'aidan';
$_POST['password'] = "' OR ''='";

// Das bedeutet, der an MySQL gesendete Query wuerde sein:
echo $query;
?>

durch $_POST['password'] = "' OR ''='"; könnte ja jeder one pw rein soweit ich das gelesen habe... das nennt man injection oder?


aber mit dem escape macht der ärger:

Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: Access denied for user 'www-data'@'localhost' (using password: NO) in /data/multiserv/users/442745/projects/1002505/www/login.php on line 7

Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: A link to the server could not be established in /data/multiserv/users/442745/projects/1002505/www/login.php on line 7

Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: Access denied for user 'www-data'@'localhost' (using password: NO) in /data/multiserv/users/442745/projects/1002505/www/login.php on line 8

Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: A link to the server could not be established in /data/multiserv/users/442745/projects/1002505/www/login.php on line 8
Bitte gib einen Username und ein Password ein!


dann muss ich dann im register scrip die dann auch escapen damit das in der tabelle mit dem \ steht oder?

Irgendwie klappt des auch nicht... ich bin glaub echt zu dumm für PHP :(
kann mir einer auf die sprünge helfen
 
Zuletzt bearbeitet:
durch $_POST['password'] = "' OR ''='"; könnte ja jeder one pw rein soweit ich das gelesen habe... das nennt man injection oder?

Genau.
Wie du ja schon erkannt hast, kann man beim direkten Einsetzen von Get/Post-Variablen in eine Query zB mit ' der Datenbank vormachen, dass der String aus ist und das folgende wieder als SQL zu werten ist; somit kann der Benutzer zB mit seiner Passworteingabe das ganze Sicherheitszeug umgehen.

Muss ja nicht unbedingt ein Passwort sein und ' ist nicht das einzige problematische Zeichen, aber generell sollte ja kein Homepagebesucher einfach deine SQL-Abfragen umschreiben können.

Mit "Escapen" ist gemeint, dass das gesendete Passwort etc zuerst datenbankgerecht aufbereitet wird, damits auch mit ' keine Probleme gibt.
Bei Mysql gibts dafür eben die Funktion mysql_real_escape_string().

Zu den Fehlermeldungen: Wo ist denn der Code, der das ausgibt? Dein geposteter verwendet die Funktion ja gar nicht.
Grundsätzlich will wohl auch mysql_real_escape_string eine Verbindung zu einer Datenbank, obwohl von deinen Daten eigentlich nichts abgefragt/geändert wird.
Vielleicht falls eine neue Mysql-Version ein weiteres "Problemzeichen" hat, aber noch ein altes PHP läuft; damit da wirklich alles für die aktuelle Datenbank escaped wird.
 
Ich weis nicht, obs dir noch hilft, aber hier mal mein Loginscrip, das ich vor ein paar Monaten geschrieben haben.
Besteht nur aus 2 files. Reg.php und login.php

reg.php
PHP:
<?php
require_once ('../inc/config.php'); 

if (isset($_POST['mail'])) $mail = $_POST['mail'];
if (isset($_POST['name'])) $name = $_POST['name'];
if (isset($_POST['pw1'])) $pw1 = $_POST['pw1'];
if (isset($_POST['pw2'])) $pw2 = $_POST['pw2'];


// Schauen ob PW eingabe 1 und 2 identisch sind und PW verschlüsseln
if(isset($pw1) and isset($pw2)) 
{
if ($pw1 == $pw2)
{

//abfrage username vorhanden Ja / Nein

mysql_connect (MYSQL_HOST, MYSQL_BENUTZER, MYSQL_KENNWORT) or die ("Die Datenbank existiert nicht");
mysql_select_db(MYSQL_DATENBANK)or die("Auswahl der Datenbank fehlgeschlagen");

$result = mysql_query("SELECT * FROM user WHERE name LIKE '$name'"); 
$menge = mysql_num_rows($result); 

if($menge == 0) 
{
$pwmd5 = md5($pw1);
         $eintrag = "INSERT INTO user (name, pw, mail, datum) VALUES ('$name', '$pwmd5', '$mail', NOW())"; 
        $eintragen = mysql_query($eintrag); 
       
        if($eintragen == true) 
                { 
                        echo "Benutzername <b>$name</b> wurde erstellt. <a href=\"index.html\">Weiter</a>"; 
                        exit();
                   } 
        else 
                { 
                echo "Fehler beim Speichern des Benutzernames."; 
                } 
}
else
$vergeben ="Username schon vergeben";
}
else
$pwfehler = "Passwörter stimmen nicht überein.";
}
?>




<form action="" method="post">
<table width="492" border="1" align="center">
  <tr> 
    <td colspan="2">Registrierung</td>
  </tr>
  <tr> 
    <td width="187">Nickname</td>
    <td width="295"><input name="name" value="<?php if (isset ($name)) echo $name; ?>" type="text"><?php if (isset ($vergeben)) echo $vergeben; ?></td>
  </tr>
  <tr> 
    <td><p>Passwort</p></td>
    <td><input name="pw1" type="password"><?php if (isset ($pwfehler)) echo $pwfehler; ?></td>
  </tr
  ><tr> 
    <td><p>Passwort wiederholen</p></td>
    <td><input type="password" name="pw2"></td>
  </tr>
  <tr> 
    <td>Emailadresse</td>
    <td><input type="text" value="<?php if (isset ($mail)) echo $mail; ?>" name="mail"></td>
  </tr>
  <tr> 
      <td colspan="2"><input type="submit" name="Registrieren" value="Abschicken"></td>
  </tr>
</table>
</form>

und hier die Login.php
PHP:
<?php session_start(); ?>
<?php

if (isset($_POST['name'])) $name = $_POST['name']; //existieren variablen, führen wir das Script aus, falls nicht, nicht.
if (isset($_POST['pw']))
{
         $pw = $_POST['pw'];
        $pwmd5 = md5($pw); // PW zum md5 hasch umbauen !
        
        require_once ('config.php');  //config laden, verbindung zur mysql herstellen
        mysql_connect (MYSQL_HOST, MYSQL_BENUTZER, MYSQL_KENNWORT) or die ("Die Datenbank existiert nicht");
        mysql_select_db(MYSQL_DATENBANK)or die("Auswahl der Datenbank fehlgeschlagen");
        
        $abfrage = mysql_query("SELECT * FROM user WHERE name = '$name' and pw = '$pwmd5'"); 
        $menge = mysql_num_rows($abfrage); 
        
        if ($menge == 0) //resultat der abfrage, bei 0 kein resultat, user + pw gibts so nicht.
            {
                $fehler = "Username oder Passwort falsch";
            }
                else    //Login erfolgreich, session wird gestartet
                        {
                            
                            echo 'Sie wurden erfolgreich eingelogt<br>
                            <a href="http://mam.makeamillion.de/index.php">Zurück zur startseite</a>';
                            $_SESSION['name']="$name";                            
                            
                        
                            die();
                        }    
        

}
?>



<form action="" method="post">
  <table width="559" border="1" align="center">
    <tr> 
      <td width="68">Login</td>
      <td width="370">&nbsp;</td>
    </tr>
    <tr> 
      <td>User</td>
      <td><input type="text" name="name"> <?php if (isset ($fehler)) echo $fehler; ?></td>
    </tr>
    <tr> 
      <td>Passwort</td>
      <td><input type="password" name="pw"></td>
    </tr>
    <tr> 
      <td height="26" colspan="2" align="center"> 
        <input type="submit" name="Submit" value="Login"></td>
    </tr>
  </table>

</form>

Was du noch brauchst, ist die config.php
und die mysql (habe leider gerade kein beispiel)

config.php
PHP:
<?php

// Damit alle Fehler angezeigt werden
error_reporting(E_ALL);

// Zum Aufbau der Verbindung zur Datenbank
define ('MYSQL_HOST', 'localhost');


define ('MYSQL_BENUTZER', '******');
define ( 'MYSQL_KENNWORT',  '******');

define ( 'MYSQL_DATENBANK', '******' );
?>
 
Auch hier kein Schutz vor Injections...

Läuft das Script irgendwo?
Wäre ein gutes Beispiel, um zu zeigen, wie leicht man da rein kommt :D
 
Ganz Einfach:
Statt
Code:
if (isset($_POST['mail'])) $mail = $_POST['mail'];
schreibst du
Code:
if (isset($_POST['mail'])) $mail = mysql_real_escape_string($_POST['mail']);

Das Gleiche natürlich auch für die anderen Post-Variablen wie name, pw1 und pw2.

Grundsätzlich sollte mindestens alles, was per POST und GET hereinkommt sowie generell alle Sachen, die irgendwie von "außen" kommen und irgendwie mit der Datenbank zu tun haben werden (Abfrage, insert, update etc etc), escaped werden.
 
man warum klappt das bei mir nicht :(

ich habe folgendes gemacht wie es in jedem beispiel zu finden ist:

Code:
 $query =  mysql_query("SELECT * FROM users WHERE username='$username'",
            mysql_real_escape_string($username), mysql_real_escape_string($password));
 
Laut php.net Kann mysql_query maximal 2 Parameter mitbekommen: Die Query und eine Connectionresource.
Also nicht Query, Username und Passwort.

Und den Username solltest du VOR der Query escapen.
 
Zurück