login php script was ist an dem falsch?

#1
PHP:
<?php 
session_start();
$pdo = new PDO('mysql:host=localhost;KKP', 'root', '');
if(isset($_GET['login'])) {
$email = $_POST['email'];
$passwort = $_POST['passwort'];
$statement = $pdo->prepare("SELECT * FROM User WHERE email = :email");
$result = $statement->execute(array('email' => $email));
$user = $statement->fetch();
//Überprüfung des Passworts
if ($user !== false && password_verify($passwort, $user['passwort'])) {
$_SESSION['userid'] = $user['id'];
die('Login erfolgreich. Weiter zu <a href="geheim.php">internen Bereich</a>');
} else {
$errorMessage = "E-Mail oder Passwort war ungültig<br>";
}
}
?>
<!DOCTYPE html> 
<html> 
<head>
  <title>Login</title> 
</head> 
<body>
<?php 
if(isset($errorMessage))
{
echo $errorMessage;
}
?>
<form action="?login=1" method="post">
E-Mail:<br>
<input type="email" size="40" maxlength="250" name="email"><br><br>
Dein Passwort:<br>
<input type="password" size="40"  maxlength="250" name="passwort"><br>
<input type="submit" value="Abschicken">
</form> 
</body>
</html>
 
#2
Hi

warum denkst du, dass es falsch ist? Was genau funktioniert nicht?

edit: Ein sicherheitsmäßiges Problem:
Deine Datenbank speichert Passwörter offensichtlich einfach so als Text. Das macht man nicht, aus vielen Gründen. Das Passwort zuerst durch bcrypt laufen lassen und nur das abspeichern; und hier beim Anmelden das empfangene Passwort bcrypten und die zwei bcrypt-Daten dann vergleichen.
 
Zuletzt bearbeitet:
#4
Hallo,

@Fragenfrager
Er fragt mit der GET-Variable (Zeile 4) einen URL-Parameter ab.
<form action="?login=1" method="post">
Zurück zum Thema:
Mir ist noch dies aufgefallen:
("SELECT * FROM User WHERE email = :email");
Bei dieser SQL-Abfrage fiel mir auf, das keine Variable im String ist:
Zumindest würde ich die SQL-Abfrage so schreiben:
SQL:
"SELECT * FROM User WHERE email = '$email'"
Wie schon Fragenfrager sagte, solltest du die Eingaben vorher mit isset() behandeln.
Ich empfehle dir noch, dass du Symbole wie ", <, >, & mithilfe der Funktion htmlspecialchars() in die HTML Entitäten umwandelst, um mögliche Fehler vorzubeugen.

Bezüglich der GET-Variable:
Ich würde an deiner Stelle nicht eine GET-Variable als Absende-Überprüfung nehmen, sondern überprüfen, ob der Button gesetzt ist.
Dafür braucht der Button einen Namen, welchen du mit der isset() Funktion behandelst.
PHP:
if (isset($_POST['btn'])){
//CODE
}
Vielleicht konnte ich dir etwas weiterhelfen

Mfg
 

Fragenfrager

Erfahrenes Mitglied
#5
Setzte vor Zeile 5 und 6 mal ein Echo und gucke, ob die Variablen befällt werden.
Ist das der Fall, führ Dein Sqlstatement mit dem Variablenwert direkt auf der Datenbank aus(Phpmyadmim). Bekommst Du das gewünschte Ergebnis?
Und nebenbei: SELECT * sollte vermieden werden. Besser, sicherer und schneller ist es, nur die gewünschte Spalte abzufragen, also SELECT email,password FROM....
 
#6
Bei dieser SQL-Abfrage fiel mir auf, das keine Variable im String ist:
Zumindest würde ich die SQL-Abfrage so schreiben:
Bitte nicht. In dem Punkt ist BlueVegettos Code ganz richtig, und deine Änderung würde SQL-Injections erlauben.
 
#7
Danke für deinen Kommentar sheel,

SQL-Injections kann man doch (soweit ich weiß), durch das maskieren von Zeichen, welche sich im SQL-Code befinden, verhindern.
Hierbei habe ich bei Eintragungen die Funktion mysqli_real_escape_string() verwendet.

Ist der Gebrauch der Funktion dennoch unzuverlässig oder wie?
Mfg
 

Bratkartoffel

gebratene Kartoffel
Premium-User
#8
Hi,

wenn du schon mit prepare() arbeitest, dann würde ich auch gleich mit bind_parameter() arbeiten. Das "real_escape_string" ist ein Überbleibsel aus alten Tagen...

Grüsse,
BK