Bei der Verwendung von PHP -Erweiterung von PHP für Datenbankvorgänge sind Entwickler häufig einer Reihe von Methoden ausgesetzt, die von der MySQLI_STMT -Klasse bereitgestellt werden und die Aussagen mit dem Ziel der Verbesserung der Leistung und der Verbesserung der Sicherheit vorbereiten sollen. Die in PHP 8.1 eingeführte MySQLi_stmt :: Attr_get -Funktion ermöglicht es den Entwicklern, auf einige zugrunde liegende Eigenschaften von Vorverarbeitungsanweisungen zugreifen zu können. Die Einführung neuer Merkmale lenkte jedoch unweigerlich auf ihre Sicherheit auf. In diesem Artikel werden in MySQLi_stmt :: attr_get Sicherheitsrisiken erörtert und die potenziellen Risiken zusammengefasst.
MySQLI_STMT :: attr_get ist eine Funktion, mit der die Eigenschaften des Objekts von MySQLI_STMT erhalten werden. Sein Prototyp ist wie folgt:
public mysqli_stmt::attr_get(int $attribute): int|false
Es ermöglicht Entwicklern, einige interne Anweisungseigenschaften zu lesen, wie z .
Der Beispielcode lautet wie folgt:
$mysqli = new mysqli("localhost", "user", "password", "database");
$stmt = $mysqli->prepare("SELECT * FROM users WHERE status = ?");
$stmt->bind_param("s", $status);
$stmt->attr_set(MYSQLI_STMT_ATTR_UPDATE_MAX_LENGTH, true);
$stmt->execute();
$stmt->store_result();
$maxLenAttr = $stmt->attr_get(MYSQLI_STMT_ATTR_UPDATE_MAX_LENGTH);
echo "Attributwert: " . ($maxLenAttr ? "Aktivieren" : "未Aktivieren");
Aus Sicht der Funktion selbst ist Attr_get eine schreibgeschützte Funktion, die keinen Status ändern kann und keine Datenbankvorgänge direkt ausführt. Aus der traditionellen Sicht der SQL -Injektion stellt es daher nicht direkt eine Sicherheitsbedrohung dar.
Indirekte Risiken sind jedoch immer noch erwähnenswert:
Wenn der Entwickler das Rückgabeergebnis von attr_get dem Benutzer ohne ordnungsgemäße Filterung oder Verarbeitung vorlegt, können Informationen über die Systemdetails zur Systemimplementierung versehentlich durchgesickert werden. Zum Beispiel:
$url = "https://m66.net/debug.php?stmt_attr=" . $stmt->attr_get(MYSQLI_STMT_ATTR_UPDATE_MAX_LENGTH);
In diesem Szenario kann ein Angreifer dies verwenden, um zu spekulieren, ob bestimmte Optionen in der aktuellen Datenbankoperation aktiviert sind, wodurch komplexere Angriffe (z. B. Nebenkanalangriffe) unterstützt werden.
Einige Entwickler können Attr_get als Grundlage für die Überprüfung des Ausführungsstatus oder die Parameterüberprüfung missbrauchen und die Rückgabewertprüfung ignorieren, nachdem die Anweisung tatsächlich ausgeführt wurde. Zum Beispiel:
if ($stmt->attr_get(MYSQLI_STMT_ATTR_UPDATE_MAX_LENGTH)) {
// Missverstanden, dass die Aussage sicher oder erfolgreich ausgeführt wurde
}
Diese Praxis kann reale Ausführungsfehler oder Ausnahmen maskieren, was dazu führt, dass Schwachstellen ignoriert werden.
Da Attr_get begrenzte Attribute unterstützt, können auch die von verschiedenen Datenbanktreibern oder -versionen unterstützten Attribute variieren. Einige Eigenschaften können in einigen Umgebungen ungültig sein. Wenn der Entwickler nicht mit Kompatibilität umgeht, verursacht er Programmlogikfehler und führt weiter zu Sicherheits- oder Stabilitätsproblemen.
Um MySQLI_stmt :: attr_get sicherer zu verwenden, sollten Entwickler auf die folgenden Punkte achten:
Stellen Sie den Rückgabewert dem Front-End-Benutzer nicht aus. Bei Bedarf zum Debuggen protokollieren Sie es über das Protokollsystem, anstatt direkt über die Seite oder API auszugeben.
Verwenden Sie seine Ergebnisse nicht als einzige sichere Basis. Die Sicherheitsüberprüfung sollte auf der Durchführung von Rückgabewert- und Ausnahmebehandlungsmechanismen, nicht auf Attributlesungen basieren.
Verwendet in Verbindung mit der Versionserkennung. Stellen Sie vor der Verwendung fest, ob die aktuelle Umgebung relevante Attribute unterstützt, um Laufzeitfehler oder logische Abweichungen zu vermeiden.
Verwendet mit einem Fehlerbehandlungsmechanismus. Stellen Sie in Kombination mit MySQLI_Report () oder Ausnahmebefehlmechanismus sicher, dass die Aussage korrekt wahrgenommen und reagiert werden kann, wenn sie nicht ausgeführt wird.
Mysqli_stmt :: attr_get selbst hat keine offensichtlichen Sicherheitslücken, aber seine Nutzungsszenarien sind relativ eng und leicht missbraucht. Die Hauptrisiken liegen in der Abhängigkeitslogik von Informationsleckagen und Fehlern und nicht in herkömmlichen Sicherheitsproblemen wie SQL -Injektion oder Remoteausführung. Bei der Verwendung dieser Funktion sollten Entwickler die Lesbarkeit und Klugheit des Codes beibehalten und die entscheidenden Auswirkungen seiner Ergebnisse auf den endgültigen Programmfluss vermeiden. Das korrekte Verständnis seiner Verwendung und Grenzen ist der Schlüssel zur Gewährleistung einer sicheren und stabilen Entwicklung.