Foros del Web » Programando para Internet » PHP »

seguridad frente sql injection

Estas en el tema de seguridad frente sql injection en el foro de PHP en Foros del Web. Bueno pues estoy mirando el tema de sql injection y despues de leer mucha literatura que hay por internet y ver muchas combinaciones entre diferentes ...
  #1 (permalink)  
Antiguo 03/09/2008, 01:48
 
Fecha de Ingreso: mayo-2008
Mensajes: 117
Antigüedad: 15 años, 11 meses
Puntos: 8
seguridad frente sql injection

Bueno pues estoy mirando el tema de sql injection y despues de leer mucha literatura que hay por internet y ver muchas combinaciones entre diferentes formas, se me ocurre a mi una que me parece bastante eficiente...
a ver ... mi codigo dice mas o menos asi (resumidillo )

formulario.php
Código:
<form actuon="validar.php" method="post"> 
<input type=text name="nombre"> 
<input type=password name="pass"> 
<inpyt type=submit" value="enviar">


validar.php

Código:

Código:
$usu = md5($_POST['nombre']); 
$pas = md5($_POST['pass']); 

//(el codigo que falta para conectar a la bd...) 

$query='SELECT * FROM usuaris where nom=\''.$usu.'\' and contra=\''.$pas.'\''; 

//(el codigo que falta para conectar a la bd...)
hasta que punto es seguro esto frente a Sql injection? por que cuando los datos se agregan a la linea de la pregunta llegan encriptados...

a ver que os parece..
un saludo

Última edición por harryp; 03/09/2008 a las 02:18
  #2 (permalink)  
Antiguo 03/09/2008, 07:56
 
Fecha de Ingreso: abril-2003
Ubicación: Madrid
Mensajes: 707
Antigüedad: 21 años
Puntos: 0
Respuesta: seguridad frente sql injection

Ese es un claro ejemplo, de los que verás cuando busques como evitar sql injection, prueba a poner en nombre de usuario ' AND 1=1'

La mejor forma de evitarlo es hacer procedimientos almacenados, y llamarlos pasando los parámetros, es la más sencilla de hacer, y la que menos cambio provoca en tu código
  #3 (permalink)  
Antiguo 04/09/2008, 06:34
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: seguridad frente sql injection

Pues es seguro, pero no parece muy práctico, dado que ya no tenés forma de saber el nombre de usuario (porque lo que guardás es la suma md5 del nombre de usuario).

Almacenar la suma md5 de la contraseña es uno de los métodos más usados, así que está muy bien que lo hagas así. Pero con el nombre de usuario es mejor usar mysql_real_escape_string() (en MySQL, por supuesto. Otros gestores tienen funciones similares)


Saludos.
  #4 (permalink)  
Antiguo 04/09/2008, 08:02
Avatar de leeja  
Fecha de Ingreso: octubre-2005
Mensajes: 82
Antigüedad: 18 años, 5 meses
Puntos: 0
Respuesta: seguridad frente sql injection

hay q recordar que las inyecciones sql, se pueden hacer por cualquier formulario que interectue con la BD, entonces tu algoritmo para resolver problemas de inyeccion, no solo debe funcionar para consultas de logeo.
__________________
www.datasegura.net
  #5 (permalink)  
Antiguo 04/09/2008, 09:32
 
Fecha de Ingreso: mayo-2008
Mensajes: 117
Antigüedad: 15 años, 11 meses
Puntos: 8
Respuesta: seguridad frente sql injection

ya .. ese es el gran problema el que esta encriptado jaja... pues voy a provar con sql_real_escape_string() pero es que tengo una duda con el... a ver he mirado en varios sitios el mismo ejemplo e incluso en la pagina oficial de PHP sobre el y siempre veo lo mismo:

$query = sprintf("SELECT * FROM usuarios WHERE usuario='%s' AND
password='%s'",
mysql_real_escape_string($usuario),
mysql_real_escape_string($password));

Por que en la sentencia usuario esta igualado a '%s' ? y por que pasword esta igualado alo mismo mismo? como sabe cual poner en que sitio?

Muchas gracias a todos jeje

un saludo
  #6 (permalink)  
Antiguo 04/09/2008, 09:36
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: seguridad frente sql injection

Eso es porque usa sprintf(), que se usa de esa forma.
Esto es equivalente

Código PHP:
$query "SELECT * FROM usuarios WHERE usuario='".mysql_real_escape_string($usuario)."' AND password='".mysql_real_escape_string($password))."'; 
Aunque te recomiendo que la contraseña la guardes con el md5, es más seguro (no para tu aplicación, sino para tus usuarios).


Saludos.
  #7 (permalink)  
Antiguo 04/09/2008, 10:43
 
Fecha de Ingreso: mayo-2008
Mensajes: 117
Antigüedad: 15 años, 11 meses
Puntos: 8
Respuesta: seguridad frente sql injection

oms... oka muchas gracias

salu2!
  #8 (permalink)  
Antiguo 04/09/2008, 13:01
Avatar de farra  
Fecha de Ingreso: marzo-2008
Ubicación: Aqui estoy
Mensajes: 574
Antigüedad: 16 años, 1 mes
Puntos: 20
De acuerdo Respuesta: seguridad frente sql injection

esta es una funcion muy buena que la genera el dreamweaver, he probado de todo y todavia no encontre ninguna forma de hackearla...

Código PHP:
<?php if (!function_exists("GetSQLValueString")) {
function 
GetSQLValueString($theValue$theType$theDefinedValue ""$theNotDefinedValue ""
{
  
$theValue get_magic_quotes_gpc() ? stripslashes($theValue) : $theValue;

  
$theValue function_exists("mysql_real_escape_string") ? mysql_real_escape_string($theValue) : mysql_escape_string($theValue);

  switch (
$theType) {
    case 
"text":
      
$theValue = ($theValue != "") ? "'" $theValue "'" "NULL";
      break;    
    case 
"long":
    case 
"int":
      
$theValue = ($theValue != "") ? intval($theValue) : "NULL";
      break;
    case 
"double":
      
$theValue = ($theValue != "") ? "'" doubleval($theValue) . "'" "NULL";
      break;
    case 
"date":
      
$theValue = ($theValue != "") ? "'" $theValue "'" "NULL";
      break;
    case 
"defined":
      
$theValue = ($theValue != "") ? $theDefinedValue $theNotDefinedValue;
      break;
  }
  return 
$theValue;
}
}
?>

ejemplo de como usar:
Código PHP:
<?php
$texto
=GetSQLValueString($_POST['var'], "text");
$numerico=GetSQLValueString($_POST['var'], "int");
?>
__________________
Firma:
Es mas dificil para el mono entender que el hombre desciende de el....

PD: Siempre doy karma al que me da una buena respuesta... ;0)
  #9 (permalink)  
Antiguo 15/10/2008, 23:12
 
Fecha de Ingreso: mayo-2007
Mensajes: 27
Antigüedad: 16 años, 11 meses
Puntos: 0
Pregunta Respuesta: seguridad frente sql injection

Saludos Alguien sabe como hago para que usando esta opcion
Código PHP:
case "text":
      
$theValue = ($theValue != "") ? "'" $theValue "'" "NULL"
Que genera dreamweaver para proteger de SQL Injection, el resultado no me genere algo asi 'variable' y solo variable, ya que esas comillas no se usan en mysql si lo que quiero enviar como variable es el nombre de un campo.
por ejemplo

Código HTML:
..... WHERE $variable1 LIKE $variable2 GROUP ....
donde $variable1 es el nombre del campo que en mysql no puede ir con comillas ''

Espero haberme dejado entender , gracias por las respuestas
  #10 (permalink)  
Antiguo 16/10/2008, 05:36
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: seguridad frente sql injection

¿cómo que no puede ir entrecomillado? sí que puede y de hecho los valores tipo cadena DEBEN ir entrecomillados.
  #11 (permalink)  
Antiguo 16/10/2008, 09:40
 
Fecha de Ingreso: mayo-2007
Mensajes: 27
Antigüedad: 16 años, 11 meses
Puntos: 0
Respuesta: seguridad frente sql injection

la consulta que se genera es algo asi

Código PHP:
select sis.*, sistr.cod from sis left join sistr on sis.cod=sistr.cod WHERE 'campo' LIKE '%texto%' GROUP BY cod 
conde 'campo' es una variable enviada por POST y corresponde al nombre de un campo. pero no se ejecuta debido a las comillas ''

Se puede protejer de alguna forma ese dato con el procedimiento de Dreamveaver o tengo qu hacerlo de otra forma.
  #12 (permalink)  
Antiguo 16/10/2008, 10:31
Avatar de gilbeRt_fox  
Fecha de Ingreso: octubre-2008
Ubicación: Asunción
Mensajes: 16
Antigüedad: 15 años, 6 meses
Puntos: 0
Respuesta: seguridad frente sql injection

Roydan! de cualquier angulo esta mal tu consulta! si decis que es una variable por POST entonces porq no escribes $_POST['campo'] y si es que habias asignado anteriormente a una variable tu recepcion del POST por que no usas $campo... si escribes 'campo' jamas podria ser ningun tipo de variable!

has lo siguiente.. recepciona tu variable POST ===> $campo = $_POST['campo'];
y luego en tu SQL escribe donde tu WHERE ===> '$campo'
  #13 (permalink)  
Antiguo 16/10/2008, 11:01
 
Fecha de Ingreso: mayo-2007
Mensajes: 27
Antigüedad: 16 años, 11 meses
Puntos: 0
Respuesta: seguridad frente sql injection

Asi tengo mis variables
Código PHP:
$campo $_POST["campo"]; //// corresponde al nombre del campo
$criterio $_POST["criterio"]; //// corresponde a un texto 
La consulta que me genera Dreamweaver es asi

Código PHP:
sprintf("select sis.*, sistr.cod from sis left join sistr on sis.cod=sistr.cod WHERE %s LIKE %s GROUP BY cod ORDER BY cod ASC"GetSQLValueString($campo"text"),GetSQLValueString("%" $criterio "%""text")); 
al hacerle un echo a la consulta sql
genera algo asi

Código PHP:
select sis.*, sistr.cod from sis left join sistr on sis.cod=sistr.cod WHERE 'campo1' LIKE '%textoabuscar%' GROUP BY cod 
ese 'campo1' me da error, por que deberia ser solo campo1 . porque dreamweaver lo considera como texto y me lo deja con comillas,

Hay alguna forma de proteger esa variable sin que el resultado me de con comillas

o me estoy equivocando en algo

Saludos
  #14 (permalink)  
Antiguo 16/10/2008, 11:05
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: seguridad frente sql injection

Queda claro cuál es el problema.
Una solución rápida si no querés pensar demasiado en el problema ni cambiar la función, es utilizar trim() para eliminar las comillas:

Código PHP:
trimGetSQLValueString($campo"text"), "'" ); 

Saludos.
  #15 (permalink)  
Antiguo 16/10/2008, 11:06
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Respuesta: seguridad frente sql injection

Hola Roydan,

Si tu pasas esa variable por esa función le estas agregando las comillas, la solución es que no pases esa variable por la función sino solamente ponerla entre backticks, algo así:
Código php:
Ver original
  1. sprintf("select sis.*, sistr.cod from sis left join sistr on sis.cod=sistr.cod WHERE %s LIKE %s GROUP BY cod ORDER BY cod ASC", $campo,GetSQLValueString("%" . $criterio . "%", "text"));

Saludos.
  #16 (permalink)  
Antiguo 16/10/2008, 11:12
 
Fecha de Ingreso: mayo-2007
Mensajes: 27
Antigüedad: 16 años, 11 meses
Puntos: 0
Respuesta: seguridad frente sql injection

Gracias por la respuesta, y mi variable es segura de esa forma?, le tengo terror al sql injection jeje

Saludos
  #17 (permalink)  
Antiguo 16/10/2008, 11:16
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Respuesta: seguridad frente sql injection

Por supuesto que no es segura, pero el problema viene de tu algoritmo, lo que yo haria en ese caso es comprobar el campo y checar que sea igual a una lista de campos para comparar, pero ese es tu trabajo.

Saludos.
  #18 (permalink)  
Antiguo 16/10/2008, 11:22
 
Fecha de Ingreso: mayo-2007
Mensajes: 27
Antigüedad: 16 años, 11 meses
Puntos: 0
Respuesta: seguridad frente sql injection

Gracias, investigare al respecto.
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

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 00:43.