PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Rails 5 SQL-Injection

Verwenden von quote ist sicher. Ich habe die Antworten auf gelesen die Seite, auf die Sie verlinkt haben , und ich sehe niemanden, der dieses quote sagt ist unsicher. Ich sehe Ihre Frage zur Verwendung von "Anführungszeichen". Ja, wenn Sie einen String einfach in Anführungszeichen setzen, ist das unsicher, z. B.:

q = "SELECT * FROM users where email = '#{params[:email]}'"

Aber mit quote (die Methode) ist in Ordnung:

q = "SELECT * FROM users where email = #{connection.quote(params[:email])}"

Sie könnten in der Konsole herumspielen und Ihr Bestes geben, um sie zu knacken, aber ich glaube nicht, dass Sie dazu in der Lage sein werden:

2.3.3 :003 > ActiveRecord::Base.connection.quote("f''oo")                                                                              
 => "'f''''oo'"

Wenn Sie Erfolg haben, würde das Rails-Team sicher gerne (privat) davon erfahren! Aber wie Sie sehen können, das quote Methode macht mehr als ein Zitat am Anfang und am Ende.

Da Sie sagen, dass Sie nach einem maßgeblichen Zitat suchen, deuten die Kommentare im Quellcode selbst darauf hin, dass das Zitieren von Benutzereingaben der beabsichtigte Zweck dieser Funktionen ist:

https:/ /github.com/rails/rails/blob/2471e6391dfe71cfbb8621bdf573729d961d3209/activerecord/lib/active_record/connection_adapters/abstract/quoting.rb#L6-L13

# Quotes the column value to help prevent
# {SQL injection attacks}[http://en.wikipedia.org/wiki/SQL_injection].
def quote(value)

https:/ /github.com/rails/rails/blob/0f1d0b1b5254e3678abaabbebb3362a100c10262/activerecord/lib/active_record/connection_adapters/postgresql/quoting.rb#L17-L20

# Quotes strings for use in SQL input.
def quote_string(s) #:nodoc:

(Beachten Sie, dass ich quote_string zeige für den Kommentar, aber Sie sollten wahrscheinlich quote verwenden , der versucht, den Datentyp herauszufinden und etwas Passendes zu tun.)

Übrigens, hier ist eine ähnliche Frage wie Ihre, mit einer Antwort von mir im Jahr 2014 und auch einigen Alternativen:Wie man ein rohes SQL-Update mit dynamischer Bindung in Rails ausführt