Yo sólo quería saber cómo podemos escapar de una consulta SQL (string) en Ruby para evitar la Inyección de código SQL. tenga en cuenta que yo no estoy usando Rails framework.

Gracias.

OriginalEl autor | 2009-02-08

4 Comentarios

  1. 17

    Si es posible, utilice el Rubí módulo DBI, y en lugar de tratar de cotización de sus cadenas, el uso de parametrizadas consultas preparadas, como este:

    dbh = DBI.connect("DBI:Mysql:test:localhost", "testuser", "testpass")
    sth = dbh.prepare("INSERT INTO people (id, name, height) VALUES(?, ?, ?)")
    File.open("people.txt", "r") do |f|
      f.each_line do |line|
        name, height = line.chomp.split("\t")
        sth.execute(nil, name, height)
      end
    end

    Citando serán manejados correctamente para usted, y las inyecciones serán una cosa del pasado.

    Edición: Observe que en este ejemplo se muestra nil que se pasa como primer parámetro para ejecutar(). Corresponde a la primera ? en la consulta, y que se traduce a «NULL» por el módulo DBI. Los otros parámetros son igualmente debidamente citado y se inserta en la consulta.

    Por qué incluso insertar un campo de id? Con normal de diseño este sería incrementa automáticamente.
    Es sólo un ejemplo. Pero tenga en cuenta que el primer parámetro para ejecutar() es simplemente nulo, y el parámetro correspondiente en la consulta (el primer signo de interrogación) es para id., «id» se inserta como NULL en este ejemplo.
    Yo quería saber la misma cosa como el OP, pero yo quería escribir sentencias SQL en un archivo, así que supongo preparado declaraciones están fuera de la mesa? Podría yo (ab)uso .inspeccionar para escapar de las cadenas?

    OriginalEl autor greyfade

  2. 3

    Usted no tiene que usar rails, sólo podía require 'activerecord' y usarlo como si fuera en rails (definir los modelos y el uso de esos). Lo que estás haciendo no es sólo de re-inventar la rueda.

    OriginalEl autor Ryan Bigg

  3. 3

    Escribir una wee función a la cotización de las cadenas. Creo que Rails utiliza algo como esto:

    def quote_string(v)
      v.to_s.gsub(/\/, '\&\&').gsub(/'/, "''")
    end
    Ver greyfade la respuesta. O Andy Lester. Esto es sólo una mala idea.
    A veces estás trabajando en una secuencia de comandos de migración y no tienen piedras preciosas instalado (sin rieles o dbi) y cuando eso pasa es una solución eficaz. En casi cualquier otra situación debe utilizar sentencias preparadas de curso.

    OriginalEl autor ice cream

Dejar respuesta

Please enter your comment!
Please enter your name here