Foros del Web » Programando para Internet » PHP »

Funcion Anti-Sql-Injection

Estas en el tema de Funcion Anti-Sql-Injection en el foro de PHP en Foros del Web. Código PHP: <?php //para evitar sql injection function  sql_quote ( $valor ) {   if( get_magic_quotes_gpc ())     { $valor  =  stripslashes ( $valor );}      //comprueba si existe la función       if( function_exists ( ...
  #1 (permalink)  
Antiguo 19/05/2008, 15:23
Avatar de AbdelioR  
Fecha de Ingreso: septiembre-2006
Ubicación: Tarragona
Mensajes: 926
Antigüedad: 17 años, 7 meses
Puntos: 8
Funcion Anti-Sql-Injection

Código PHP:
<?php
//para evitar sql injection
function sql_quote($valor)
{   if(
get_magic_quotes_gpc())
    {
$valor stripslashes($valor);}
    
//comprueba si existe la función 
    
if(function_exists("mysql_real_escape_string"))
    {
$valor mysql_real_escape_string($valor);}
    
//para las versiones < 4.3.0 de php usamos addslashes 
    
else {$valor addslashes($valor);}
    return 
$valor;
}
Actualmente tengo esta función activada. Me gustaria saber si es 100% segura.

He intentado añadir el texto: "Probando: SELECT WHERE ' OR AND " ()" y me lo ha añadido tal cual a la Base de Datos. No deberia corregir esa cadena?
  #2 (permalink)  
Antiguo 20/05/2008, 08:06
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Funcion Anti-Sql-Injection

Justamente, te lo ha añadido a la base de datos en vez de ejecutarlo
Al momento de generar la consulta, se escaparon y se consideraron caracteres normales.

Tu consulta probablemente haya sido ejecutada como

INSERT .......
VALUES(......, 'Probando: SELECT WHERE \' OR AND \"()'

Con los caracteres neutralizados. Pero eso no implica que esa es la forma en la que serán guardados, una vez que la cadena se procesa las \ se eliminan porque ya cumplieron su función de protección. Por eso la cadena se guarda tal cual se escribió.

Si no hubiera funcionado la función, habrías tenido un error de SQL al ejecutar la consulta.

A propósito, no entiendo el por qué de hacer doble trabajo si las comillas mágicas están activadas.
Creo que sería lo mismo y más eficiente hacer

Código PHP:
<?php
//para evitar sql injection
function sql_quote($valor) {
    if(
get_magic_quotes_gpc()) {
        return 
$valor;
    }

    
//comprueba si existe la función 
    
if(function_exists("mysql_real_escape_string")) {
        
$valor mysql_real_escape_string($valor);
    }
    
//para las versiones < 4.3.0 de php usamos addslashes 
    
else {
        
$valor addslashes($valor);
    }
    return 
$valor;
}

Saludos.
  #3 (permalink)  
Antiguo 20/05/2008, 12:42
Avatar de AbdelioR  
Fecha de Ingreso: septiembre-2006
Ubicación: Tarragona
Mensajes: 926
Antigüedad: 17 años, 7 meses
Puntos: 8
Respuesta: Funcion Anti-Sql-Injection

Vale, no sabia que despues de ejecutar la consulta con las barras, estas no se insertaban en la base de datos.

¿Entonces las 2 funciones, serian 100% efectivas? me podria ahorrar el stripslashes por que se hace automático no? Es que la función la cogí y no la modifiqué por miedo a restarle efectividad.
  #4 (permalink)  
Antiguo 20/05/2008, 13:04
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Funcion Anti-Sql-Injection

magic_quotes es una función en vías de extinción, son cada vez menos los proveedores que la tienen activada, genera una advertencia en PHP5 y no existirá en PHP6.

El que hice no es un cambio importante, simplemente te ahorrará unos milisegundos si la función de comillas mágicas ya está activada.


Saludos
  #5 (permalink)  
Antiguo 20/05/2008, 13:21
Avatar de AbdelioR  
Fecha de Ingreso: septiembre-2006
Ubicación: Tarragona
Mensajes: 926
Antigüedad: 17 años, 7 meses
Puntos: 8
Respuesta: Funcion Anti-Sql-Injection

Entonces, si existe la función magic_quotes, retornamos el valor tal cual sin modificar, por lo que es como si no aplicaramos la función realmente? de ser así, si existe la función no es posible hace sql injection?

Ahora creo que me he liado más la pelota todavía :S
  #6 (permalink)  
Antiguo 21/05/2008, 02:09
 
Fecha de Ingreso: junio-2003
Ubicación: Granada
Mensajes: 27
Antigüedad: 20 años, 10 meses
Puntos: 1
Respuesta: Funcion Anti-Sql-Injection

Para evitar la injección en SQL utilizo esta función:

Código PHP:
<?php

function limpiar_sql($value){
    
$value trim(htmlentities($value)); // Evita introducción código HTML
    
if (get_magic_quotes_gpc()) $value stripslashes($value);
    
$value mysql_real_escape_string($value);
    return 
$value;
}

?>
Puedes ver una expicación de su uso en:

http://www.innovacionweb.com/seguidad-inyeccion-sql.php

De todas formas en PHP5 ya existe PDO (http://es.php.net/pdo) que mejora mucho la seguiridad en el uso de bases de datos.

Un saludo
  #7 (permalink)  
Antiguo 21/05/2008, 08:25
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Funcion Anti-Sql-Injection

eso NO es SQL Injection.... solo es un bug...... un bicho, jeje....

esto SI es SQL Injection => http://es.wikipedia.org/wiki/Inyecci%C3%B3n_SQL
(si lo quieren leer, es un tema mucho mas complejo que simplemente "quitar" las comillas magicas....)

PDTA: real_string solo esta disponible en PHP 5 ???? ademas, es mejor strip_tags() a htmlentities() para realmente.... EVITAR introducir HTML....

EDITO: como decia BuayaCorp.... NO basta con tener y usar las funciones de filtrado, hay que saber usarlas.... y determinar hasta que nivel.... ya lei los enlaces y estoy convencido, suerte!!!
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.

Última edición por pateketrueke; 21/05/2008 a las 08:32
  #8 (permalink)  
Antiguo 21/05/2008, 12:37
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Funcion Anti-Sql-Injection

Cita:
Iniciado por AbdelioR Ver Mensaje
Entonces, si existe la función magic_quotes, retornamos el valor tal cual sin modificar, por lo que es como si no aplicaramos la función realmente? de ser así, si existe la función no es posible hace sql injection?

Ahora creo que me he liado más la pelota todavía :S
Es que si magic_quotes está activado, PHP hará automáticamente el trabajo de escapar los caracteres "peligrosos", por lo que no es necesario hacerlo de nuevo con la función
  #9 (permalink)  
Antiguo 21/05/2008, 13:22
Avatar de AbdelioR  
Fecha de Ingreso: septiembre-2006
Ubicación: Tarragona
Mensajes: 926
Antigüedad: 17 años, 7 meses
Puntos: 8
Respuesta: Funcion Anti-Sql-Injection

OK, gracias por la aclaracion alvlin :)
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 14:35.