wie eine Zeichenfolge vor dem Einsetzen oder Update in Ruby zu entkommen
-
13-10-2019 - |
Frage
In ruby ??Active nicht dynamisch für Update-Bindung zur Verfügung stellt und Einsatz sqls, natürlich i raw SQL verwenden kann, aber das braucht Verbindung aufrechterhalten, so dass ich wissen wollen, ob es einfacher Weg ist, aktualisieren oder SQL einfügen zu entkommen, bevor die Ausführung wie Code unten:
ActiveRecord::Base.connection.insert(sql)
ich glaube, ich Code von gsub schreiben kann, aber ich weiß, wenn es eine bereit Methode, es zu tun ist.
Lösung
Sie können dies tun:
ActiveRecord::Base.send(:sanitize_sql,["select * from my_table where description='%s' and id='%s'","mal'formed", 55], "my_table")
Natürlich bedeutet dies, dass Sie die separat params. Nicht sicher, ob es anders funktionieren wird, aber probieren Sie es aus.
Andere Tipps
In Rails> = 3.2.5 folgende Arbeiten für mich:
evil_input = '"\';%#{}\"foo'
ActiveRecord::Base.connection.quote(evil_input)
=> "'\"'';%\#{}\\\"foo'"
Es ist wirklich nicht klar, was Sie fordern, weil Ihr Titel spricht über eine Zeichenfolge vor Einfügung oder Aktualisierung zu entkommen, dann in den Tags, die Sie über SQL-Injection zu sprechen.
Wenn Sie Active müssen kodieren automatisch haben / ändern Inhalt vor dem Einsetzen oder Aktualisierung, haben Sie überprüft, Active der Rückrufe ? Der before_save
Rückruf wird ausgelöst, wenn Sie ein Update tun oder erstellen. Wenn Sie den Inhalt ändern möchten, bevor es gespeichert werden soll, dass ein guter Ort ist, es zu tun.
Wenn Sie auf SQL-Parameter verwenden wollen, anstatt die Variablen in den „update“ Einfügen oder „Insert“ -Aussagen zu vermeiden SQL-Injection, verwenden Sie dann ARs Variablenbindungen . Scrollen Sie zum Abschnitt über die „Bedingungen“.