Bei der Entwicklung von PHP -Websites ist die Benutzeranmeldungsfunktion fast ein wesentlicher Bestandteil davon. Wenn die Benutzereingabe jedoch versehentlich verarbeitet wird, ist es anfällig für SQL -Injektionsangriffe. MySQLI :: STMT_INIT ist eine Methode, die durch die MySQLI -Erweiterung bereitgestellt wird, die effektiv durch SQL -Injektion mit Vorverarbeitungsanweisungen verhindert werden kann. In diesem Artikel wird ein bestimmtes Beispiel verwendet, um zu beschreiben, wie Sie einen sicheren Mechanismus zur Anmeldeauthentifizierung implementieren können.
Die SQL -Injektion ist eine Angriffstechnologie, bei der ein Angreifer mit der ursprünglichen Abfragelogik durch die Injektion böswilliger SQL -Anweisungen in das Eingabefeld tampiert. Zum Beispiel, wenn Sie SQL direkt spleißen:
$sql = "SELECT * FROM users WHERE username = '$username' AND password = '$password'";
Ein Angreifer kann 'oder' 1 '=' 1 als Benutzername oder Passwort eingeben, so dass die Abfrage immer wahr ist und die Authentifizierung umgeht.
MySQLI :: STMT_INIT wird verwendet, um ein MySQLI_STMT -Objekt zu initialisieren. Es ist der erste Schritt bei der Implementierung von Vorverarbeitungsanweisungen. Es kann SQL strikt von der Benutzereingabe unterscheiden, wodurch Injektionsangriffe effektiv verhindert werden.
Hier ist ein Beispiel für eine sichere Anmeldeformularüberprüfung:
<?php
// Datenbankverbindung
$mysqli = new mysqli("localhost", "db_user", "db_password", "my_database");
// Überprüfen Sie die Verbindung
if ($mysqli->connect_errno) {
die("Verbindung ist fehlgeschlagen: " . $mysqli->connect_error);
}
// Benutzername und Passwort für Benutzereinstellungen
$username = $_POST['username'];
$password = $_POST['password'];
// Initialisieren Sie ein Vorverarbeitungsobjekt
$stmt = $mysqli->stmt_init();
// schreiben SQL Abfrageanweisung,verwenden ? Platzhalter
$sql = "SELECT id, password_hash FROM users WHERE username = ?";
// Vorbereitungserklärung
if ($stmt->prepare($sql)) {
// Binden Sie Parameter(s äußern string Typ)
$stmt->bind_param("s", $username);
// Ausführungsanweisung
$stmt->execute();
// Ergebnisse erhalten
$stmt->bind_result($user_id, $password_hash);
// Stellen Sie fest, ob es ein Ergebnis gibt
if ($stmt->fetch()) {
// Passwort überprüfen(Angenommen, die Datenbank ist gespeichert password_hash() Ergebnisse)
if (password_verify($password, $password_hash)) {
echo "Erfolgreich anmelden,Willkommen Benutzer ID:$user_id";
// Richten Sie eine Sitzung ein oder springen,Zum Beispiel:
// header("Location: https://m66.net/dashboard.php");
} else {
echo "Fehlerkennwort";
}
} else {
echo "Der Benutzername existiert nicht";
}
// Aussage
$stmt->close();
} else {
echo "SQL Erklärung Vorbereitung ist fehlgeschlagen: " . $mysqli->error;
}
// Schließen Sie die Verbindung
$mysqli->close();
?>
Durch die Verwendung von BIND_PARAM mit MySQLI :: STMT_INIT mit Vorverarbeitungsanweisungen können wir SQL -Injektionsangriffe effektiv verhindern. Vorverarbeitungsanweisungen sollten immer in der Entwicklung verwendet werden, um Benutzereingaben zu verarbeiten, insbesondere wenn Datenbankvorgänge beteiligt sind. Darüber hinaus sollten Funktionen wie Password_hash () und Passage_verify () verwendet werden, um die Passwortsicherheit zu verbessern.
Wenn Sie ein Login -System oder ein Benutzerauthentifizierungsmodul erstellen, verwenden Sie zuerst diese Methode, was viel sicherer ist als herkömmliches String -Spleißen.