Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

510
Vistas
Cómo desinfectar los parámetros de la API de Rails

Estoy creando mi propia API y me preguntaba: ¿Cómo proteger los parámetros recibidos?

Ejemplo:

  • Tengo un modelo de Auto con atributos de brand y color .

Mi punto final recibe esos parámetros en la carga útil. Con este payload recibido busco en mi base de datos:

 car = Car.where(color: params[:color]) # or car = Car.find_by(brand: params[:brand]) # or writing Car.first.update!(brand: params[:brand])

Pero estoy tan preocupado por lo que sucede si alguien intenta explotar con SQL o XSS. ¿Cómo trabajas con esto?

Muchas gracias :)

over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

Los ejemplos de su pregunta están todos protegidos contra la inyección de SQL automáticamente.

Citas relevantes de las guías oficiales de Rails :

7.2.1 Introducción

Los ataques de inyección SQL tienen como objetivo influir en las consultas de la base de datos mediante la manipulación de los parámetros de la aplicación web. Un objetivo popular de los ataques de inyección SQL es eludir la autorización. Otro objetivo es llevar a cabo la manipulación de datos o la lectura de datos arbitrarios. Aquí hay un ejemplo de cómo no usar los datos de entrada del usuario en una consulta:

 Project.where("name = '#{params[:name]}'")

Luego, más adelante en el mismo documento :

7.2.4 Contramedidas

Ruby on Rails tiene un filtro incorporado para caracteres SQL especiales, que escaparán ' , " , carácter NULL y saltos de línea. El uso Model.find(id) o Model.find_by_some thing(something) aplica automáticamente esta contramedida. Pero en Los fragmentos de SQL, especialmente en los fragmentos de condiciones ( where("...") ), los métodos connection.execute() o Model.find_by_sql() , deben aplicarse manualmente.

En lugar de pasar una cadena, puede usar controladores posicionales para desinfectar cadenas contaminadas como esta:

 Model.where("zip_code = ? AND quantity >= ?", entered_zip_code, entered_quantity).first

El primer parámetro es un fragmento de SQL con signos de interrogación. El segundo y tercer parámetro reemplazarán los signos de interrogación con el valor de las variables.

También puede usar controladores con nombre, los valores se tomarán del hash utilizado:

 values = { zip: entered_zip_code, qty: entered_quantity } Model.where("zip_code = :zip AND quantity >= :qty", values).first

Además, puede dividir y encadenar condicionales válidos para su caso de uso:

 Model.where(zip_code: entered_zip_code).where("quantity >= ?", entered_quantity).first
over 4 years ago · Santiago Trujillo Denunciar

0

En la mayoría de los casos, Rails se encarga de la inyección de SQL. Pero debe evitar pasar cadenas como parámetros a los métodos de Active Records. Evita esto:

Car.where(“color = '#{params[:color]'”)

No es agradable de ver ;)

Y use matrices o hashes en su lugar:

car = Car.where(color: params[:color])

car = Car.where(["color = ?", params[:color])

Al hacerlo, Active Records escapará automáticamente los caracteres no deseados, protegiendo contra la inyección de SQL.


Para obtener más información, consulte el documento de Rails: https://guides.rubyonrails.org/security.html#sql-injection-countermeasures


Actualicé esta respuesta después de que @spickermann informara un error significativo.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda