Frage

Ich versuche, eine Zeichenfolge zu sanieren, ohne dass manuell zu müssen Benutzereingabe beinhaltet meinen eigener möglicherweise Buggy regex, wenn möglich, aber Crafting, wenn das der einzige Weg ist, würde ich auch zu schätzen, wenn jemand mich in den richtigen verweisen kann Richtung zu einem regulären Ausdruck, dass es unwahrscheinlich ist, irgendetwas zu fehlen. Es gibt eine Reihe von Methoden in Rails, die Sie in nativen SQL-Befehle eingeben können können, wie entkommen Menschen Benutzereingabe für die?

Die Frage, die ich gefragt habe, ist weit gefasst, aber in meinem Fall, ich arbeite mit einer Spalte in meiner Postgres-Datenbank, dass Rails nicht nativ nicht so weit verstehen, wie ich weiß, der tsvector, die hält Klartext Suchinformation. Rails ist in der Lage zu schreiben und daraus zu lesen, als ob es ein String ist, aber im Gegensatz zu einem String, es scheint nicht automatisch zu entkommen, wenn ich Dinge wie Vektor tue = innerhalb des Modells.

Zum Beispiel, wenn ich model.name = '::', wobei name ein String ist, es funktioniert gut. Wenn ich model.vector = '::' es Fehler aus:

ActiveRecord::StatementInvalid: PGError: ERROR:  syntax error in tsvector: "::"
"vectors" = E'::' WHERE "id" = 1

Dies scheint ein Problem durch einen Mangel verursacht wird von den Semikolons zu entkommen, und ich kann den Vektor manuell eingestellt = ‚::‘ in Ordnung.

Ich hatte auch auf die Idee, vielleicht kann ich rufe Sie einfach so etwas wie:

ActiveRecord::Base.connection.execute "UPDATE medias SET vectors = ? WHERE id = 1", "::"

Allerdings ist diese Syntax nicht funktioniert, weil die rohen SQL-Befehle haben keinen Zugang zu finden Methode der Flucht und Streicher Eingabe durch die Verwendung? Marke.

Das erscheint mir als das gleiche Problem wie der Aufruf von Connection.Execute mit jeder Art von Benutzereingaben, wie es alle Fäden zu desinfizierende nach unten kocht, aber ich kann nicht jede mögliche Weise zu finden scheinen manuell Rails rufen SQL-Zeichenfolge sanitization Methoden. Kann jemand einen Rat zur Verfügung stellen?

War es hilfreich?

Lösung

Fügen Sie diese Methode, um Ihr Modell:

class Media < ActiveRecord::Base
  def self.execute_sql(*sql_array)     
    connection.execute(send(:sanitize_sql_array, sql_array))
  end
end

Jetzt können Sie einen beliebigen SQL ausführen wie:

Media.execute_sql('UPDATE medias SET vectors = ? WHERE id = 1', '::')

Referenz

1) sanitize_sql_array

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top