Foros del Web » Programando para Internet » PHP »

¿como detener inyeccion sql?

Estas en el tema de ¿como detener inyeccion sql? en el foro de PHP en Foros del Web. Hola a todos nuevamente, sigo aprendiendo en esto de la web y ahora me interesa detener lo que supongo es una inyeccion sql. Esto es ...
  #1 (permalink)  
Antiguo 05/05/2008, 08:39
 
Fecha de Ingreso: febrero-2006
Mensajes: 217
Antigüedad: 18 años, 2 meses
Puntos: 0
Exclamación ¿como detener inyeccion sql?

Hola a todos nuevamente, sigo aprendiendo en esto de la web y ahora me interesa detener lo que supongo es una inyeccion sql. Esto es lo que me insertan en el form:

Código HTML:
Good site. Thanks.
<A href='http://jamespostell.c0n.us/naruto1193.html'>naruto</A> 
y mucho mas.

Yo suponia que la primera parte de este script era para eliminar ese tipo de cosas (lo hace dreamweaver automaticamente), pero parece que no:

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;
}
}

$editFormAction $_SERVER['PHP_SELF'];
if (isset(
$_SERVER['QUERY_STRING'])) {
  
$editFormAction .= "?" htmlentities($_SERVER['QUERY_STRING']);
}

if ((isset(
$_POST["MM_insert"])) && ($_POST["MM_insert"] == "form1")) {
  
$insertSQL sprintf("INSERT INTO post (nombre, comentario) VALUES (%s, %s)",
                       
GetSQLValueString($_POST['nombre'], "text"),
                       
GetSQLValueString($_POST['comentario'], "text"));

  
mysql_select_db($database_post$post);
  
$Result1 mysql_query($insertSQL$post) or die(mysql_error());

  
$insertGoTo "post.php";
  if (isset(
$_SERVER['QUERY_STRING'])) {
    
$insertGoTo .= (strpos($insertGoTo'?')) ? "&" "?";
    
$insertGoTo .= $_SERVER['QUERY_STRING'];
  }
  
header(sprintf("Location: %s"$insertGoTo));
}

mysql_select_db($database_post$post);
$query_post "SELECT * FROM post";
$post mysql_query($query_post$post) or die(mysql_error());
$row_post mysql_fetch_assoc($post);
$totalRows_post mysql_num_rows($post);
?>
Como hago para que no me ingresen mas estos datos en el form?

Última edición por Ruben_C; 05/05/2008 a las 08:48
  #2 (permalink)  
Antiguo 05/05/2008, 08:53
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Re: ¿como detener inyeccion sql?

kiero preguntarte ¿que es una inyeccion de SQL?

seguro ke no te refieres a XSS ???
  #3 (permalink)  
Antiguo 05/05/2008, 09:00
 
Fecha de Ingreso: febrero-2006
Mensajes: 217
Antigüedad: 18 años, 2 meses
Puntos: 0
Re: ¿como detener inyeccion sql?

Bueno por lo que sé, es cuando te meten codigo para convertir tu pagina en un emisor involuntario de spam, o como en este caso, incrustar links a otros sitios. Por eso puse "supongo que es una inyeccion sql", por que en realidad no se si entra en esa categoria.

Si es otra cosa, se agradeceria mucho una aclaracion, porque queda claro que estoy algo perdido.
  #4 (permalink)  
Antiguo 05/05/2008, 09:15
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Re: ¿como detener inyeccion sql?

por lo ke imaginas, me suena mas como un atake de XSS...
para limpiar estas etiketas indeseadas usas strip_tags()

seria algo asi como un <img src="expression(alert(true))"/>
otra recomendacion, no supongas... investiga mas y luego, expon tus dudas...
  #5 (permalink)  
Antiguo 05/05/2008, 09:43
 
Fecha de Ingreso: febrero-2006
Mensajes: 217
Antigüedad: 18 años, 2 meses
Puntos: 0
Re: ¿como detener inyeccion sql?

No tenia idea de que existieran ataques xss, solo sql, por lo tanto tenia que suponer. Gracias por la aclaracion.
  #6 (permalink)  
Antiguo 05/05/2008, 09:50
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 Re: ¿como detener inyeccion sql?

eso que pusiste ahi, no es una inyeccion sql ni ataques xss....
es simplemente meter codigo html en tu pagina... y se elimina muy facilmente...

con esta funcion:

htmlentities();


funcion de dreamweaver modificada:
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 
htmlentities($theValue);   /// aca esta la modificacion...


y listo! tambien te va a protejer de ataques xss...
  #7 (permalink)  
Antiguo 05/05/2008, 09:57
Avatar de farra  
Fecha de Ingreso: marzo-2008
Ubicación: Aqui estoy
Mensajes: 574
Antigüedad: 16 años, 1 mes
Puntos: 20
Re: ¿como detener inyeccion sql?

Ejemplo de inyeccion sql:
// consulta vulnerable:
$consulta="SELECT * FROM usuarios WHERE nombre = '$_GET['nombre']' ";

el usuario manda por $_GET alicia:
$consulta="SELECT * FROM usuarios WHERE nombre = 'Alicia';"

pero que pasa si el usuario manda por $_GET:'Alicia';
DROP TABLE usuarios;
SELECT * FROM datos WHERE nombre LIKE '%'

$consulta="SELECT * FROM usuarios WHERE nombre = 'Alicia';
DROP TABLE usuarios;
SELECT * FROM datos WHERE nombre LIKE '%' ";

listo borro toda tu base de datos....

http://es.wikipedia.org/wiki/Inyecci%C3%B3n_SQL


ejemplo de inyeccion sql invisible:

Código:
www.tupagina.com/pagina.php?id=-1/**/UNION/**/ALL/**/SELECT/**/1,2,concat(user,0x3a,pass),null,5,6/**/FROM/**/users/*
ahi te saco todos los datos de tu base de datos y vos ni te diste cuenta.... jeje

Última edición por farra; 05/05/2008 a las 13:10
  #8 (permalink)  
Antiguo 05/05/2008, 10:07
 
Fecha de Ingreso: febrero-2006
Mensajes: 217
Antigüedad: 18 años, 2 meses
Puntos: 0
Re: ¿como detener inyeccion sql?

mmm, gracias farra!!, asi dan gusto las respuestas.
  #9 (permalink)  
Antiguo 05/05/2008, 10:15
 
Fecha de Ingreso: marzo-2008
Mensajes: 166
Antigüedad: 16 años
Puntos: 5
Re: ¿como detener inyeccion sql?

JAJAJAJAJA no es ni inyección sql ni xss

Es una inyección html....

inyección sql: le hacen peticiones involuntarias a tu base de datos, pueden desde ingresar un nuevo registro en un base de datos, ver su contenido, actualizar una tabla o hasta borrarla completamente.

xss: es cuando por medio de un formulario (generalmente de busqueda) meten sentencia javascript para que aparezca un alert o un mensaje confiurado.... es normalmente inofensivo pero si es alguien avanzado el que genera el ataque puede hasta robar cookies y etc...

inyección sql: es cuando tienen activado el html (permiten el ingreso de html) en un campo y por lo mismo metn codigo malicioso ... ejemplo: libro de visitas... pones tu firma pero como permite el uso de html le haces un metatag de redirecion y cuando entren a tu pagina se redireccionara a otra dejando inusable tu libro de visitas...

la solución: htmlspecialchars() o un monton que eisten...

Saludos.
  #10 (permalink)  
Antiguo 05/05/2008, 10:18
 
Fecha de Ingreso: junio-2005
Ubicación: Madrid, España
Mensajes: 288
Antigüedad: 18 años, 9 meses
Puntos: 1
Re: ¿como detener inyeccion sql?

usa tambien addslashes http://es2.php.net/addslashes
  #11 (permalink)  
Antiguo 05/05/2008, 10:42
 
Fecha de Ingreso: febrero-2006
Mensajes: 217
Antigüedad: 18 años, 2 meses
Puntos: 0
Re: ¿como detener inyeccion sql?

Gracias por las respuestas!!!. ahora ya se que existen mas inyecciones que en un hospital jejeje.

solo queda probar las soluciones y ver que pasa.

Gracias!!
  #12 (permalink)  
Antiguo 05/05/2008, 10:52
 
Fecha de Ingreso: abril-2006
Mensajes: 1.128
Antigüedad: 18 años
Puntos: 33
Re: ¿como detener inyeccion sql?

Que les parece este SQL Injection en Ingles
en YOUTUBE.COM
Parece que los hospitales estan de moda!!!!.
http://es.youtube.com/watch?v=MJNJjh4jORY
http://es.youtube.com/watch?v=_Bh1_-...eature=related
Saludos
Franco
  #13 (permalink)  
Antiguo 05/05/2008, 11:02
 
Fecha de Ingreso: febrero-2006
Mensajes: 217
Antigüedad: 18 años, 2 meses
Puntos: 0
Re: ¿como detener inyeccion sql?

UFF!!, una vez me pregunte si alguien podia modificar el codigo de esa manera. pense que no se podia!!!, es como para volverse paranoico . jejeje

¿y se puede parar eso?
  #14 (permalink)  
Antiguo 05/05/2008, 11:21
 
Fecha de Ingreso: marzo-2008
Mensajes: 166
Antigüedad: 16 años
Puntos: 5
Re: ¿como detener inyeccion sql?

Jejejeje si se puede detener...

Lo del video es obvio que pase... vamos todos saben que no deben validar o filtrar datos con javascript y es lo que hizo el programador ese...

porque con solo desactivar el javascript en tu navegador quedas vulnerable... o como hizo este, lo guardo en su compu e hizo la peticion desde su compu hasta la web pero con el codigo ya modificado....

La solucion: HAZLO DESDE LA TECNOLOGIA DEL SERVIDOR ya sea php, asp, o el que tu quieras...

ya que asi el no puede ni siquiera saber como la estas validando ni que sucede con los datos que el introdujo...

Y por lo del metodo que el uso... les voy a mostrar un poquito que sucedio... por ejemplo:

tienes un formulario de usery pass y cada vez que alguien mete info haces una consulta asi:

mysql_query("SELECT * FROM usuarios WEHERE user='$usuario' AND pass='$contrasenia'");

Parece seguro pero que pasa si le ingresas esto:

usuario: admin
pass: ' OR 1='1

Pues que al hacer la consulta obtiene esto:

SELECT * FROM usuarios WHERE user='admin' AND pass='' OR 1='1'

Y pues obviamente 1 siempre va a ser igual a 1 y te devuelve true y ya eres admin :D

Saludos.
  #15 (permalink)  
Antiguo 05/05/2008, 11:51
Avatar de seik!  
Fecha de Ingreso: mayo-2006
Mensajes: 492
Antigüedad: 17 años, 10 meses
Puntos: 6
Re: ¿como detener inyeccion sql?

siempre depuren un poko mas sus variables...

pueden recorren buscando caracteres o codigos q son conocidos y generan sql por inyeccion y otros

para esto funciones varias..

explode();
str_replace ();
Código PHP:
function trim(strtexto){    
            var 
i;
            var 
sw 1;
            var 
inlargo strtexto.length;
            var 
strretorno "";
            for(
i=0;i<inlargo;i++){
                if(
sw == 1){
                    if(
strtexto.charAt(i) != " "){
                        
sw 0;
                        
strretorno strretorno strtexto.charAt(i);
                    }        
                }else{
                    
strretorno strretorno strtexto.charAt(i);
                }
            }
            
sw 1;
            
strtexto strretorno;
            
inlargo strtexto.length;
            
strretorno "";
            for(
i=(inlargo 1);i>=0;i--){
                if(
sw == 1){
                    if(
strtexto.charAt(i) != " "){
                        
sw 0;
                        
strretorno strtexto.charAt(i) + strretorno;
                    }        
                }else{
                    
strretorno strtexto.charAt(i) + strretorno;
                }    
            }
            return 
strretorno;
        } 
etc... saludos
__________________
sEIK! -Chile-
Analista Programador.
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 04:39.