Bei der Verbindung mit der Datenbank über PHP gibt die Funktion Connect () (wie z. B. MySQLI_Connect () oder PDO -Verbindung) erfolgreich zurück, was bedeutet, dass der Datenbankserver die Verbindungsanforderung erfolgreich akzeptiert hat. Selbst wenn die Verbindung erfolgreich ist, ist es dennoch möglich, dass auf eine bestimmte Datenbanktabelle aufgrund unzureichender Berechtigungen nicht zugegriffen werden kann. Dies ist eine häufige Verwirrung für viele Entwickler bei der Debugie von Datenbankberechtigungsfragen.
In diesem Artikel wird die Ursachen dieser Situation im Detail analysiert und Ideen zur Behebung des Problems unzureichender Berechtigungen analysiert.
Die Funktion Connect () ist nur für die Erstellung der Verbindung zum Datenbankserver verantwortlich. Es wird überprüft, ob der Benutzername und das Kennwort des Benutzers korrekt sind und ob der Server zugänglich ist.
Die Berechtigungssteuerung des Datenbankzugriffs ist jedoch feinkörniger, einschließlich:
Hat dieser Benutzer die Berechtigung, auf eine Datenbank zuzugreifen?
Gibt es eine Erlaubnis zum Lesen, Schreiben oder Ändern einer Tabelle
Gibt es eine Erlaubnis, bestimmte Operationen auszuführen (z. B. gespeicherte Verfahren)
Daher ist eine erfolgreiche Verbindung nur der erste Schritt, und nachfolgende Vorgänge in Datenbanktabellen erfordern weiterhin die entsprechende Berechtigungsunterstützung.
<?php
$mysqli = new mysqli("m66.net", "username", "password", "database");
// Verbindung erfolgreich
if ($mysqli->connect_errno) {
echo "Verbindung ist fehlgeschlagen: " . $mysqli->connect_error;
exit();
}
// Versuchen Sie, auf die Tabelle zuzugreifen
$result = $mysqli->query("SELECT * FROM sensitive_table");
if (!$result) {
echo "Abfrage fehlgeschlagen,Fehlermeldung:" . $mysqli->error;
}
?>
Im obigen Code meldet Connect () keinen Fehler, kann jedoch bei der Ausführung der Abfrage angezeigt werden:
Abfrage fehlgeschlagen,Fehlermeldung:Access denied for user 'username'@'host' to database 'database'
oder:
Abfrage fehlgeschlagen,Fehlermeldung:SELECT command denied to user 'username'@'host' for table 'sensitive_table'
Unzureichende Datenbankbenutzerberechtigungen <br> Die für die Verbindung verwendeten Benutzerkonto -Berechtigungen sind unvollständig. Es ist möglich, dass das Konto nur autorisiert ist, eine Verbindung zum Server herzustellen oder auf einige Datenbanken zuzugreifen, aber nicht autorisiert ist, auf bestimmte Tabellen zuzugreifen oder Abfragen auszuführen.
Die Einstellungen für Datenbankberechtigte sind eine hohe Granularität <br> Datenbankberechtigungen werden normalerweise Datenbanken, Tabellen, Spalten und sogar Betriebsstufen zugeordnet. Eine erfolgreiche Verbindung besteht nur darin, die Identität zu überprüfen. Der tatsächliche Vorgang hängt von den Berechtigungen des Benutzers für das spezifische Objekt ab.
Benutzerverbindung ist nicht mit den operativen Benutzern <br> unvereinbar . Manchmal ist die Verbindung zur Datenbank erfolgreich, aber die tatsächliche Identität der Abfrage ist nicht der aktuelle Benutzer, der aufgrund interner Anrufe wie gespeicherten Verfahren und Auslöser Berechtigungsprobleme verursachen kann.
Verwenden Sie das Datenbankverwaltungs -Tool oder die Befehlszeile, um die Berechtigungen des Benutzers anzuzeigen:
SHOW GRANTS FOR 'username'@'host';
Bestätigen Sie, dass der Benutzer die richtigen Berechtigungen für die Zieldatenbank und die Tabellen hat, z. B.:
GRANT SELECT, INSERT, UPDATE ON database.sensitive_table TO 'username'@'host';
FLUSH PRIVILEGES;
Überprüfen Sie, ob der für die Verbindung verwendete Benutzername, Kennwort und Host korrekt sind, um eine Verbindung zum falschen Konto oder zur Datenbank herzustellen.
Entsprechend den Anforderungen wird dem Benutzer entsprechende Berechtigungen zugewiesen, um eine übermäßige Genehmigung zu vermeiden, aber auch einen normalen Zugriff zu gewährleisten.
Verwenden Sie die gleichen Konto -Testberechtigungen im Datenbankverwaltungs -Tool, um zu bestätigen, ob auf die Tabelle zugegriffen werden kann.
Hier ist ein Beispiel für die Verwendung von MySQLI , um eine Verbindung zu einer Datenbank mit PHP herzustellen und mit Berechtigungsfehlern umzugehen: