PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Injeção de SQL do Rails 5


Usando quote é seguro. Eu li as respostas em a página à qual você vinculou , e não vejo ninguém dizendo que quote é inseguro. Eu vejo sua pergunta sobre o uso de "aspas". Sim, se você apenas colocar aspas em torno de uma string, isso é inseguro, por exemplo:
q = "SELECT * FROM users where email = '#{params[:email]}'"

Mas usando quote (o método) está bem:
q = "SELECT * FROM users where email = #{connection.quote(params[:email])}"

Você pode brincar no console e tentar o seu melhor para quebrá-lo, mas não acho que você seja capaz de:
2.3.3 :003 > ActiveRecord::Base.connection.quote("f''oo")                                                                              
 => "'f''''oo'"

Se você conseguir, tenho certeza que a equipe Rails gostaria de saber (em particular)! Mas como você pode ver, a quote método faz mais do que colocar uma citação no início e no fim.

Além disso, como você diz que está procurando uma citação oficial, os comentários no próprio código-fonte sugerem que citar entradas do usuário é o objetivo pretendido dessas funções:

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:

(Observe que estou mostrando quote_string para o comentário, mas você provavelmente deve usar quote , que tenta descobrir o tipo de dados e fazer algo apropriado.)

A propósito, aqui está uma pergunta semelhante à sua, com uma resposta minha em 2014 e algumas alternativas também:Como executar um sql de atualização bruto com vinculação dinâmica em trilhos