Wie um zu überprüfen, Benutzername und Passwort passt die Datenbank-Werte
Ich bin wirklich Leid, wenn die Frage scheint dumm. Aber ich versuche schon seit Tagen zu überprüfen, meine username
und password
in der Datenbank übereinstimmt, was ich Schreibe in die html
Seite... Das ist mein Login-Formular...
<form method="POST" action="Dashboard/Dashboard.php">
<div class="form-group md-form">
<!--<input type="email" class="form-control" id="email" value="" placeholder="Enter email address">-->
<i class="fa fa-user prefix grey-text"></i>
<input name="username" id="username" type="text" class="form-control" required>
<label for="defaultForm-email">Username</label>
</div>
<div class="form-group md-form">
<!--<input type="password" class="form-control" id="password" value="" placeholder="Enter password">-->
<i class="fa fa-lock prefix grey-text"></i>
<input name="password" id="password" type="password" class="form-control" required>
<label for="defaultForm-pass">Your password</label>
</div>
<div class="text-center">
<button type="reset" class="btn btn-amber btn-sm"><strong>Reset</strong></button>
<input type="submit" name="submit" id="submit" class="btn btn-green btn-sm" value="Sign in">
</div>
</form>
- Und dies ist der code(php
) ich verwende in Dashboard.php
<?php
$servername = "localhost";
$username = "root";
$password = "";
$databaseName = "test";
$conn = mysqli_connect($servername, $username, $password, $databaseName);
$un = $_POST['username'];
$pw = $_POST['password'];
print $pass . "_" . $email;
$query = mysqli_query($conn, "SELECT log_username,log_password FROM login WHERE log_username='$un' AND log_password='$pw'");
$result_can = mysqli_query($conn, $query);
while ($row = mysql_fetch_assoc($result_can)) {
$check_username = $row['username'];
$check_password = $row['password'];
}
if ($un == $check_username && $pw == $check_password) {
$message = "ok";
echo "<script type='text/javascript'>alert('$message');</script>";
header("Location: Doctors.php");
} else {
$message = "No";
echo "<script type='text/javascript'>alert('$message');</script>";
header("Location: Doctors.php");
}
?>
Ich habe wirklich versucht, wie Tausende Male, aber konnte nicht herausfinden, wo ich falsch gelaufen ist... Kann jemand mir bitte helfen?
Ich weiß mein code ist offen für SQL-injection, aber ich interessiere mich nicht über Sie als dies ist ein Beispiel, das ich brauchte, um zu zeigen, um meine Freunde So vernachlässigt, dass ein Teil.
"ich weiß, dass mein code ist offen für SQL-injection, aber ich don ' T care". Einige der gefährlichsten Worte, die jemals geschrieben wurden 🙂
Warum zeigen Sie Ihren Freunden ein Beispiel von so etwas sollte man niemals tun? Zeigen Sie Ihnen, wie es von Anfang an richtig. Außerdem hast du nicht eigentlich mal erklärt, welches problem Sie tatsächlich mit.
Es ist gut zu wissen, dass: Sie sind das speichern von Passwörtern auf der db als text, sehr schlecht, aber prolly man nicht aufpasst. Und vergleicht Sie sehr falsch als gut.
Mischen Sie keine verschiedenen Datenbank-Schnittstellen. Sie können nicht verwenden
Sie versuchen auch zu Holen
Warum zeigen Sie Ihren Freunden ein Beispiel von so etwas sollte man niemals tun? Zeigen Sie Ihnen, wie es von Anfang an richtig. Außerdem hast du nicht eigentlich mal erklärt, welches problem Sie tatsächlich mit.
Es ist gut zu wissen, dass: Sie sind das speichern von Passwörtern auf der db als text, sehr schlecht, aber prolly man nicht aufpasst. Und vergleicht Sie sehr falsch als gut.
Mischen Sie keine verschiedenen Datenbank-Schnittstellen. Sie können nicht verwenden
mysql_fetch_assoc
wenn Sie mit mysqli
.Sie versuchen auch zu Holen
log_username
und log_password
aus der Datenbank; aber auf Sie als username
und password
in das $row-arrayInformationsquelleAutor Jananath Banuka | 2017-10-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Stack-Überlauf ist für die "professionelle und Enthusiasten Programmierer." Mit Respekt, Sie haben uns gezeigt, code in deiner Frage, dass ist nicht sogar nah an, dass Sie würdig der name.
StackOverflow die Menschen nicht haben viel von a Sinn für humor über schlechte Sicherheits-code. Sie bekommen starke Reaktionen auf den code wie deiner, weil, naja, Equifax, und von Ashley Madison, und Adobe, und alle der rest von den Orten, die geknackt wurden, die von Internetkriminellen. Warum wir auf Sie springen? Weil wir nicht wie Cyberkriminelle und wir wollen nicht, um das Leben einfach für Sie. Freunde lassen nicht Freunde tun, schlechtes Passwort-Sicherheit. Freunde nicht zeigen, Freunde grob unsicheres Passwort-Validierung code.
Was ist falsch mit Ihrem code? Sie speichern Passwörter als plain text, und Sie sind anfällig für SQL-injection. Ich werde die Adresse der ersten dieser Fragen.
Glücklicherweise bietet php-Einrichtungen, gutes zu tun, die Passwort-Sicherheit. Über Sie hier Lesen. http://php.net/manual/en/faq.passwords.php Sie verwenden. Wie gehen Sie mit Passwörtern?
Wenn ein Benutzer versucht, sich in Sie eine Abfrage wie diese:
Dann fügen Sie die abgerufenen Passwort in eine Spalte mit dem Namen
$hash
.Verwenden Sie dann php ' s
password_verify()
- Funktion um zu überprüfen, ob das Passwort Ihr-wäre-user gab nur Sie entspricht dem Passwort in Ihrer Datenbank.Schließlich, überprüfen Sie, ob das Kennwort des Benutzers muss aufgewärmt werden, weil die Methode, die Sie zuvor verwendet, um die hash-es ist obsolet geworden.
Diese Sequenz ist zukunftssicherer, denn es kann sofort wieder Passwörter später, wenn die alte hashing-Methode wird zu einfach für cybercreeps zu knacken.
InformationsquelleAutor O. Jones
Aber es gibt einige Probleme hier, sowohl im code und in den Denkprozess. Wir arbeiten uns nach unten:
Dass
print
Linie sollte geben Ihnen eine Warnung. Die Variablen$pass
und$email
gibt es nicht. Entfernen Sie diese Zeile, es sei denn, was Sie waren versuchen zu tun ist, um zu drucken$un
und$pw
statt.Gibt es keine Notwendigkeit, um den Benutzernamen und das Kennwort Spalte. Wenn es eine übereinstimmung gibt, Sie wird immer die gleiche sein, wie
$un
und$pw
, die Sie bereits haben. Du bist nur überprüfen, ob der Benutzername und das Passwort richtig sind oder nicht, so dass die Auswahl einer einzelnen Spalte, ist gut genug. Vorzugsweise wird die Benutzer-id, sondern nur der Benutzername ausreichend.Beachten Sie, dass-vorausgesetzt, die Abfrage erfolgreich ausgeführt --
$query
enthält einemysqli_result
Objekt.Diese Zeile muss entfernt werden. Sie haben bereits ausgeführt, dass Ihre Abfrage und
$query
ist sein Ergebnis, was du hier tust, macht keinen Sinn und sollte Ihnen eine Warnung, oder vielleicht sogar ein fataler Fehler.Du nicht mix
mysql_*
undmysqli_*
Funktionen. Mitmysql_fetch_assoc()
hier sollte Ihnen ein schwerwiegender Fehler. Sollten Sie verwendenmysqli_fetch_assoc()
statt (auf$query
statt$result_can
), aber:Da sind Sie nur daran interessiert, ob oder nicht es wurde kein Ergebnis an alle, diesen ganzen Abschnitt geändert werden kann:
Diese stellen andere Probleme, weil Sie nicht verwenden können
header()
umleiten der Benutzer nach echo ' Ing Ihre<script>
tag (Sie bekommen ein "headers already sent" - Fehler). Wenn Sie möchten, dass der Javascript-alert, führen Sie die Umleitung mit Javascript sowie. Auch, dass$message
variable ist ziemlich nutzlos, Sie könnte genauso gut gesagt, die Nachricht direkt in den alert:Sobald Sie fix alle mit diesen Fragen, Sie haben immer noch einige denken, das zu tun.
admin' AND 1 --
oder wenn ich nur will kann ich einen Benutzernamen verwenden, derany' OR 1 --
und angemeldet sein, als der erste Benutzer in der Tabelle. Schauen Sie in die vorbereitete Aussagen und wie Sie funktionieren.Den wichtigsten Lektion hier sollte sein: wenn Sie die Entwicklung, und es funktioniert nicht, immer überprüfen Sie die Fehlerprotokolle, um zu sehen, ob es enthält Hinweise und biegen Sie auf die PHP-error-reporting-Funktionen, so dass Sie sehen können, was du falsch gemacht hast direkt in Ihrem browser.
InformationsquelleAutor rickdenhaan
Mehrere Probleme, einige wurden genannt, durch die Kommentare oben.
Mischen mysql_* vs. mysqli_* API
Rufen Sie die Abfrage mit
mysqli_query()
aber Sie versuchen zum abrufen von Ergebnissen mitmysql_fetch_assoc()
. Sie können nicht mischen diese verschiedenen APIs. Diemysql_*
Funktionen nicht verwenden, die Verbindung, die Sie geöffnet mitmysqli_connect()
-und Umgekehrt. Wählen Sie eine MySQL-Erweiterung und-stick mit it.Hinweis: verwenden Sie nicht
mysql_*
überhaupt. Es ist veraltet und wurde entfernt, von PHP 7.0+Abfragen mit Bedingungen für beide Benutzername und Passwort
Nur die Suche nach dem Benutzernamen, und Holen Sie sich das Passwort. Wenn Sie die Suche nach beide, dann wird die Suche null Zeilen zurückgeben, es sei denn, das richtige Kennwort verwendet wurde.
Das wollen Sie nicht. Sie wollen, um zu vermeiden, dass das Klartext-Passwort in der SQL-Abfrage. Suchen Sie einfach auf den Benutzernamen, und Holen Sie sich das gespeicherte Passwort und dann vergleichen Sie das, was Sie "abrufen", um das Benutzer-Passwort einzugeben.
Nicht initialisierte Variablen
Wenn du da keine Zeilen von der Abfrage, dann
$check_username
und$check_password
sind nie festgelegt. Dann vergleichen Sie die Variablen in der if-Anweisung. Kein schwerwiegender Fehler, aber schlechter Stil.Keine Passwort-hashing
Sie erscheinen, zu vergleichen, werden die Benutzer-Eingabe, die ich annehmen, ist Klartext, direkt zu dem, was in der Datenbank gespeichert. Sie sind Wahrscheinlich die Speicherung der Passwörter Falsch.
Statt, wenn Sie Ihr Kennwort zu speichern, verwenden Sie password_hash() ersten.
Keine Abfrage Parameter
Ich weiß, Sie sagten, Sie kümmern sich nicht um Ihre SQL-injection-Schwachstelle, aber das ist wie ein Elektriker und sagen, Sie kümmern sich nicht, dass Ihre elektrischen panel ist gefüllt mit öligen Lappen. Werden Sie sicher, dass die post Ihre Missachtung für die Sicherheit auf Ihrem LinkedIn-Profil, so die Arbeitgeber wissen, wer zu vermeiden.
Empfohlen, die Umsetzung
InformationsquelleAutor Bill Karwin