Foros del Web » Programando para Internet » Python »

como evitar SQLinjection(novato)

Estas en el tema de como evitar SQLinjection(novato) en el foro de Python en Foros del Web. Hola, como están. Miren resulta que estoy aprendiendo python, y resulta que no estoy seguro del todo(a pesar de haber leido algo por internet), de ...
  #1 (permalink)  
Antiguo 25/05/2010, 11:38
 
Fecha de Ingreso: agosto-2008
Mensajes: 198
Antigüedad: 16 años, 4 meses
Puntos: 27
como evitar SQLinjection(novato)

Hola, como están. Miren resulta que estoy aprendiendo python, y resulta que no estoy seguro del todo(a pesar de haber leido algo por internet), de como evitar algun intento de inyección sql.

Uso postgresql con psycopg2, y voy a realizar una intruccion del tipo

conexion.sqlSentencia(self, 'insert into tabla (informacion) VALUES (%s)',i)

¿como me aseguro de que i no es una mailiciosa cadena?

Cuando estaba en php, lo hacia de la manera:

Código PHP:
function addslashes_array($_input_arr)
{
        if(
is_array($_input_arr))
        {
                
$tmp = array();
                foreach (
$_input_arr as $key1 => $val)
                        
$tmp[$key1] = $this->addslashes_array($val);
                return 
$tmp;
        }
        else return 
addslashes($_input_arr);
}
if(!
get_magic_quotes_gpc())
{
        
$input_cl_arr = array();
        foreach (
$_POST as $input_cl_key => $input_cl_arr)
                
$_POST[$input_cl_key] = WhiteInputReplace_array($input_cl_key,addslashes_array($input_cl_arr));
        
$input_cl_arr = array();
        foreach (
$_GET as $input_cl_key => $input_cl_arr)
                
$_GET[$input_cl_key] = WhiteInputReplace_array($input_cl_key,addslashes_array($input_cl_arr));
}
else
{
        
$input_cl_arr = array();
        foreach (
$_POST as $input_cl_key => $input_cl_arr)
                
$_POST[$input_cl_key] = WhiteInputReplace_array($input_cl_key,$input_cl_arr);
        
$input_cl_arr = array();
        foreach (
$_GET as $input_cl_key => $input_cl_arr)
                
$_GET[$input_cl_key] = WhiteInputReplace_array($input_cl_key,$input_cl_arr);

Mi duda sería esa. espero puedan ayudarme
  #2 (permalink)  
Antiguo 25/05/2010, 12:12
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 9 meses
Puntos: 1360
Respuesta: como evitar SQLinjection(novato)

Ejemplo sacado de la santa documentación de python:

Cita:
Iniciado por pydoc
Usually your SQL operations will need to use values from Python variables. You shouldn’t assemble your query using Python’s string operations because doing so is insecure; it makes your program vulnerable to an SQL injection attack.

Instead, use the DB-API’s parameter substitution. Put ? as a placeholder wherever you want to use a value, and then provide a tuple of values as the second argument to the cursor’s execute() method. (Other database modules may use a different placeholder, such as %s or :1.) For example:
Cita:
Iniciado por Traducción
Usualmente tus operaciones SQL necesitaran usar valores de las variables de Python. No debes de ensamblar (construir) tu query usando las cadenas de Python (strings) por que es inseguro; Hace tu programa vulnerable a ataques tipo SQL injection.

En vez de eso, usa la API de la base de datos para sustituir parametros. Pon un ? donde donde quieras usar el valor de la variable y despues enviar una tupla de valores como segundo argumento en el metodo execute() de la variable cursor. (Esto puede variar según la base de datos).
Ejemplo (para sqlite3):
Código Python:
Ver original
  1. # Nunca hagas esto, es inseguro
  2. symbol = 'IBM'
  3. c.execute("... where symbol = '%s'" % symbol)
  4.  
  5. # En vez de eso, haz esto
  6. t = (symbol,)
  7. c.execute('select * from stocks where symbol=?', t)
  8.  
  9. # Ejemplo largo
  10. for t in [('2006-03-28', 'BUY', 'IBM', 1000, 45.00),
  11.           ('2006-04-05', 'BUY', 'MSOFT', 1000, 72.00),
  12.           ('2006-04-06', 'SELL', 'IBM', 500, 53.00),
  13.          ]:
  14.     c.execute('insert into stocks values (?,?,?,?,?)', t)

Te recomiendo que cheques la API de la base de datos que estés manejando.

Perdón por la rapida traducción pero tenia prisa :P
  #3 (permalink)  
Antiguo 25/05/2010, 12:49
 
Fecha de Ingreso: agosto-2008
Mensajes: 198
Antigüedad: 16 años, 4 meses
Puntos: 27
Respuesta: como evitar SQLinjection(novato)

ok, gracias por responder
la api de psycopg2 dice

"# Pass data to fill a query placeholders and let Psycopg perform
# the correct conversion (no more SQL injections!)
>>> cur.execute("INSERT INTO test (num, data) VALUES (%s, %s)",
... (100, "abc'def"))
"


ahí me dice, que creando la instruccion de esa forma, todo debiera estar correcto, lo que pasa, es que siempre he sido un poco desconfiado, y como yo no veo realmente la cadena de la forma en que la insertará me despertaba un poco de dudas

Saludos.
  #4 (permalink)  
Antiguo 25/05/2010, 21:04
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 9 meses
Puntos: 1360
Respuesta: como evitar SQLinjection(novato)

jejejeje también me suele pasar, no saber que valor tiene mi variable.

Etiquetas: Ninguno
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 01:57.