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 BrowserDie 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.
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.
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.
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.