PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Rails 5 SQL injection

Usando quote è salvo. Ho letto le risposte su la pagina a cui ti sei collegato , e non vedo nessuno dire quella quote è insicuro. Vedo la tua domanda sull'uso di "virgolette". Sì, se metti le virgolette attorno a una stringa, non è sicuro, ad esempio:

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

Ma usando quote (il metodo) va bene:

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

Potresti giocare con la console e fare del tuo meglio per romperlo, ma non credo che sarai in grado di:

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

Se ci riesci, sono sicuro che il team di Rails vorrebbe saperlo (in privato)! Ma come puoi vedere, la quote il metodo fa molto di più che attaccare una citazione all'inizio e alla fine.

Inoltre, poiché dici che stai cercando una citazione autorevole, i commenti nel codice sorgente stesso suggeriscono che citare gli input dell'utente è lo scopo previsto di queste funzioni:

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:

(Nota sto mostrando quote_string per il commento, ma probabilmente dovresti usare quote , che cerca di capire il tipo di dati e fare qualcosa di appropriato.)

A proposito, ecco una domanda simile alla tua, con una mia risposta nel 2014, e anche alcune alternative:Come eseguire un raw update sql con binding dinamico nei rail