2016-10-27 1 views
0

Ich erlaube meinem Benutzer, eine benutzerdefinierte SQL-Abfrage in einer erweiterten Form einzugeben, wenn er möchte, und ich fütterte seine Eingabe direkt in die "Where" -Klausel in meiner Suchmethode.Rails: Catch-Ausnahme für ungültige SQL-Abfrage

Allerdings wird der Benutzer manchmal eine ungültige SQL-Abfrage eingeben. Jetzt wird eine Fehlerseite angezeigt. Ich möchte stattdessen eine "ungültige Syntax" -Anweisung anzeigen.

def self.search(search) 
    if search 
     begin 
      includes(:hobbies, :games).where(search) 
     rescue SQL_syntax_error_exception # ? 
      #display error message 
     end 

Ich bin durch diese verwirrt, denn selbst wenn ich versuchte, die (angeblich) All-inclusive-

rescue => e 

es noch nicht mitbekommen haben ...

+0

Oh yeah Ich werde es auch irgendwie sanieren müssen, aber ich bin noch nicht zu diesem Teil gekommen. Ich versuche nur, die nackte Funktionalität zuerst zu bekommen. – ineedahero

+1

Es gibt viele Plugins für Rails, die die Suche flexibler machen und das Überfüllen beliebiger Benutzerdaten in Ihre Abfrage überflüssig machen. Welche Ausnahme wird ausgelöst? Versuchen Sie 'rette Object => e ', um alles zu bekommen, aber sobald Sie den richtigen Typ identifiziert haben, retten Sie * nur * das. – tadman

+0

Ok ich versuche es mit einem Edelstein lol – ineedahero

Antwort

1

Ich würde auf jeden Fall nicht empfehlen, dies zu tun - Sie werden es schwer haben, die gesamte Where-Klausel mit intakten Anführungszeichen zu bereinigen.

Wie für den Fehler zu kontrollieren,

begin 
    includes(:hobbies, :games).where(search) 
rescue ActiveRecord::StatementInvalid => e 
    # do whatever 
end 

Hinweis, dass es Bündel von Ausnahmen, die hier auftreten können (nicht nur Active :: StatementInvalid), so dass Sie könnte so etwas tun wollen:

... 
rescue Exception => e 
    if e.class.ancestors.include? ActiveRecord::ActiveRecordError 
    # rescue stuff 
    else 
    # re-throw the exception 
    end 
end 
+0

Danke für die Antwort! Nur aus Neugier, wenn meine Datenbank keine sensiblen Informationen (wie Passwörter oder Benutzerkonten) enthält - das heißt, alle Informationen in der Datenbank können legitim durch das Suchfeld abgefragt werden - muss die Eingabe bereinigt werden ? – ineedahero

+0

@ineedahero, IMHO, mit Nachdruck ja. Durch einen rohen Zugriff auf die Datenbank (keine Bereinigung der Eingabe) kann der Zugriff auf das Dateisystem über "SELECT INTO OUTFILE" oder ähnlich je nach Datenbank und Konfiguration oder über DROP DATABASE FOO erfolgen. Es kann Benutzern auch erlauben, Javascript in beliebige Felder zu injizieren, die ausgeführt werden, wenn sie auf einer Webseite angezeigt werden. Solches Javascript kann Ihre Sitzungscookies senden, die einem Angreifer erlauben, die Sitzung zu entführen, oder Code von einer anderen (üblen) Quelle usw. laden. Vermutlich viele andere Angriffsvektoren, aber genügt es zu sagen, sanieren Sie immer Eingang. – jpgeek