|
You last visited: Today at 07:47
Advertisement
Passwort Validation
Discussion on Passwort Validation within the Web Development forum part of the Coders Den category.
01/03/2019, 13:26
|
#1
|
elite*gold: 127
Join Date: Nov 2018
Posts: 186
Received Thanks: 21
|
Passwort Validation
Hallo,
komischerweise ist jedes Passwort valide obwohl es eigentlich Invalide ist. Was mache ich falsch?
PHP Code:
<?php
$connection = new PDO('mysql:host=localhost;dbname=asasas', 'asasasas', 'asasasas');
if (isset($_GET["username"]) && !empty($_GET["password"])) {
$username = $_POST["username"];
$password = $_POST["password"];
$hash = password_hash($password, PASSWORD_DEFAULT);
echo $hash;
} else {
echo 'Einfach mal nö';
}
$stmt = $connection->prepare("SELECT * from users WHERE `username` = :username AND password = :password");
$stmt->bindValue(":username", $username);
$stmt->bindValue(":password", $hash);
$stmt->execute();
if (password_verify($password, $hash)) {
echo '1';
}
else {
echo '0';
}
?>
|
|
|
01/03/2019, 14:39
|
#2
|
Moderator
elite*gold: 558
Join Date: Feb 2010
Posts: 6,546
Received Thanks: 1,418
|
Ist schon einige Jahre her, dass ich mit PHP gearbeitet habe, aber ich versuchs mal.
Du bekommst ein Passwort und einen Benutzernamen übergeben, erzeugst von diesem Passwort den Hash und überprüfst dann, ob das Passwort zu dem Hash passt. Das ist natürlich immer der Fall, weil du ja das Passwort mit dem Hash vergleichst, den du von eben diesem Passwort erzeugt hast.
Deine Datenbankabfrage dazwischen hat keinen Effekt. Du fragst zwar die Daten eines Benutzers ab, der den selben Benutzernamen und den selben Passworthash hat, aber du interessierst dich nicht für das Ergebnis.
Mögliche Lösungen:
- Um zu erkennen, ob es einen Benutzer mit dem Passwort gibt, solltest du also prüfen, ob du einen Datensatz aus der Datenbank zurückbekommen hast. Wenn es einer ist, gibt es einen Benutzer mit dem Passwort und deine Passwortüberprüfung war erfolgreich. Ein Vergleich mit dem Hash in PHP ist dann nicht notwendig.
- Der Vergleich von Passwort und Hash würde nur Sinn ergeben, wenn du den Benutzer nur über seinen Namen aus der Datenbank holst und dann den Hash aus der Datenbank mit dem eingegeben Passwort vergleichst. Wenn das erfolgreich ist, stimmen Benutzernamen und Passwort des Benutzers.
Edit:
Ich sehe gerade, du hast da noch ein merkwürdiges Konstrukt in deinem Code. Du holst die Benutzernamen und Passwort aus $_POST, prüfst davor allerdings die Werte von $_GET. Ich weiß ja nicht wie du die Seite aufrufst, aber es wäre sinnvoll dich für GET oder POST für die Daten zu entscheiden, dabei wäre POST zu empfehlen, da du Daten überträgst die nicht im Browserverlauf oder deinen Logdateien auf dem Server stehen sollten.
|
|
|
01/04/2019, 20:39
|
#3
|
elite*gold: 313
Join Date: Oct 2014
Posts: 1,367
Received Thanks: 284
|
Mir wurde auch schon öfters gesagt, dass man das Passwort Clientseitig mittels javaScript hashen soll zwecks Sicherheit.
|
|
|
01/04/2019, 22:57
|
#4
|
elite*gold: 100
Join Date: Apr 2008
Posts: 860
Received Thanks: 1,487
|
Quote:
Originally Posted by Mad0ck
Mir wurde auch schon öfters gesagt, dass man das Passwort Clientseitig mittels javaScript hashen soll zwecks Sicherheit.
|
Klingt nach ner ziemlich beschissenen Idee ...
|
|
|
01/05/2019, 21:05
|
#5
|
elite*gold: 313
Join Date: Oct 2014
Posts: 1,367
Received Thanks: 284
|
Quote:
Originally Posted by florian0
Klingt nach ner ziemlich beschissenen Idee ...
|
Wenn du das mit PHP verschlüsselst, soll das Passwort dennoch irgendwo im Klartext übertragen werden, und nicht direkt hashed .
Sofern das überhaupt stimmt würde dann eine direkte Client seitige Verschlüsselung schon Sinn machen oder o.o
|
|
|
01/05/2019, 21:52
|
#6
|
elite*gold: 0
Join Date: Apr 2011
Posts: 11,115
Received Thanks: 2,436
|
Quote:
Originally Posted by Mad0ck
Wenn du das mit PHP verschlüsselst, soll das Passwort dennoch irgendwo im Klartext übertragen werden, und nicht direkt hashed .
Sofern das überhaupt stimmt würde dann eine direkte Client seitige Verschlüsselung schon Sinn machen oder o.o
|
Wenn du das im Javascript "verschlüsselst" dann wird es doch erst recht hashed übertragen..
Es macht 0 Sinn es im Javascript zu tun...
|
|
|
01/06/2019, 00:43
|
#7
|
elite*gold: 100
Join Date: Apr 2008
Posts: 860
Received Thanks: 1,487
|
Quote:
Originally Posted by Mad0ck
Wenn du das mit PHP verschlüsselst, soll das Passwort dennoch irgendwo im Klartext übertragen werden, und nicht direkt hashed .
Sofern das überhaupt stimmt würde dann eine direkte Client seitige Verschlüsselung schon Sinn machen oder o.o
|
Wenn das Passwort als Hash übertragen wird, wirst du es auf dem Server ja auch schon als Hash speichern. Dein Passwort ist dann zwar nicht mehr im "Klartext", dafür entspricht der übertragene Hash dem Wert in der Datenbank und im Falle eines Hacks braucht der Hacker dann nicht mal mehr die Hashes zu knacken, schließlich akzeptiert dein Login ja die gehashten Passwörter.
Was du damit tust ist klar: Du überträgst das Passwort zwar nicht mehr im Klartext, dafür speicherst du es im "Klartext".
Wenn das Passwort verschlüsselt wird statt gehashed, sieht das Ganze anders aus. Dann musst du aber ne asymetrische Chiffre mit nem sicheren Key nehmen sonst ist der Key ja bekannt.
In beiden Fällen ist es aber auch nur annähernd sicher wenn du auch die Integrität des JS prüfst. Jemand der auf den Datenstrom zugreifen kann in der Regel auch Einfluss auf die übertragenen Inhalte haben und damit deiner Verschlüsselung einfach nen Channel für den Datenexport verpassen und niemand merkt es.
|
|
|
01/06/2019, 12:27
|
#8
|
elite*gold: 46
Join Date: Oct 2010
Posts: 782
Received Thanks: 525
|
Quote:
Originally Posted by florian0
Dein Passwort ist dann zwar nicht mehr im "Klartext", dafür entspricht der übertragene Hash dem Wert in der Datenbank und im Falle eines Hacks braucht der Hacker dann nicht mal mehr die Hashes zu knacken, schließlich akzeptiert dein Login ja die gehashten Passwörter.
|
Man kann aber den übermittelten Hash auf dem Server nochmal hashen, dann muss der Angreifer trotzdem das Passwort kennen und nicht nur den Hash (oder halt die auf dem Server verwendete Hash Funktion brechen können, was er aber beim "normalen" Verfahren ja auch müsste).
Aber es stimmt, dass es nicht wirklich mehr Sinn macht das PW clientseitig zu hashen, die Verbindung sollte sowieso sicher verschlüsselt sein, und wenn sie das nicht ist hilft auch ein clientseitiges hashen nicht.
|
|
|
01/06/2019, 13:24
|
#9
|
elite*gold: 100
Join Date: Apr 2008
Posts: 860
Received Thanks: 1,487
|
Quote:
Originally Posted by C0untLizzi
Man kann aber den übermittelten Hash auf dem Server nochmal hashen, dann muss der Angreifer trotzdem das Passwort kennen und nicht nur den Hash (oder halt die auf dem Server verwendete Hash Funktion brechen können, was er aber beim "normalen" Verfahren ja auch müsste).
|
Ja aber das bringt ja nix. Dann hast du halt nen Hash der dein "Plaintext" wird und der Hash vom Hash der dein "Ciphertext" wird. Entweder man holt sich das PW mitm Keylogger, dann ist eh death, oder durch Netzwerkmitschnitt (was Madock ja verhindern wollte), dann ists auch RIP. Durch den clientside Hash gewinnst du nichts außer vielleicht mehr Stellen im PW zum Preis eines wesentlich verringerten Charset. Doppelter Hash verhindert nur das man an das eigentliche PW kommt, aber das muss man ja auch nicht mehr.
|
|
|
01/06/2019, 21:43
|
#10
|
elite*gold: 50
Join Date: Aug 2013
Posts: 1,713
Received Thanks: 1,389
|
Quote:
Originally Posted by .Neø
...
PHP Code:
<?php ... if (isset([B]$_GET[/B]["username"]) && !empty([B]$_GET[/B]["password"])) { $username = [B]$_POST[/B]["username"]; $password = [B]$_POST[/B]["password"]; $hash = password_hash($password, PASSWORD_DEFAULT); echo $hash; } else { echo 'Einfach mal nö'; } ... ?>
|
Du musst ja im <form> Tag eine Methode und eine Action angeben wenn die Methode POST ist und zu einem Login weiterleitet musst du dort auch mit POST Arbeiten.
Denn du kannst eine POST übergabe nicht mit GET verarbeiten.
GET Variablen werden mittels URL übergeben und POST Variablen werden mittels Formular übergeben somit macht deine if-Abfrage schon kein Sinn mehr. Mach aus $_GET einfach $_POST und es sollte eigentlich funktionieren.
#verbessertmichwennichfalschliegedanke
|
|
|
01/07/2019, 23:29
|
#11
|
elite*gold: 127
Join Date: Nov 2018
Posts: 186
Received Thanks: 21
|
PHP Code:
<?php
$connection = new PDO('mysql:host=localhost;dbname=xxx', 'xxx', 'xxx');
$username = $_GET["username"]; $password = $_GET["password"];
$stmt = $connection->prepare("SELECT * from users WHERE `username` = :username AND password = :password"); $stmt->bindValue(":username", $username); $stmt->bindValue(":password", $password); $stmt->execute();
if ($stmt->fetchColumn() == 1) { echo '1'; } else { echo '0'; } ?>
PHP Code:
using System; using System.Net; using System.Windows.Forms;
namespace AmestrisRP___ACLS { public partial class Form1 : Form { public Form1() { InitializeComponent(); }
private void button1_Click(object sender, EventArgs e) { string response = new WebClient().DownloadString("https://meinedomain.com/login/login.php?username=" + textBox1.Text + "&password=" + textBox2.Text); switch (response.ToLower()) { case "0": { MessageBox.Show("Benutzername / Passwort falsch!"); break; } case "1": { //MessageBox.Show("Willkommen zurück " + textBox1.Text);
string theUsername = textBox1.Text; Properties.Settings.Default.LastUsername = theUsername; Properties.Settings.Default.Save(); this.Hide(); Anwendung app = new Anwendung(); app.Show(); break; } default: break; } } } }
Fixxed ...
|
|
|
01/08/2019, 19:14
|
#12
|
elite*gold: 0
Join Date: Jun 2013
Posts: 405
Received Thanks: 84
|
Quote:
Originally Posted by .Neø
PHP Code:
<?php
$connection = new PDO('mysql:host=localhost;dbname=acls', '', '');
$username = $_GET["username"]; $password = $_GET["password"];
$stmt = $connection->prepare("SELECT * from users WHERE `username` = :username AND password = :password"); $stmt->bindValue(":username", $username); $stmt->bindValue(":password", $password); $stmt->execute();
if ($stmt->fetchColumn() == 1) { echo '1'; } else { echo '0'; } ?>
PHP Code:
using System; using System.Net; using System.Windows.Forms;
namespace AmestrisRP___ACLS { public partial class Form1 : Form { public Form1() { InitializeComponent(); }
private void button1_Click(object sender, EventArgs e) { string response = new WebClient().DownloadString("https://meinedomain.com/login/login.php?username=" + textBox1.Text + "&password=" + textBox2.Text); switch (response.ToLower()) { case "0": { MessageBox.Show("Benutzername / Passwort falsch!"); break; } case "1": { //MessageBox.Show("Willkommen zurück " + textBox1.Text);
string theUsername = textBox1.Text; Properties.Settings.Default.LastUsername = theUsername; Properties.Settings.Default.Save(); this.Hide(); Anwendung app = new Anwendung(); app.Show(); break; } default: break; } } } }
Fixxed ...
|
Ich würde die Datenbank-Config rausnehmen und wie von manchen Usern schon angesprochen, das Passwort niemals über GET zu holen...wieso nutzt du nicht einfach POST?
|
|
|
01/09/2019, 10:31
|
#13
|
elite*gold: 300
Join Date: Apr 2013
Posts: 3,234
Received Thanks: 1,205
|
Quote:
Originally Posted by .Neø
PHP Code:
<?php
$connection = new PDO('mysql:host=localhost;dbname=acls', 'acls', 'Kdp53!x7');
$username = $_GET["username"];
$password = $_GET["password"];
$stmt = $connection->prepare("SELECT * from users WHERE `username` = :username AND password = :password");
$stmt->bindValue(":username", $username);
$stmt->bindValue(":password", $password);
$stmt->execute();
if ($stmt->fetchColumn() == 1) {
echo '1';
}
else {
echo '0';
}
?>
PHP Code:
using System;
using System.Net;
using System.Windows.Forms;
namespace AmestrisRP___ACLS
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
string response = new WebClient().DownloadString("https://meinedomain.com/login/login.php?username=" + textBox1.Text + "&password=" + textBox2.Text);
switch (response.ToLower())
{
case "0":
{
MessageBox.Show("Benutzername / Passwort falsch!");
break;
}
case "1":
{
//MessageBox.Show("Willkommen zurück " + textBox1.Text);
string theUsername = textBox1.Text;
Properties.Settings.Default.LastUsername = theUsername;
Properties.Settings.Default.Save();
this.Hide();
Anwendung app = new Anwendung();
app.Show();
break;
}
default:
break;
}
}
}
}
Fixxed ...
|
Warum ein switch/case wenn es nur 2 Fälle gibt? Und warum wird das Passwort über GET übergeben?
|
|
|
01/09/2019, 18:58
|
#14
|
elite*gold: 50
Join Date: Nov 2018
Posts: 1,068
Received Thanks: 2,595
|
Zuerst wird darüber diskutiert, wie man am besten Passwörter übermittelt und in einer DB speichert. Sehr gut, wie OP einfach alles ignoriert und eine Lösung vorschlägt, in der die Passwörter in Plaintext gespeichert werden.
|
|
|
01/18/2019, 13:58
|
#15
|
elite*gold: 127
Join Date: Nov 2018
Posts: 186
Received Thanks: 21
|
man bekommt keine brauchbare antwort mit example nur lange texte wie es gehen könnte das bringt nix meine lösung funktioniert und bin damit zufrieden
|
|
|
Similar Threads
|
bypass the "chracters validation" with new pupils
08/03/2009 - Browsergames - 3 Replies
hello all,
i was looking at the source codes of the bots that are published here, and i've noticed that none of them can register new pupils in case a chracter validation is required.
i was wondering if there is a way to bypass this character validation. is there a way to send the data to mybrute servers without actually be on the page and cliclking the right buttons?
i am asking because i've noticed that there are some brutes who need this charactes validation when a new pupil is...
|
got no validation E-Mail?
08/29/2005 - Main - 0 Replies
send me a mail to god elitepvpers.com with your account name, I'll add you as soon as possible
|
All times are GMT +1. The time now is 07:49.
|
|