FlawOpen

flawopen.com/SQL Injection in Ruby/ActiveRecord where()

Ist String-Interpolation in Rails where() sicher?

Referenzseite
Kurzantwort

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.

UNSAFE
User.where(
  "id = #{params[:id]}"
)
SAFE
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/
Prüfe Treffer auf interpolierte oder verkettete Request-Daten in Bedingungsstrings. Brakeman meldet SQL-Injection-Risiken, wenn die Analyse einen unsicheren Datenfluss erkennt; ein Scan ohne Treffer beweist nicht, dass jede Abfrage sicher ist.

Häufige Fragen

Kann ich Hash-Bedingungen für jede Abfrage verwenden?

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.

Quellen

Siehe auch SQL-Injection (CWE-89): Funktionsweise und Schutz in jeder Sprache — flawopen.com Ist Sequelize query() vor SQL-Injection sicher? Ist SQLAlchemy text() vor SQL-Injection sicher? Verhindert sqlx-Abfrageprüfung zur Kompilierzeit SQL-Injection? Schützen gespeicherte Prozeduren vor SQL-Injection? Ist TypeORM QueryBuilder vor SQL-Injection sicher? Django ORM und SQL Injection: sichere Muster