Lors de la connexion à la base de données à l'aide de PHP, la fonction Connect () (telle que MySQLI_Connect () ou la connexion PDO ) renvoie avec succès, ce qui signifie que le serveur de base de données a accepté avec succès la demande de connexion. Cependant, même si la connexion est réussie, il est toujours possible qu'une table de base de données spécifique ne soit pas accessible en raison d'autorisations insuffisantes. Il s'agit d'une confusion courante pour de nombreux développeurs lors du débogage des problèmes d'autorisation de la base de données.
Cet article analysera en détail les causes de cette situation et fournira des idées sur la façon de dépanner et de résoudre le problème des autorisations insuffisantes.
La fonction connect () est uniquement responsable de l'établissement de la connexion au serveur de base de données. Il vérifie si le nom d'utilisateur et le mot de passe de l'utilisateur sont corrects et si le serveur est accessible.
Mais le contrôle de l'autorisation de l'accès à la base de données est plus fine, notamment:
Cet utilisateur a-t-il la permission d'accéder à une base de données
Y a-t-il une autorisation de lire, d'écrire ou de modifier un tableau
Y a-t-il une autorisation d'effectuer des opérations spécifiques (comme les procédures stockées)
Par conséquent, la connexion réussie n'est que la première étape, et les opérations ultérieures sur les tables de base de données nécessitent toujours une prise en charge d'autorisation correspondante.
<?php
$mysqli = new mysqli("m66.net", "username", "password", "database");
// Connexion avec succès
if ($mysqli->connect_errno) {
echo "Échec de la connexion: " . $mysqli->connect_error;
exit();
}
// Essayez d'accéder à la table
$result = $mysqli->query("SELECT * FROM sensitive_table");
if (!$result) {
echo "La requête a échoué,message d'erreur:" . $mysqli->error;
}
?>
Dans le code ci-dessus, Connect () ne rapporte pas d'erreur, mais peut apparaître lors de l'exécution de la requête:
La requête a échoué,message d'erreur:Access denied for user 'username'@'host' to database 'database'
ou:
La requête a échoué,message d'erreur:SELECT command denied to user 'username'@'host' for table 'sensitive_table'
Autorisations utilisateur de la base de données insuffisantes <br> Les autorisations de compte utilisateur utilisées pour la connexion sont incomplètes. Il est possible que le compte ne soit autorisé qu'à se connecter au serveur ou à accéder à certaines bases de données, mais n'est pas autorisé à accéder à certaines tables ou à effectuer des requêtes.
Les paramètres d'autorisation de la base de données sont une granularité élevée <br> Les autorisations de base de données sont généralement attribuées aux bases de données, aux tables, aux colonnes et même aux niveaux de fonctionnement. Une connexion réussie est simplement de vérifier l'identité. L'opération réelle dépend des autorisations de l'utilisateur sur l'objet spécifique.
La connexion des utilisateurs est incompatible avec les utilisateurs d'exploitation <br> Parfois, la connexion à la base de données est réussie, mais l'identité réelle de la requête n'est pas l'utilisateur actuel, ce qui peut entraîner des problèmes d'autorisation en raison d'appels internes tels que des procédures stockées et des déclencheurs.
Utilisez l'outil de gestion de la base de données ou la ligne de commande pour afficher les autorisations de l'utilisateur:
SHOW GRANTS FOR 'username'@'host';
Confirmez que l'utilisateur a les autorisations correctes à la base de données cible et aux tables, par exemple:
GRANT SELECT, INSERT, UPDATE ON database.sensitive_table TO 'username'@'host';
FLUSH PRIVILEGES;
Vérifiez si le nom d'utilisateur, le mot de passe et l'hôte utilisés pour la connexion sont corrects pour éviter de se connecter au mauvais compte ou à la base de données.
Selon les besoins, l'utilisateur se voit attribuer des autorisations correspondantes pour éviter une autorisation excessive mais également assurer un accès normal.
Utilisez les mêmes autorisations de test de compte dans l'outil de gestion de la base de données pour confirmer si le tableau est accessible.
Voici un exemple d'utilisation de MySQLI pour se connecter à une base de données avec PHP et gérer les erreurs d'autorisation: