Bei der PHP -Entwicklung ist die Vorbeugung von SQL -Injektionsangriffen eine entscheidende Sicherheitspraxis. Die Verwendung vorbereiteter Anweisungen und Bindungsparameter ist derzeit eine der am meisten empfohlenen Möglichkeiten. Obwohl die Funktion MySQLi_stmt :: attr_get nicht so direkt wie verbindliche Parameter ist, hat sie auch eine positive Bedeutung, um das Sicherheitsbewusstsein und die Fähigkeiten der Entwickler im Prozess des Verständnisses seiner Rolle und Prinzipien zu verbessern. In diesem Artikel wird die Rolle von MySQLI_STMT :: Attr_get vorgestellt und seine Hilfsrolle bei der Verhinderung der SQL -Injektion erläutert.
MySQLI_STMT :: attr_get ist eine Funktion, mit der der Attributwert des aktuellen Anweisungsobjekts erhalten wird. Der Hauptzweck besteht darin, die Werte einiger interner Eigenschaften zu überprüfen oder zu erhalten, wenn das Objekt MySQLI_STMT zur weiteren Verarbeitung oder Debugging verwendet wird.
Die Syntax ist wie folgt:
public mysqli_stmt::attr_get(int $attribute): int|false
Wo $ Attribut das Attribut ist, das Sie erhalten möchten, wie z .
Obwohl MySQLI_STMT :: attr_get selbst nicht direkt die SQL -Injektion verhindern, ähnelt es eher einem Debugging -Tool, aber in der Verwendung von Vorverarbeitungsanweisungen kann es den Entwicklern helfen, den sicheren Status der Ausführung der Anweisung zu überprüfen oder zu bestätigen, dass die Parameterbindung wie erwartet wirksam ist. Noch wichtiger ist, dass Entwickler es allmählich daran gewöhnt haben, über das MySQLi_stmt -Objekt zu operieren, weg von der Hochrisikokethode, die SQL direkt spleißen.
Im Folgenden verwenden wir ein Beispiel für die Verwendung von Vorverarbeitungsanweisungen, um zu veranschaulichen, wie die SQL -Injektion durch eine reguläre Methode verhindern und nachweisen, wie attr_get für die Attributprüfung verwendet wird.
Angenommen, wir haben ein Benutzeranmeldesystem und das Front-End gibt den Benutzernamen ein. Wir müssen die Datensätze in der Datenbank basierend auf diesem Benutzernamen abfragen.
$username = $_GET['username'];
$sql = "SELECT * FROM users WHERE username = '$username'";
$result = $mysqli->query($sql);
Wenn der vom Benutzer eingegebene Benutzername Administrator ist ' - wird der obige SQL als:
SELECT * FROM users WHERE username = 'admin' --'
Dies überspringt die Überprüfung der Passwort und führt zu schwerwiegenden Sicherheitslücken.
$mysqli = new mysqli("localhost", "user", "password", "database");
$stmt = $mysqli->prepare("SELECT * FROM users WHERE username = ?");
$stmt->bind_param("s", $_GET['username']);
$stmt->execute();
$result = $stmt->get_result();
// Optional:Überprüfen Sie einen Eigenschaftswert
$attr = $stmt->attr_get(MYSQLI_STMT_ATTR_UPDATE_MAX_LENGTH);
if ($attr !== false) {
// Ausgabeattributwert,Wird verwendet, um das Verhalten des Statements zu debuggen oder zu überprüfen
echo "Aktuelle Anweisungsattribute:$attr";
}
Im obigen Code:
prepe () erstellt eine vorkompilierte SQL -Vorlage.
Bind_param () bindet die Benutzereingabe als Parameter und wird nicht als SQL -Code analysiert.
Attr_get () kann verwendet werden, um Anweisungsattribute zu erhalten, mit denen Entwickler in einigen Szenarien den aktuellen Verhaltensstatus des Anweisungsobjekts beurteilen können.
Nehmen wir an, wir möchten die Benutzernamenparameter von einer Seite erhalten, auf der das Formular eingereicht wird https://m66.net/login.php und die Benutzerinformationen abfragen:
<form action="https://m66.net/login.php" method="get">
<input type="text" name="username" />
<input type="submit" value="Einloggen" />
</form>
Serverseitiger Verarbeitungscode:
$mysqli = new mysqli("localhost", "user", "password", "database");
$stmt = $mysqli->prepare("SELECT id, email FROM users WHERE username = ?");
$stmt->bind_param("s", $_GET['username']);
$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
echo "BenutzerID:" . $row['id'] . "<br>";
echo "Post:" . $row['email'] . "<br>";
}
// verwenden attr_get Eigenschaften überprüfen
$attr = $stmt->attr_get(MYSQLI_STMT_ATTR_UPDATE_MAX_LENGTH);
if ($attr !== false) {
error_log("stmt Eigentum:$attr", 0);
}
Obwohl MySQLi_stmt :: attr_get keine Funktion ist, die die SQL -Injektion direkt verhindert, ist es ein leistungsstarkes Tool, um den Status von Anweisungsobjekten im Kontext parametrisierter Abfragen mithilfe des Schnittstellens von MySQLI_STMT zu verstehen. In Kombination mit Prepe () und bind_param () hilft es nicht nur dabei, sichere Abfragen zu erstellen, sondern auch die Debugierbarkeit und Robustheit des Codes zu verbessern. Entwickler sollten die Verwendung parametrisierter Abfragen immer vorrangig machen und Toolfunktionen wie Attr_get verwenden, um die Transparenz und die Sicherheitskontrolle des Codes weiter zu verbessern.