flawopen.com/SQL Injection in Ruby/ActiveRecord where()
Ist String-Interpolation in Rails where() sicher?
Stell dir SQL als Formular mit festen Anweisungen und leeren Wertefeldern vor. Ein gebundener Parameter füllt ein Feld; Ruby-Interpolation schreibt Request-Text in die Anweisungen, bevor Rails beides trennen kann. Halte die SQL-Struktur fest und übergib nicht vertrauenswürdige Werte als Parameter.
User.where(
"id = #{params[:id]}"
)
User.where(id: params[:id])
# or, for more complex conditions:
User.where("id = ?", params[:id])
Warum Interpolation die Abfrage verändert
Ruby wertet #{...} aus, bevor Active Record die Bedingung erhält. Zum Beispiel übergibt where("id = #{params[:id]}") Rails einen bereits zusammengesetzten SQL-String; Request-Eingaben können dadurch das Prädikat verändern. Active Record dokumentiert dieses Zusammenbauen von Strings als unsicher. Nutze Hashes für unterstützte Gleichheits-, Bereichs- oder Teilmengenbedingungen oder ?-Platzhalter für andere Prädikate. Platzhalter binden Werte, keine Bezeichner oder SQL-Schlüsselwörter. Halte die Abfragestruktur fest oder wähle Bezeichner aus einer strikten Allowlist.
Codebasis prüfen
rg -n 'where\s*\(' app/Häufige Fragen
Nein. Rails-Hash-Bedingungen unterstützen Gleichheit, Bereiche und Teilmengen (IN). Für andere Prädikate verwende eine feste SQL-Bedingung mit gebundenen Werten, etwa where("price > ?", amount). Das Binding schützt Werte, aber keine dynamischen Tabellen- oder Spaltennamen und keine SQL-Fragmente.