PHP MySQL Login

Mitglied: Yanmai

Yanmai (Level 1)

12.11.2016 um 22:40 Uhr, 755 Aufrufe, 7 Kommentare

Hallo ihr Administratoren,
ich habe eine Datenbank, in der alle User des Netzwerkes enthalten sind. Wenn ein User sich einloggen will, dann soll PHP die Datenbank durchsuchen und das Passwort abgleichen. Wenn dies korrekt ist, soll eine Session Variable erstellt werden und eine neue Seite aufgerufen werden (<meta http-equiv="refresh" content="2; URL=seite2.php"/>). Die seite2.php enthält dann auch die Session und ruft anhand von dieser Variable dann den Username ab. Ich habe schonmal einen Ansatz:

01.
<?php
02.
session_start();
03.
$verhalten = 0;
04.

05.
   	$conn = mysqli_connect($servername, $username,$password,$database);
06.

07.
	if($conn)
08.
	{
09.
		if(!isset($_SESSION["username"]) AND !isset($_GET["page"])) {
10.
			if($_GET["page"] == "log") {
11.
				$CurrentUser = mysqli_real_escape_string($conn, $_POST["user"]);
12.
				$UserPasswort = mysqli_real_escape_string($conn, $_POST["password"]);
13.
				$sqlQuery = "SELECT passwort FROM `Benutzerliste` WHERE username='$CurrentUser'";
14.
				$result = mysqli_query($conn, $sqlQuery);
15.
				if($result)
16.
				{	
17.
					if(password_verify($UserPasswort, $result["passwort"]))
18.
					{
19.
						$_SESSION["username"] = $CurrentUser;
20.
						$verhalten = 1;
21.
					} else {
22.
						echo "Fehler";
23.
						$verhalten = 2;
24.
					}
25.
				}
26.
				else
27.
				{
28.
					echo "Error in SQL statement";
29.
					$vergessen = 2;
30.
				}
31.
			}
32.
		}
33.
	}
34.
?>
01.
<form method="post" action="mslogin.php?page=log">
02.
				<table cellpadding="20px">
03.
					<tr>
04.
						<td><font color="919191" size="+1" face="Calibri"><label>Benutzername:</label></font></td>
05.
						<td><input type="text" name="user"/></td>
06.
					</tr>
07.
					<tr>
08.
						<td><font color="919191" size="+1" face="Calibri"><label>Passwort:</label></font></td>
09.
						<td><input type="password" name="password"/></td>
10.
					</tr>
11.
					<tr>
12.
						<td colspan="2"><input type="submit" /></td>
13.
					</tr>
14.
				</table>
15.
			</form>
Der <meta refresh Teil befindet sich im header der Website. Wie kann man dieses Problem lösen? Es passiert im Moment nichts
Mitglied: BirdyB
12.11.2016 um 23:25 Uhr
Hi,
ich würde schonmal garkeine Passwörter direkt übertragen, sondern nur Hashes!!!
Und wieso der <meta>-Tag?

Beste Grüße!
Mitglied: maretz
13.11.2016 um 09:39 Uhr
Moin,

zuerst mal würde ich ebenfalls dazu tendieren keine plain-Strings zu übertragen. Mit Escape ist zwar schon gut aber generell gibt es dafür keinen Grund (ok, https usw. wäre natürlich auch möglich).

Dann würde ich z.B. eine Abfrage machen wie "select xyz from abc where username LIKE "$username" AND password LIKE "$passwort"". Damit hast du schon mal einen Vergleich gespart - die DB muss eh vergleichen (den Usernamen), dann brauchst du nich 100.000 Ergebnisse noch mal vergleichen lassen (passwort).

Weiterhin würde ich die Felder im Quellcode nicht "user" und "password" nennen - dies macht heute jeder script-robot dann direkt als brute-force. Nenne die Felder halt "jubelju" und "halleluja" oder sonstwie. Dies schützt natürlich nicht vor einem Angriff, aber zumindest etwas ruhe vor den Skript-Kiddys die einfach nur ihr Script auf das Internet losjagen.
Mitglied: kaiand1
13.11.2016 um 10:55 Uhr
Gegen Angriffe ist ja noch meist ein Script das die Abfragen zählt und wenn x Fehlerhafte/Anfragen in y Zeit erfolgen wird IP/User gesperrt Temporär was weitere Angriffe erschwert.
Zudem ist es auch nicht Optimal alles in Kekse zu schreiben die der Angreifer eh Manipulieren kann.
Mitglied: Yanmai
13.11.2016 um 12:28 Uhr
Vielen Dank erstmal für die Antworten

In der Datenbank werden nur gehashte Passwörter gespeichert. Wenn sich Benutzer a einloggt, wird das gehashte Passwort von Benutzer a ausgegeben und über password_verify() überprüft. Also soll ich das plain Password auch hashen? Kommt dann genau das selbe raus?

Wenn der Login erstmal funktioniert, werde ich mir Gedanken machen, wie man den Login gegen brute force Angriffe schützen kann
Mitglied: Yanmai
13.11.2016 um 12:32 Uhr
Ich habe das in einem YouTube Tutorial gesehen, dass dann die andere Seite geöffnet wird und dieser dann die Session Variable übergeben wird.
Mitglied: eagle2
14.11.2016 um 20:39 Uhr
Moin Yanmai,

versuch mal den Redirect direkt in PHP zu machen, über die Header-Funktion (Erklärung wie das geht).

Ansonsten würde ich dir empfehlen, dich systematisch in das Thema einzuarbeiten. Auch wenn ja inzwischen alles online und kostenlos sein soll, möchte ich dabei mal Werbung für zwei Bücher machen (mit denen ich nichts zu tun habe und auch keine Affiliate bekomme oder sonst irgendwas):

PHP & MySQL für Kids
PHP & MySQL Praxisbuch für Kids

Im ersten Buch lernt man die Basics, im zweiten wird dann u.a. auch ein vollständiges Loginsystem entwickelt (abgesehen davon, dass da noch SHA1 für Passwörter verwendet wird - die password_hash/password_verify-Funktionen sind da deutlich besser).

Viele Grüße
eagle2
Mitglied: Sheogorath
15.11.2016 um 11:02 Uhr
Moin,

ich würde schonmal garkeine Passwörter direkt übertragen, sondern nur Hashes!!!

Ähm.. nein?

Denn was machst du auf der Gegenseite mit Hashes? Du vergleichst sie mit dem Hash der in deiner DB gespeichert ist? Dann speicherst du deine Passwörter ja doch quasi wieder im Plaintext. Nur dass du sie eben Clientseitig nochmal in was anderen verpackst.

Deswegen werden Passwörter in der Regel tatsächlich übertragen. Aber man kann natürlich so schöne Dinge wie Challange-Response implementieren. Aber nun ja, das ist in der heutigen Praxis zum Glück eigentlich untergegangen, denn man hat halt HTTPS, 2FA und OAuth. Alles mehr oder weniger sicher, aber wie gesagt Hashes überträgt man eigentlich nur da, wo man keine Lust mehr auf sonst was hat.

Und nicht zu vergessen dass CR auch nur funktioniert solange auf beiden Seiten die Passwörter vorliegen, sprich du deine Passwörter irgendwo im Plaintext speichern musst. Das ist bei diesem Use-case weit fahrlässiger als sie irgendwo zu übertragen. Zumindest wenn man HTTPS oder ähnliches als Transport Protokoll verwendet.

Noch sicherer wäre natürlich eine zertifikatsbasierte Authentifizierung, aber das wird die meisten hier überfordern, also lassen wir das mal.

---

Und um dem Thread noch was sinnvolles beizufügen: Sichere Methoden zur Speicherung von Passwörtern in Datenbanken:
https://crackstation.net/hashing-security.htm

Gruß
Chris
Titel: PHP MySQL Login
Content-ID: 320791
Art des Inhalts: Frage
Ausgedruckt am: 19.06.2019 um 18:48:18 Uhr
URL: https://administrator.de/contentid/320791