7 votes

Déterminer si une requête sql modifie la base de données

J'ai une liste de chaînes de caractères qui contiennent des données valides. SQL expressions.
J'ai besoin de n'exécuter que celles qui ne modifient pas la base de données.
Quelle serait la meilleure façon de procéder ? Faire quelque chose comme :

if(sqlQuery.contains("DELETE")){  
  //don't execute this
}

semble être un mauvais hack

Mise à jour :
Je vais être plus précis.
J'ai déjà une liste de SQL les requêtes qui sont autorisées. Je veux m'assurer que seules celles-ci sont exécutées.
Quelle serait la meilleure façon de les faire correspondre ?

5voto

Matt Brock Points 2160

La façon la plus simple et la meilleure (la plus complète) de le faire est de créer un utilisateur en lecture seule et de ne se connecter à la base de données qu'avec cet utilisateur. Dans SQLServer, la façon la plus simple de procéder est de créer l'utilisateur et de l'ajouter à la liste intégrée des utilisateurs. "db_datareader" rôle. Cela n'autorisera que les SELECT.

Et vous devez vous préoccuper de plus que des simples DELETE, INSERT ou UPDATE. Vous devez également faire attention à l'appel de toute procédure stockée, donc pour être sûr, vous devez également supprimer les droits d'exécution, les droits ALTER, les droits GRANT, etc...

EDIT : Je viens d'exécuter ceci...

CREATE LOGIN [user] WITH PASSWORD='password', DEFAULT_DATABASE=[your_db], CHECK_POLICY=OFF
GO
CREATE USER [user] FOR LOGIN [user]
EXEC sp_addrolemember N'db_datareader', N'your_db'
GO

2voto

mthmulders Points 4590

DELETE n'est pas la seule instruction SQL susceptible de modifier votre base de données ; INSERT le fera certainement, et UPDATE pourrait (en fonction de votre requête exacte). L'analyse des chaînes de caractères est donc un moyen difficile d'y parvenir.

Tant que les performances ne sont pas vraiment un problème, vous pouvez démarrer une transaction, exécuter vos instructions une par une, vérifier le nombre de lignes affectées pour chacune d'entre elles, et enfin annuler votre transaction. Ensuite, vous n'exécutez que les instructions qui ont affecté 0 ligne.

En outre, vérifiez la documentation de votre base de données : certains SGBDR (comme Oracle) ne prennent pas en charge le retour en arrière des instructions DDL telles que ALTER TABLE , DROP TABLE et autres...

2voto

lukuluku Points 1884

Je ne pense pas qu'il y ait un moyen infaillible d'empêcher l'altération des enregistrements en vérifiant simplement le contenu du SQL donné. Par exemple, vous pouvez avoir un champ qui a la valeur "update" et un utilisateur essaie d'interroger toutes les lignes qui contiennent cette valeur, mais le SQL ne sera pas exécuté, car il contient une chaîne "blacklistée". Je suppose que le seul moyen sûr serait d'exécuter les SQL avec un utilisateur qui n'a pas le droit de modifier les enregistrements.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X