2010-03-23 16 views
10

Ich versuche, eine Zeichenfolge zu sanieren, die Benutzereingaben beinhaltet, ohne manuell auf meinen eigenen möglicherweise fehlerhaften Regex zurückgreifen zu müssen, wenn dies jedoch der einzige Weg wäre, den ich auch schätzen würde, wenn mir jemand in die richtige Richtung zeigen könnte zu einer Regex, die wahrscheinlich nichts verpassen wird. Es gibt eine Reihe von Methoden in Rails, mit denen Sie in native SQL-Befehle eingeben können. Wie entgehen Benutzer den Benutzereingaben?Ruby on Rails: Wie man eine Zeichenkette für SQL saniert, wenn man nicht findet?

Die Frage, die ich stelle, ist eine breite, aber in meinem speziellen Fall arbeite ich mit einer Spalte in meiner Postgres-Datenbank, die Rails nicht nativ versteht, soweit ich weiß, der tsvector, der klar ist Textsuchinformation. Rails ist in der Lage zu schreiben und zu lesen, als wäre es ein String, aber im Gegensatz zu einem String scheint es nicht automatisch zu entkommen, wenn ich Dinge wie Vektor = innerhalb des Modells mache.

Zum Beispiel, wenn ich model.name = '::', wo Name ist eine Zeichenfolge, es funktioniert gut. Wenn ich model.vector = ‚::‘ es Fehler macht 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 = ‚::‘ fein manuell eingestellt .

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

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

jedoch diese Syntax funktioniert nicht, weil die rohen SQL-Befehle Methode keinen Zugang zu finden ist entkommen und Eingeben von Zeichenfolgen unter Verwendung des? Kennzeichen.

Dies scheint mir das gleiche Problem wie Aufruf von connection.execute mit jeder Art von Benutzereingaben, da es alles auf die Bereinigung der Zeichenfolgen läuft, aber ich kann keine Möglichkeit finden, manuell Rails SQL-Zeichenfolge aufrufen Hygienemethoden. Kann mir jemand einen Rat geben?

Antwort

14

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

+1

Danke für den Tipp, hat genau so funktioniert, wie du gesagt hast. Unglücklicherweise scheint es, dass Rails Colons (:) für SQL eigentlich nicht bereinigt, und ich bekomme immer noch Fehler in dieser Zeile. Vielleicht ist es für Tsvectors einzigartig, wenn Colons gereinigt werden müssen. Sieht so aus, als müsste ich auf die quietschende Regex-Route gehen. –