Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] No puedo asegurar esta query

Estas en el tema de No puedo asegurar esta query en el foro de PHP en Foros del Web. Buenas, Les comento que se me hace imposible asegurar el siguiente código, pertenece a un live search. Al colocar el símbolo de porcentaje (%) la ...
  #1 (permalink)  
Antiguo 28/12/2013, 21:29
 
Fecha de Ingreso: febrero-2013
Ubicación: Bariloche - Argentina
Mensajes: 7
Antigüedad: 11 años, 2 meses
Puntos: 0
No puedo asegurar esta query

Buenas,
Les comento que se me hace imposible asegurar el siguiente código, pertenece a un live search. Al colocar el símbolo de porcentaje (%) la query devuelve todos los resultados posibles, osea es inseguro.

Código PHP:
$q $_REQUEST['email'];
    
$q mysqli_real_escape_String($con$q);
    
$sql mysqli_query($con"SELECT id, email FROM web_cert WHERE activa = 0 and email LIKE '%$q%' ORDER BY id LIMIT 0,5");
    
$i 0;
    
$num mysqli_num_rows($sql);
    if(
$num)
    {
        while(
$i $num and $row mysqli_fetch_assoc($sql))
        {
            
$id $row['id'];
            
$email $row['email'];
            echo 
"<li><a href=./vercertificacion?id=".$id." >".$email."</a></li>";
        }
    }
    else { echo 
"<li>No hay resultados</li>"; } 
Intenté asegurar la consulta de las siguientes maneras, pero ninguna dio resultado. También intenté usando sprintf pero la consulta se "distorciona", osea en la parte del "LIKE '%$q%'" no funciona el "LIKE %%s%".
Código PHP:
$q htmlentities($qENT_QUOTES,'UTF-8');
    
$q preg_replace("/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$/"" "$q);
    
$q stripslashes($q); 
  #2 (permalink)  
Antiguo 28/12/2013, 21:49
Avatar de enlinea777  
Fecha de Ingreso: mayo-2008
Ubicación: frente al pc
Mensajes: 1.830
Antigüedad: 15 años, 11 meses
Puntos: 127
Respuesta: No puedo asegurar esta query

y que seria seguro???????????????

solo tienes que limpiar la variable.
echa un vistaso por aqui.
http://www.onsoni.com/2011/09/evitar...codigo-en.html

P.D. hay!! del que diga que es auto promocion o publicidad.
  #3 (permalink)  
Antiguo 28/12/2013, 22:06
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: No puedo asegurar esta query

Puedes limpiar los datos que recibes aplicando las expresiones regulares que se muestran en este sitio.

Otra forma, sin expresiones regulares:

Código PHP:
Ver original
  1. $dato = mysqli_real_escape_string($conexion, strip_tags(trim($_POST["dato"])));

Para parametrizar la consulta con sprintf, debes hacerlo de esta forma, así evitarás el conflicto con los otros signos de porcentaje:

Código PHP:
Ver original
  1. $query = mysqli_query($conexion, sprintf("SELECT * FROM tabla WHERE campo LIKE '%%%s%%'", $dato));

Se escapan los signos de dólar del LIKE, colocándolos de forma doble para evitar el conflicto con el signo de dólar del especificador de tipo.

Obviamente, trabajando con LIKE, vas a obtener todos los resultados similares al dato recibido, si quieres obtener un dato idéntico, utiliza el signo de igualdad.

Saludis
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand

Última edición por Alexis88; 28/12/2013 a las 22:50
  #4 (permalink)  
Antiguo 28/12/2013, 22:52
 
Fecha de Ingreso: febrero-2013
Ubicación: Bariloche - Argentina
Mensajes: 7
Antigüedad: 11 años, 2 meses
Puntos: 0
Respuesta: No puedo asegurar esta query

Le llamo seguridad a que solo aparezcan resultados que hayan sido llamados de una manera correcta, no con el signo %
No sé si estoy haciendo algo mal o qué. Nada de lo que dijeron ayudó.
Probando lo único que me funcionó fue la linea
Código PHP:
$q preg_replace("/[^A-Za-z0-9]/""/"$q); 
El problema con esta linea es que el buscador está hecho para encontrar emails, y de esta forma no puedo.
Cuando uso la siguiente linea para los emails:
Código PHP:
$q preg_replace("/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$/"" "$q); 
La situación vuelve a la misma, mostrando todos los resultados si ingreso el símbolo %.
  #5 (permalink)  
Antiguo 28/12/2013, 23:01
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: No puedo asegurar esta query

Estás algo confundido, seguridad, en programación web, es evitar que algún usuario inserte código malicioso, a lo que te refieres es otra cosa. La consulta te va a devolver todos los datos similares que se encuentren en la base de datos con respecto al dato ingresado, porque estás trabajando con coincidencia de patrones.

Con la primera expresión regular, reemplazas con una barra inclinada a todas las letras y números que se encuentren en el contenido de la variable $q. Con la segunda expresión regular, reemplazas con un espacio en blanco a todos los elementos que conforman la expresión dada, dicho de otro modo, si el valor de $q es un email con formato válido, será borrado, no de la base de datos, sino como valor de la variable en cuestión.

Creo que tienes que replantear lo que estás haciendo, porque de esa forma, no está bien.

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #6 (permalink)  
Antiguo 28/12/2013, 23:29
 
Fecha de Ingreso: febrero-2013
Ubicación: Bariloche - Argentina
Mensajes: 7
Antigüedad: 11 años, 2 meses
Puntos: 0
Respuesta: No puedo asegurar esta query

Antes que nada muchas gracias. Hablé de seguridad porque hasta antes de leer el artículo pensaba que al ingresar el simbolo de % permitiría a un atacante ingresar un código malicioso.

Entendí que el símbolo de %, según mi criterio y mi explicación es como decir "cualquiera", siempre saldrán todos los resultados posibles. Aplicando el $q% así podría hacer que solamente busque emails que comiencen con $q y así sucesivamente.

Ahora comprendo que debo utilizar las expresiones regulares extendidas, es decir que en vez de con LIKE deben ser con REGEXP.

Espero de que si me haya equivocado en algo me corrijas. Muchas gracias de nuevo y gracias.
  #7 (permalink)  
Antiguo 28/12/2013, 23:40
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: No puedo asegurar esta query

Esto es simple:

Limpias el dato recibido de posible código malicioso, puedes hacerlo con expresiones regulares o usando funciones de PHP, como las siguientes
Código PHP:
Ver original
  1. $email = mysqli_real_escape_string($conn, strip_tags($_POST["email"]));

Verificas que el formato del email sea válido
Código PHP:
Ver original
  1. echo preg_match("/^([\w_\.-]+)@([\w\.-]+)\.([a-z\.]{2,6})$/", $email) ? "Correcto" : "Incorrecto";

Por último, realizas la consulta
Código PHP:
Ver original
  1. $query = mysqli_query($conn, sprintf("SELECT email FROM tabla WHERE email = '%s'", $email);

Acomodando estas líneas de código, podrías evitar que se haga la consulta si el formato del email no es válido.
Código PHP:
Ver original
  1. if (preg_match("/^([\w_\.-]+)@([\w\.-]+)\.([a-z\.]{2,6})$/", $email)
  2.      $query = mysqli_query($conn, sprintf("SELECT email FROM tabla WHERE email = '%s'", $email);
  3. else
  4.      echo "El email debe tener un formato válido";

Nota que uso la función preg_match en lugar de preg_replace, que es la que venías usando.

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand

Última edición por Alexis88; 29/12/2013 a las 00:14
  #8 (permalink)  
Antiguo 29/12/2013, 10:09
 
Fecha de Ingreso: febrero-2013
Ubicación: Bariloche - Argentina
Mensajes: 7
Antigüedad: 11 años, 2 meses
Puntos: 0
Respuesta: No puedo asegurar esta query

Como dije anteriormente, la consulta debía ser REGEXP en vez de LIKE. Recordemos que es un cuadro de busqueda y si hago WHERE email = $q no funciona.
Muchas gracias por responder.
  #9 (permalink)  
Antiguo 29/12/2013, 12:15
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: No puedo asegurar esta query

¿Y por qué no va a funcionar?, esa es una manera de filtrar los resultados, así como lo puedes hacer con LIKE o con ON. Incluso puedes optimizar dicho filtrado.

Tienes que leer más al respecto para que tengas una idea más clara de esto.

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand

Última edición por Alexis88; 29/12/2013 a las 12:53

Etiquetas: mysql, mysqli, seguridad
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 02:30.