Foros del Web » Programando para Internet » PHP »

Es suficiente con AddSlashes() para evitar la inyección SQL?

Estas en el tema de Es suficiente con AddSlashes() para evitar la inyección SQL? en el foro de PHP en Foros del Web. Hola, quería saber si era suficiente con AddSlashes() para evitar la Inyección SQL . Muchas gracias....
  #1 (permalink)  
Antiguo 05/01/2008, 16:40
Avatar de hgp147  
Fecha de Ingreso: diciembre-2006
Ubicación: Buenos Aires, Argentina
Mensajes: 980
Antigüedad: 17 años, 3 meses
Puntos: 36
Pregunta Es suficiente con AddSlashes() para evitar la inyección SQL?

Hola, quería saber si era suficiente con AddSlashes() para evitar la Inyección SQL.

Muchas gracias.
  #2 (permalink)  
Antiguo 05/01/2008, 16:46
Avatar de j_aroche
Server Ninja
 
Fecha de Ingreso: agosto-2006
Ubicación: iPhone: 14.624481,-90.487457
Mensajes: 2.066
Antigüedad: 17 años, 8 meses
Puntos: 223
Re: Es suficiente con AddSlashes() para evitar la inyección SQL?

Yo creo que es mejor detectar si magic_quotes está activo y usar mysql_real_escape_string.
__________________
Blog: JavierAroche.com - Twitter: @j_aroche
  #3 (permalink)  
Antiguo 05/01/2008, 16:59
 
Fecha de Ingreso: marzo-2004
Ubicación: España
Mensajes: 185
Antigüedad: 20 años, 1 mes
Puntos: 19
Re: Es suficiente con AddSlashes() para evitar la inyección SQL?

Cita:
Iniciado por hgp147 Ver Mensaje
Hola, quería saber si era suficiente con AddSlashes() para evitar la Inyección SQL.

Muchas gracias.
yo creo que si que es suficiente.
__________________
Escape Room -

Ios Games
  #4 (permalink)  
Antiguo 05/01/2008, 17:54
okram
Invitado
 
Mensajes: n/a
Puntos:
Re: Es suficiente con AddSlashes() para evitar la inyección SQL?

Las funciones que te han dado te ofrecen más o menos protección. Mira esta función. Es una combinacion de todo lo que te dicen ahi arriba, lo que la hace en cierta forma más segura :

Código PHP:
function mysql_escape($val) {
    if (
get_magic_quotes_gpc()) $val stripslashes($val);
    
$f = (function_exists('mysql_real_escape_string')) ? "mysql_real_escape_string" : ((function_exists('mysql_escape_string')) ? "mysql_escape_string" "addslashes");
    return (!
is_numeric($val)) ? "'".$f($val)."'" $val;

FORMA DE USO:

Tu consulta es:

Código PHP:
$sql "SELECT * FROM tabla WHERE campo1=".mysql_escape('hola')." AND campo2=".mysql_escape(4); 
Espero te sirva...

Un saludo,
  #5 (permalink)  
Antiguo 06/01/2008, 10:02
Avatar de yrduk  
Fecha de Ingreso: enero-2007
Ubicación: Caracas, Venezuela
Mensajes: 277
Antigüedad: 17 años, 3 meses
Puntos: 3
Re: Es suficiente con AddSlashes() para evitar la inyección SQL?

Hola! cuando empezé a trabajar con bases de datos, y a programar sistemas que requieran consultas, etc... programé mi pequeña función de seguridad, la pongo aqui para el que le pueda servir

Código PHP:
function security($variable$echo) {
$variable strip_tags($variable);
$variable trim($variable);
$variable str_replace("&""&"$variable);
$variable str_replace("'""&#039"$variable);
$variable str_replace("?""&#039"$variable);
$variable str_replace("`""&#039"$variable);
$variable str_replace("\"""""$variable);
if(
$echo==1) { echo $variable; }
return 
$variable;

Saludos!
  #6 (permalink)  
Antiguo 06/01/2008, 16:28
Avatar de hgp147  
Fecha de Ingreso: diciembre-2006
Ubicación: Buenos Aires, Argentina
Mensajes: 980
Antigüedad: 17 años, 3 meses
Puntos: 36
Re: Es suficiente con AddSlashes() para evitar la inyección SQL?

Hola, gracias a todos por su ayuda. Voy a probar los códigos de okram y yrduk.
  #7 (permalink)  
Antiguo 05/04/2008, 00:58
Avatar de farra  
Fecha de Ingreso: marzo-2008
Ubicación: Aqui estoy
Mensajes: 574
Antigüedad: 16 años, 1 mes
Puntos: 20
Re: Es suficiente con AddSlashes() para evitar la inyección SQL?

usa esta funcion para todas las variables externas $_GET $_POST $_COOKIE etc...

Código 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 llamando a la funcion:

Código PHP:
$variable=GetSQLValueString($_GET['Id'],"int"); 
  #8 (permalink)  
Antiguo 05/04/2008, 01:10
Avatar de farra  
Fecha de Ingreso: marzo-2008
Ubicación: Aqui estoy
Mensajes: 574
Antigüedad: 16 años, 1 mes
Puntos: 20
Exclamación Re: Es suficiente con AddSlashes() para evitar la inyección SQL?

NO ES SUFICIENTE..! solo elimina las comillas.... que pasa si te hacen una inyeccion parecida a esta:
Código HTML:
http://www.ejemplo.com/articulo.php?Idarticulo=-1/**/UNION/**/ALL/**/SELECT/**/1,2,concat(usuario,0x3a,clave),null,5,6/**/FROM/**/users/*
luego ya van a poder ver todos los nombres de usuarios y claves de tus usuarios!

bue.. vos decis, que importa! total las claves estan protegidas con md5... bue.. les cuento que existen paginas para saber, por ejemplo: http://www.md5search.org/
  #9 (permalink)  
Antiguo 24/09/2008, 02:51
 
Fecha de Ingreso: septiembre-2008
Mensajes: 1
Antigüedad: 15 años, 7 meses
Puntos: 0
porque pasais querys por GET?

porque pasais querys por GET?
Ademas de ser peligroso es bastante feo de cara a las URLs
  #10 (permalink)  
Antiguo 24/09/2008, 05:08
 
Fecha de Ingreso: mayo-2005
Mensajes: 188
Antigüedad: 18 años, 11 meses
Puntos: 6
Respuesta: porque pasais querys por GET?

Cita:
Iniciado por mixme Ver Mensaje
Ademas de ser peligroso es bastante feo de cara a las URLs
Cuidado!!!! Pasar variables por GET o por POST es igual de peligroso!!!! No pienses que por pasar las variables por POST ya está todo solucionado, ni mucho menos.

Un usuario inexperto no sabrá realizar peticiones POST, ya que al entrar las variables por URL desde la línea del navegador siempre serán GET.

Pero un usuario con unos mínimos conocimientos en el uso de herramientas clientes HTTP (tipo curl o wget) podrá realizar peticiones POST (incluso enviar cookies o identificadores de sesión).
  #11 (permalink)  
Antiguo 24/09/2008, 08:49
Avatar de Covids0020  
Fecha de Ingreso: septiembre-2003
Ubicación: España
Mensajes: 217
Antigüedad: 20 años, 6 meses
Puntos: 1
Respuesta: Es suficiente con AddSlashes() para evitar la inyección SQL?

Yo... lo mismo siempre estoy igual, pero es que hace tiempo que empecé a quitarme la manía de reinventar la rueda.

A) Mirar la infinidad de clases de gestión de bases de datos habidas en los prefabricados: Drupal, Wordpress, Mambo.... Normalmente están bien hechas y son abstractas, se pueden llevar a otros sistemas o adpatándolas sólo un poco.

B) Lo mejor en mi opinión. Usar alguna librería sólida como las de PEAR o frameworks como Zend, entre otros.

Está bien aprender... pero es que hay cosas que ya no se les puede dar más vueltas, sólo y en todo caso mejorarlas o actualizarlas.

Yo creo que es mucho más sencillo bajarse un framework o una librería, usar sus componentes y punto.
Que normalmente podrá ser usado con algo parecido a esto:
Código PHP:
include_once('ruta_componente_y_o_dependencias');
$myDB = new $componenteClass;
$myQueryStr $myDB->escape('QUERY_STR');
$myQuery $myDB->query($myQueryStr); 
4 líneas, toma ya, limpio, elegante... sencillo.
Además, seguro que está mucho mejor mantenida y chequeada que cualquier código nuestro porque normalmente hay una gran comunidad alrededor.
Obviamente cada cual hace lo quiere, pero vamos... creo que otra cosa es perder el tiempo.

PD: En cualquier otro caso usaría la de Okram y por extensión la de Farra ;)
__________________
"La sabiduría comienza donde acaba el conocimiento". Yaris.
http://www.culturadigital.org

Última edición por Covids0020; 24/09/2008 a las 08:58
  #12 (permalink)  
Antiguo 24/09/2008, 09:06
Avatar de chitoso  
Fecha de Ingreso: mayo-2008
Ubicación: Montevideo, Uruguay
Mensajes: 205
Antigüedad: 15 años, 11 meses
Puntos: 5
Respuesta: Es suficiente con AddSlashes() para evitar la inyección SQL?

Es como todo, tendrías que evaluar costo/beneficio... Esta función puede ser suficiente en algunos casos.

En este link, te pasan 3 opciones que son mejores que simplemente usar AddSlashes. Una es usar el mecanismo de escape de caracteres de cada proveedor de base de datos, por ejemplo mysql_real_escape_string(). La otra, usar PDO. Y la última, usar una librería de terceros.

http://devzone.zend.com/article/1918...-SQL-Injection

Yo uso PDO y la verdad, a pesar de que no hay mucho tutorial en internet, luego que le agarras la mano, es bastante útil. Lo recomiendo como buena practica.

Saludos
__________________
Pasión por la Música
  #13 (permalink)  
Antiguo 24/09/2008, 09:16
Avatar de chitoso  
Fecha de Ingreso: mayo-2008
Ubicación: Montevideo, Uruguay
Mensajes: 205
Antigüedad: 15 años, 11 meses
Puntos: 5
Respuesta: Es suficiente con AddSlashes() para evitar la inyección SQL?

Te dejo la url del manual PHP y un código de muestra que uso en una de mis apps.


PHP: PDO

Código php:
Ver original
  1. ...            
  2.        
  3. $stmt = $link->prepare("INSERT INTO administrators(id, username, password, email, phone, type)
  4. VALUES (:id, :username, :password, :email, :phone, :type)");
  5.            
  6. $stmt->bindParam(':id', $new_id);
  7. $stmt->bindParam(':username', $p_admin->getUsername());
  8. $stmt->bindParam(':password', $p_admin->getPassword());
  9. $stmt->bindParam(':email', $p_admin->getEmail());
  10. $stmt->bindParam(':phone', $p_admin->getPhone());
  11. $stmt->bindParam(':type', $p_admin->getType());
  12.  
  13. try{
  14.     $stmt->execute();
  15. }
  16. catch(PDOException $e){
  17.     throw new Exception($e->getMessage());
  18. }
  19. ...
__________________
Pasión por la Música
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 3 personas (incluyéndote)




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