sql >> Base de Datos >  >> RDS >> PostgreSQL

Rails 5 Inyección SQL

Usando quote es seguro. Leí las respuestas en la página a la que se vinculó , y no veo a nadie diciendo eso quote es inseguro Veo su pregunta sobre el uso de "comillas". Sí, si solo pone comillas alrededor de una cadena, eso es inseguro, por ejemplo:

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

Pero usando quote (el método) está bien:

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

Podrías jugar en la consola y hacer todo lo posible para romperla, pero no creo que puedas:

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

Si tiene éxito, estoy seguro de que al equipo de Rails le gustaría saberlo (en privado). Pero como puede ver, el quote El método hace más que poner una cita al principio y al final.

Además, dado que dice que está buscando una cita autorizada, los comentarios en el código fuente en sí sugieren que citar las entradas de los usuarios es el propósito previsto de estas funciones:

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:

(Tenga en cuenta que estoy mostrando quote_string para el comentario, pero probablemente deberías usar quote , que intenta averiguar el tipo de datos y hacer algo apropiado).

Por cierto, aquí hay una pregunta similar a la tuya, con una respuesta mía en 2014 y algunas alternativas también:Cómo ejecutar una actualización sql sin procesar con enlace dinámico en rieles