Repérer les écritures dangereuses et les valeurs non paramétrées dans du SQL

Collez une requête ou un script : chaque instruction est analysée comme du texte dans ce navigateur, commentaires et chaînes littérales masqués pour qu’un mot-clé qu’ils contiennent ne soit pas pris pour du SQL. Les constats conservent le type réel de l’instruction derrière un WITH, exigent un WHERE de premier niveau pour DELETE et UPDATE et comptent les paramètres hors littéraux et conversions.

Fonctionne localement dans votre navigateur
Tout dans cet outil est traité dans ce navigateur. KivTools ne télécharge pas, ne stocke pas et n’appelle aucune API tierce avec votre entrée.
Requête ou script SQLAnalyse statique de texte dans ce navigateur : les commentaires et les chaînes littérales sont ignorés lors de la recherche de mots-clés ; la requête n’est jamais envoyée, exécutée ni stockée.

Comment analyser un script SQL pour repérer les écritures dangereuses et les valeurs non liées

La page découpe le script collé en instructions et analyse chacune comme du texte : le mot-clé de tête est lu au premier niveau, donc WITH old AS (...) DELETE FROM users est signalé comme DELETE, pas comme SELECT. Rien ne devient un plan d’exécution et rien n’est envoyé à une base de données.

Les contrôles couvrent ce qu’une revue de code regarde en premier : DELETE et UPDATE sans WHERE dans l’instruction elle-même, DROP et TRUNCATE, SELECT * et SELECT sans limite de lignes, un littéral comparé dans un filtre, un 1=1 ou OR TRUE de premier niveau, un gabarit ${...} et une valeur assemblée par concaténation.

  1. Collez une requête ou un script complet dans le panneau de gauche, ou cliquez sur Charger un exemple pour voir un UPDATE et un SELECT.
  2. Cliquez sur Analyser la sécurité SQL. Les commentaires, les chaînes littérales et les corps entre $$ sont masqués avant la recherche de mots-clés, donc leur contenu ne déclenche aucune règle.
  3. Lisez le résumé par instruction : chaque instruction apparaît avec le type résolu par l’analyseur, et celle qui ne déclenche rien l’indique sous son texte.
  4. Lisez les métriques — instructions, écriture / DDL, paramètres liés, points à vérifier — puis la liste des constats. Avec plusieurs instructions, chaque constat nomme la sienne.
  5. Copiez ou téléchargez le résumé, puis cliquez sur Effacer. Une nouvelle analyse remplace la sortie précédente ; une entrée vide ou non analysable vide les panneaux et explique pourquoi.

Ce que cette page vérifie et ce qu’elle ne peut pas voir

Ce qui est signalé pour chaque instruction

Les écritures comptées sont INSERT, UPDATE, DELETE, MERGE, REPLACE, CREATE, ALTER, DROP et TRUNCATE. Un DELETE ou UPDATE sans WHERE dans l’instruction elle-même est un constat de danger — un WHERE dans une sous-requête ne protège pas l’écriture externe. DROP et TRUNCATE sont des constats de danger à eux seuls ; les autres écritures sont des avertissements.

Pour un SELECT, l’analyse cherche un astérisque dans la liste des colonnes (y compris t.*) et une limite de lignes : LIMIT, FETCH FIRST ou NEXT ... ROWS ONLY, TOP n et ROWNUM <= n comptent, donc la note informative d’absence de limite n’apparaît que si le SELECT peut renvoyer un nombre illimité de lignes.

Littéraux, paramètres et construction de chaînes

Le comptage des paramètres couvre ?, $1, :name et @name hors commentaires et chaînes littérales ; une conversion comme created_at::text et un identifiant comme @@ROWCOUNT ne sont pas comptés. Un littéral comparé dans un filtre WHERE, AND ou OR est un avertissement qui renvoie à la syntaxe de paramètres de votre pilote.

Deux schémas de construction sont signalés séparément : un gabarit ${...} signifie qu’une valeur est interpolée dans l’instruction, et une concaténation entre un littéral et un identifiant signifie que le texte est assemblé hors du pilote. Ni l’un ni l’autre n’est un paramètre lié — c’est la distinction qui compte pour le texte qui atteint le serveur.

Scripts, dialectes et limites

Le découpage comprend les guillemets doublés et les échappements par barre oblique de MySQL, les identifiants entre guillemets doubles et accents graves, les commentaires -- et /* */, les commentaires #, les corps entre $$ de PostgreSQL et les directives DELIMITER : une apostrophe échappée ou un corps de fonction ne fausse donc pas le nombre d’instructions. Un script de plusieurs instructions produit un avertissement, et chaque constat porte son numéro.

La page ne se connecte à aucune base, n’exécute rien et ne voit ni votre schéma, ni vos droits, ni la sécurité au niveau des lignes, ni vos transactions : une instruction validée ici peut rester destructrice dans votre environnement. Utilisez-la comme pré-contrôle textuel avant une revue, à côté d’EXPLAIN et de la lecture du code qui produit la requête.

Outils récents :