SQL auf gefährliche Schreibzugriffe und unparametrisierte Werte prüfen

Fügen Sie eine Abfrage oder ein Skript ein: Jede Anweisung wird in diesem Browser als Text geprüft, wobei Kommentare und String-Literale maskiert werden, damit kein Schlüsselwort darin als SQL gilt. Die Befunde behalten den echten Anweisungstyp hinter einem WITH, verlangen ein WHERE auf oberster Ebene für DELETE und UPDATE und zählen Parameterplatzhalter außerhalb von Literalen und Casts.

Läuft lokal in deinem Browser
Dieses Werkzeug verarbeitet alle Daten lokal in deinem Browser.
SQL-Abfrage oder -SkriptDies ist nur eine statische Prüfung. VoriTools verbindet sich nicht mit der Datenbank, führt die Abfrage nicht aus und speichert sie nicht.

Ein SQL-Skript auf unsichere Schreibzugriffe und ungebundene Werte prüfen

Die Seite zerlegt das eingefügte Skript in Anweisungen und prüft jede als Text: Das führende Schlüsselwort wird auf oberster Ebene gelesen, daher wird WITH old AS (...) DELETE FROM users als DELETE gemeldet, nicht als SELECT. Nichts wird zu einem Ausführungsplan und nichts an eine Datenbank gesendet.

Die Prüfungen decken ab, was ein Code-Review zuerst ansieht: DELETE und UPDATE ohne WHERE in der Anweisung selbst, DROP und TRUNCATE, SELECT * und SELECTs ohne Zeilenbegrenzung, ein Literal im Filter, ein 1=1 oder OR TRUE auf oberster Ebene, ein ${...}-Platzhalter und ein per Stringverkettung gebauter Wert.

  1. Fügen Sie eine Abfrage oder ein ganzes Skript in das linke Feld ein, oder klicken Sie auf Beispiel laden für ein UPDATE und ein SELECT.
  2. Klicken Sie auf SQL-Sicherheit prüfen. Kommentare, String-Literale und $$-Körper werden vor dem Schlüsselwortabgleich maskiert, damit ihr Inhalt keine Regel auslöst.
  3. Lesen Sie die Anweisungsübersicht: Jede Anweisung steht mit dem erkannten Typ da, und eine Anweisung ohne Befund sagt das unter ihrem Text.
  4. Lesen Sie die Kennzahlen — Statements, Schreiben / DDL, Parameterplatzhalter, Prüfpunkte — und die Befundliste. Bei mehreren Statements nennt jeder Befund seine Anweisung.
  5. Kopieren oder laden Sie die Übersicht und klicken Sie dann auf Leeren. Ein neuer Lauf ersetzt die vorige Ausgabe; eine leere oder nicht prüfbare Eingabe leert die Felder und erklärt warum.

Was diese Seite prüft und was sie nicht sehen kann

Was pro Anweisung gemeldet wird

Als Schreibzugriffe zählen INSERT, UPDATE, DELETE, MERGE, REPLACE, CREATE, ALTER, DROP und TRUNCATE. Ein DELETE oder UPDATE ohne WHERE in der Anweisung selbst ist ein Gefahr-Befund — ein WHERE in einer Unterabfrage schützt den äußeren Schreibzugriff nicht. DROP und TRUNCATE sind eigene Gefahr-Befunde; die übrigen Schreibzugriffe sind Warnungen.

Bei einem SELECT werden ein Stern in der Spaltenliste (auch t.*) und eine Zeilenbegrenzung geprüft: LIMIT, FETCH FIRST oder NEXT ... ROWS ONLY, TOP n und ROWNUM <= n zählen, sodass der informative Hinweis auf eine fehlende Begrenzung nur erscheint, wenn ein SELECT unbegrenzt viele Zeilen liefern könnte.

Literale, Platzhalter und Stringaufbau

Die Platzhalterzählung umfasst ?, $1, :name und @name außerhalb von Kommentaren und String-Literalen; ein Cast wie created_at::text und ein Bezeichner wie @@ROWCOUNT zählen nicht. Ein Literal in einem WHERE-, AND- oder OR-Filter ist eine Warnung, die auf die Parametersyntax Ihres Treibers verweist.

Zwei Muster des Stringaufbaus werden getrennt gemeldet: Ein ${...}-Platzhalter bedeutet, dass ein Wert in die Anweisung interpoliert wird, und eine Verkettung aus Literal und Bezeichner bedeutet, dass der Anweisungstext außerhalb des Treibers zusammengesetzt wird. Beides ist kein gebundener Parameter — genau das ist der Unterschied für den Text, der den Server erreicht.

Skripte, Dialekte und Grenzen

Der Zerleger kennt verdoppelte Anführungszeichen und MySQL-Backslash-Escapes, doppelte und Backtick-Bezeichner, -- und /* */-Kommentare, #-Kommentare, PostgreSQL-$$-Körper und DELIMITER-Direktiven, sodass ein escaptes Apostroph oder ein Funktionskörper keine falsche Anzahl erzeugt. Ein Skript mit mehr als einer Anweisung erzeugt eine Warnung, und jeder Befund trägt seine Anweisungsnummer.

Die Seite verbindet sich mit keiner Datenbank, führt nichts aus und sieht Ihr Schema, Berechtigungen, Row-Level-Security oder Transaktionen nicht: Eine Anweisung, die hier besteht, kann in Ihrer Umgebung trotzdem zerstörend sein. Nutzen Sie das Ergebnis als Text-Vorprüfung vor einem Review, zusammen mit EXPLAIN und einem Blick in den umgebenden Code.

Zuletzt verwendet: