Foro de Xeoweb Foro de Posicionamiento y Buscadores
Aprendiendo a Promocionar Páginas Web.
Xeoweb :: Sindicar
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entre para ver sus mensajes privadosEntre para ver sus mensajes privados   LoginLogin 
mysql_real_escape_string
Ir a página 1, 2  Siguiente
 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Lenguajes de Programación Web
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
hipotecamix
Lo mío es Gigablast


Registrado: 17 Ene 2008
Mensajes: 92

MensajePublicado: Mar Ene 19, 2010 10:28 am    Asunto: mysql_real_escape_string Responder citando

Seguridad en acceso a base de datos:
He estado leyendo en tutoriales de php que a través de las base de datos te pueden hackear la web y uno de los códigos que recomiendan para evitarlo es este: mysql_real_escape_string
En la wikipedia ponen este ejemplo:
$query_result = mysql_query("SELECT * FROM usuarios WHERE nombre = \"" . mysql_real_escape_string($nombre_usuario) . "\"");

Yo lo estoy intentando adaptar a mi caso pero me da error. El problema es que desconozco programación php y a la mínima que cambio un signo sale el error. El siguiente cóidgo es el que yo tengo:

$busqueda=mysql_query("SELECT * FROM tabla WHERE codigo LIKE '%".$busca."%'" nombre (\'" . mysql_real_escape_string($usuario) . "\"")');

¿Donde puedo tener el error?
Cuando la wikipedia pone nombre_usuario, Por cual debo sustituirlo?
y cuando pone nombre, ¿por cual debo sustutuirlo?

Y otras medidas de seguridad que se os ocurra y sencillas de implementar

Gracias
_________________
coches de importacion
Hipoteca Multidivisa
Volver arriba
Ver perfil de usuario Enviar mensaje privado
ping
Me gusta MSN!


Registrado: 01 Jul 2006
Mensajes: 344
Ubicación: Galicia

MensajePublicado: Mar Ene 19, 2010 10:56 am    Asunto: Responder citando

No hace falta hacer la consulta tan complicada, prueba a filtar los parametros antes

$nombre_usuario = mysql_real_escape_string($nombre_usuario);

Saludos.
_________________
Chatear
Codigo
Volver arriba
Ver perfil de usuario Enviar mensaje privado Visitar sitio web del autor
hipotecamix
Lo mío es Gigablast


Registrado: 17 Ene 2008
Mensajes: 92

MensajePublicado: Mar Ene 19, 2010 12:15 pm    Asunto: ¿donde se pone el codigos? Responder citando

Gracias Ping
Pero donde se pone ese código? y es tal cual lo pones?

Se pones antes del que tengo
$busqueda=mysql_query("SELECT * FROM tabla WHERE

es que en cuanto cambio algo me sale error
_________________
coches de importacion
Hipoteca Multidivisa
Volver arriba
Ver perfil de usuario Enviar mensaje privado
ping
Me gusta MSN!


Registrado: 01 Jul 2006
Mensajes: 344
Ubicación: Galicia

MensajePublicado: Mar Ene 19, 2010 2:23 pm    Asunto: Responder citando

Tienes lo siguiente:

$nombre_usuario = $_POST["nombre_usuario"];

El problema es que claro, esa variable puede contener caracteres especiales para el escapado de la consulta y ser atacado por sqlinjection.

Por lo tanto cada uno de los parametros que le pasas a la consulta es conveniente que le apliques esa función antes de usarla en la consulta.

$nombre_usuario = mysql_real_escape_string($nombre_usuario);

$query_result = mysql_query("SELECT * FROM usuarios WHERE nombre like '$nombre_usuario' ");

Saludos.
_________________
Chatear
Codigo
Volver arriba
Ver perfil de usuario Enviar mensaje privado Visitar sitio web del autor
hipotecamix
Lo mío es Gigablast


Registrado: 17 Ene 2008
Mensajes: 92

MensajePublicado: Mar Ene 19, 2010 3:38 pm    Asunto: uso de $nombre_usuario = mysql_real_escape_string($nombre_us Responder citando

Gracias de nuevo ping

Lo he puesto de la siguiente forma y funciona y no sale error, pero yo me pregunto, ¿estárá haciendo algún efecto? en mi código antes no tenía nada puesto sobre nombre_usuario:

$nombre_usuario = mysql_real_escape_string($nombre_usuario);
$busqueda=mysql_query("SELECT * FROM tablas WHERE calle LIKE '%".$busca."%'");

entonces ¿tendría que cambiar nombre_usuario por el usuario que yo tengo?
os e puede quedar así y surte su efecto?
¿tendría que poner otro mysql_real_escape_string para la pasword?
He intentado poner el código:
$nombre_usuario = mysql_real_escape_string($nombre_usuario); delante de los datos de conexión (localhost, usuario, password) y sale error.
Desde luego sin saber nada de php no es facil.
_________________
coches de importacion
Hipoteca Multidivisa
Volver arriba
Ver perfil de usuario Enviar mensaje privado
JustMe
Vivo en Xeoweb


Registrado: 27 Sep 2005
Mensajes: 3063
Ubicación: Por ahí....

MensajePublicado: Mar Ene 19, 2010 4:02 pm    Asunto: Responder citando

El error más grave que estás cometiendo es usar y creer la M... publicada en la wikipedia. Un consejo para la vida, si quieres de verdad saber sobre algo, hazte un favor a ti y a la humanidad y no uses wikipedia.

A lo nuestro, mysql_real_escape_string siempre necesita una conexión ya abierta, el siguiente ejemplo tomado (Con adaptaciones) de la web de PHP, no de una güebopedia editada por pocholo.

Código:

<?php
#Entrecomilla la variable para hacerla segura
function quote_smart($value) {
   if (get_magic_quotes_gpc()) {
       $value = stripslashes($value);   # Stripslashes si se necesita
   } 
   if (!is_numeric($value)) {
       $value = "'" . mysql_real_escape_string($value) . "'"; #Si no es un valor numérico, entrecomillarlo y hacerlo seguro
   }
   return $value;
}

#Conectar
$link = mysql_connect('mysql_host', 'mysql_user', 'mysql_password')   or  die(mysql_error());

# Hacer una consulta segura

$consulta = "SELECT * FROM usuarios WHERE nombre = " . quote_smart($nombre_usuario):

#con LIKE %%

$consulta2 = "SELECT * FROM tabla WHERE codigo LIKE " .  quote_smart( '%'. $nombre_usuario .  '%' ) ;

$query_result = mysql_query($consulta); ### o consulta2

## Lo que hagas después con el resultado es otra historia, pero creo que la confusión está allí....



mysql_close(); #Importante si no quieres que tu servidor muera de éxito..

?>

_________________
PHP Data uri fier
Blog Gratis
Volver arriba
Ver perfil de usuario Enviar mensaje privado Visitar sitio web del autor
hipotecamix
Lo mío es Gigablast


Registrado: 17 Ene 2008
Mensajes: 92

MensajePublicado: Mar Ene 19, 2010 4:47 pm    Asunto: necesito manual para tontos Responder citando

Del código que me pones para situar antes de la conexión:

<?php
#Entrecomilla la variable para hacerla segura
function quote_smart($value) {
if (get_magic_quotes_gpc()) {
$value = stripslashes($value); # Stripslashes si se necesita
}
if (!is_numeric($value)) {
$value = "'" . mysql_real_escape_string($value) . "'"; #Si no es un valor numérico, entrecomillarlo y hacerlo seguro
}
return $value;
}


¡TENGO QUE HACER ALGUN CAMBIO? o FUNCIONA TAL CUAL ESTA?
Cada vez que intengo adaptar algo que busco en los foros, error al tanto

Ahora estoy buscando la forma de que me de mensajes de error cuando la casilla de buscar este vacia o que no se ha encontrado ningun resultado y siempre el mismo problema, todos me dan error
_________________
coches de importacion
Hipoteca Multidivisa
Volver arriba
Ver perfil de usuario Enviar mensaje privado
hipotecamix
Lo mío es Gigablast


Registrado: 17 Ene 2008
Mensajes: 92

MensajePublicado: Mar Ene 19, 2010 5:21 pm    Asunto: Palabras que tengo que sustituir del codigo Responder citando

El problema es que no tengo ni p. y menos de php para adaptar los códigos

Yo tengo el codigo asi
$busqueda=mysql_query("SELECT * FROM tablas WHERE calle LIKE '%".$busca."%'");

y el código que me citas es este:

"SELECT * FROM tabla WHERE codigo LIKE " . quote_smart( '%'. $nombre_usuario . '%' ) ;

¿tengo que dejar $nombre_usuario. tal cual? quitar lo que yo tengo busca?
añadir eso de quote_smart?

Comosabes,, en cuanto pones un punto o comilla de mas o de menos, error al canto
_________________
coches de importacion
Hipoteca Multidivisa
Volver arriba
Ver perfil de usuario Enviar mensaje privado
JustMe
Vivo en Xeoweb


Registrado: 27 Sep 2005
Mensajes: 3063
Ubicación: Por ahí....

MensajePublicado: Mar Ene 19, 2010 10:19 pm    Asunto: Responder citando

¿Qué es "$busca"? Es una variable pero.... ¿De dónde lo has obtenido?

Supongamos que $busca lo has obtenido de una petición de un usuario, por ejemplo, en un formulario tienes un campo llamado x234jherw (he puesto ese nombre para que no confundir variables), así:
Código:
<input name="x234jherw" type="text">

Puesto que el valor va a ser ingresado por un usuario que no conocemos, es necesario verificar que no contenga código malicioso ni otro que pueda descacharrarnos el script.... ahí es donde entra mysql_real_escape_string, eso es todo lo que hace, ni más ni menos, ni menos ni más... yo he copiado la función quote_smart de la web de PHP porque esta función cumple dos cometidos:
1. Someter los datos a la función mysql_real_escape_string
2. Poner las necesarias comillas.

Entonces, puesto que hemos recibido de un formulario el valor de una variable llamada x234jherw, la limpiamos y entrecomillamos antes de meterla en una consulta a la base de datos;

Código:
$mi_variable = quote_smart($_REQUEST['x234jherw']);


$mi_variable es el nombre que le has dado a la variable tu mismo, ya podrías haberla llamado $supercalifragilisticoespiralidoso o $busca.... o cualquier otro nombre, es sólo el nombre de la variable.

Supón que el usuario ingresa en el campo del formulario llamado x234jherw el texto Osama alias Pascual , entonces $mi_variable contendrá el texto 'Osama alias Pascual' (incluidas las comillas porque ha pasado a través de quote_smart).

Lee este tutorial super comprimido de PHP

Y si puedes después esto: http://www.programacion.net/tutorial/php/

Y después todo esto:
http://docs.php.net/manual/es/getting-started.php
_________________
PHP Data uri fier
Blog Gratis
Volver arriba
Ver perfil de usuario Enviar mensaje privado Visitar sitio web del autor
hipotecamix
Lo mío es Gigablast


Registrado: 17 Ene 2008
Mensajes: 92

MensajePublicado: Mie Ene 20, 2010 4:57 pm    Asunto: Curso de php Responder citando

Gracias de neuvo JustMe
Soy consciente de que debería leerme los tutoriales de php pero dada mi edad y tiempo que emplearia en enterarme posiblemente mi web ya habría sido atacada antes de yo aprender.

Cuando me pones function quote_smart($value)
¿Value se ueda tal cual o se sustituye por algo?

Efectivamente busca es el input <input name="busca"

y cualquier intento de adaptar códigos dando "palos de ciego" es tocar a la diosa fortuna.
_________________
coches de importacion
Hipoteca Multidivisa
Volver arriba
Ver perfil de usuario Enviar mensaje privado
JustMe
Vivo en Xeoweb


Registrado: 27 Sep 2005
Mensajes: 3063
Ubicación: Por ahí....

MensajePublicado: Mie Ene 20, 2010 5:52 pm    Asunto: Responder citando

Es una función, por definición, una función recibe cero o más valores llamados parámetros o argumentos, hace algo con ellos y devuelve un valor, te acuerdas de f(x) y de aquella definición matemática:
Cita:
Una función es una transformación que asocia a cada número perteneciente a algún subconjunto de los números reales otro número.

Pues es lo mismo, en PHP las funciones se declaran con la palabra function seguida del nombre que se le quiera dar a la función, por ejemplo, queremos crear una función que reciba como parámetro un número, le sume otro número y devuelva el resultado, por ejemplo, enviamos a la función el numero 8, la función deberá sumarlo a otro número, digamos cuatro (8+4) y devolver el resultado, nuestra función podría declararse en PHP de la siguiente manera:
Código:
<?php
function sumale_cuatro($numero) {
 $valor_de_retorno = $numero + 4;
 return $valor_de_retorno;
}
?>

Entonces, cuando yo quiero sumar a un número 4, digo:
Código:

$numero = 15; ## La variable llamada $numero contiene ahora el valor 15
$otro_numero = sumale_cuatro($numero);  ## La variable llamada $otro_numero contiene ahora el valor 19, numero sigue con 15
$numero = sumale_cuatro($numero);  ## La variable llamada $numero contiene ahora el valor 19
$numero = sumale_cuatro(8); ##La variable llamada $numero contiene ahora el valor 12



En la gran mayoría de los casos, es conveniente pensar en una función como una caja negra, a ti no te interesa como ella haga el trabajo, tu sólo debes saber que entregas algo a la función y ella te devuelve el valor que necesitas, imagina una máquina de hacer pan, por una parte entregas los ingredientes y ella mezcla las cantidades correctas, amasa y hornea y te devuelve el pan listo para comer, a ti no te interesa como lo hizo, sólo te interesa el pan que devuelve.

Volviendo al caso de quote_smart, quote_smart es también una función como la definimos, ella no le suma cuatro a otro número ni hace pan, su trabajo es otro, consiste en "limpiar" textos externos, ponerlos entre comillas y devolverlos. Como se definió:

Código:
<?php
#Entrecomilla la variable para hacerla segura
function quote_smart($value) {
   if (get_magic_quotes_gpc()) {
       $value = stripslashes($value);   # Stripslashes si se necesita
   }
   if (!is_numeric($value)) {
       $value = "'" . mysql_real_escape_string($value) . "'"; #Si no es un valor numérico, entrecomillarlo y hacerlo seguro
   }
   return $value;
}
?>


Pero lo que hace la función internamente a ti no tiene porqué interesarte, cómo lo haga es su problema, lo que te debe interesar es que ella recibe un texto y lo devuelve limpio para MySQL y entre comillas, por ejemplo:

Código:
<?php
$un_texto = "Las funciones son diver";
## Notar que las comillas no son en si parte del texto, la variable $un_texto contiene ahora el valor => Las funciones son diver
$un_texto = quote_smart($un_texto);
## la variable $un_texto contiene ahora el valor => 'Las funciones son diver' (Limpio y con comillas)
$otro_texto=  quote_smart($un_texto);
##la variable $otro_texto contiene ahora el valor => 'Las funciones son diver' (Limpio y con comillas), la variable $un_texto no fue modificada
?>


Es importante que comprendas bien el funcionamiento de las variables en PHP, en el caso de la función quote_smart, $value es un parámetro que ella recibe, que puede ser cualquier cosa, por ejemplo:
Código:
$cadena_de_busqueda = quote_smart("Las 'deliciosas' codornices de Pedro");

ó
Código:
$texto = "Las 'deliciosas' codornices de Pedro";
$cadena_de_busqueda = quote_smart($texto);

Son exactamente lo mismo.

Espero que me hayas entendido. Intenta leer por lo menos el primer tutorial.

Saludos.
_________________
PHP Data uri fier
Blog Gratis
Volver arriba
Ver perfil de usuario Enviar mensaje privado Visitar sitio web del autor
hipotecamix
Lo mío es Gigablast


Registrado: 17 Ene 2008
Mensajes: 92

MensajePublicado: Mie Ene 20, 2010 6:45 pm    Asunto: Gracias de nuevo Responder citando

Gracias de nuevo pero el problema ya no es entender las variables es que cualquier código que intento incluir siempre salta error proque hay que saber de programación entero.
El buscador lo he descargado de este tutorial http://www.djcharlie.tk/ y este es el código
<title>%</title><form name="form1" method="post" action="buscador.php">

<p>Buscar por nombre </p>
<p>
<input name="busca" type="text" id="busca">

</p>
<label>
<input type="submit" name="Submit" value="buscar">
</label>
</form>
<?php
$busca="";
$busca=$_POST['busca'];
mysql_connect("localhost","root");
mysql_select_db("nobre de tu base de datos");//nombre de la base de datos
if($busca!=""){
$busqueda=mysql_query("SELECT * FROM tablaabuscar WHERE Nombre LIKE '%".$busca."%'");//cambiar tu la tabla de busqueda
while($f=mysql_fetch_array($busqueda)){
echo $f['Dni'].'&nbsp;&nbsp;'.$f['Nombre'].'&nbsp;&nbsp;'.$f['Direccion']."<br>";
}

}
?>

POr ejemplo si intento añadir lo que tu pusiste para que informe de los errores or die(mysql_error()); despéus de la conexión ya me da error.
la función quote_smart($value) si la he cargado y no da error pero cuando tengo que añadirla a la consulta o busqueda en mi caso me pones nombre_usuario y eso no se con que se sustituye y el lio de puntos y comas también produce errores si no se pone bien en su sitio.
Pero dejalo que esperare para verlo con alguién en vivo y endirecto

No se encuentran personas como tú con tanta paciencia.
_________________
coches de importacion
Hipoteca Multidivisa
Volver arriba
Ver perfil de usuario Enviar mensaje privado
JustMe
Vivo en Xeoweb


Registrado: 27 Sep 2005
Mensajes: 3063
Ubicación: Por ahí....

MensajePublicado: Mie Ene 20, 2010 8:41 pm    Asunto: Responder citando

Intenta esto, copia y pega lo siguiente, guardalo como buscador.php, modifica donde sea necesario.....

Código:
<html>
<head>
<title>Document</title>
</head>
<body>
<p>Buscar por nombre</p>
<form name="form1" method="post" action="buscador.php">
   <input name="busca" type="text" id="busca">
   <input type="submit" name="Submit" value="buscar">
</form>
<?php
if (!empty($_POST['busca'])) { ## HACER ESTO SI EL CAMPO busca DEL FORMULARIO CONTIENE ALGO Y EL BOTON FUE PULSADO
   $busca = limpiar_valor($_POST['busca']); ## PREPARAR EL VALOR ENVIADO PARA MYSQL
   ############## CONECTAR A LA BASE DE DATOS ########################   
   $link = mysql_connect('localhost', 'NOMBRE_DE_USUARIO_MYSQL', 'CONTRASEÑA');
   mysql_select_db('NOMBRE_DE_LA_BASE_DE_DATOS', $link);
   $consulta = "SELECT * FROM tablaabuscar WHERE nombre = '$busca'"; #tablaabuscar ES EL NOMBRE DE LA TABLA, nombre ES EL CAMPO EN ESA TABLA
   $busqueda = mysql_query($consulta, $link);
   while($fila = mysql_fetch_array($busqueda)){
      echo $fila['Dni'].' '.$fila['Nombre'].' '.$fila['Direccion'].'<br />'; ## Dni, Nombre, Direccion CORRESPONDEN A LOS NOMBRES DE LOS CAMPOS EN LA TABLA
   }
   mysql_free_result($busqueda); ## DEVOLVER RECURSOS AL SISTEMA
   mysql_close($link); ## CERRAR LA CONEXION A LA BASE DE DATOS
}
############ FUNCIONES AUXILIARES ###################
# function limpiar_valor($value)
# Recibe un valor numerico o de texto.
# Devuelve el valor recibido seguro para MySQL
function limpiar_valor($value) {
   if (get_magic_quotes_gpc()) {
      $value = stripslashes($value); # Stripslashes si se necesita
   }
   if (!is_numeric($value)) {
      $value = mysql_real_escape_string($value); #Si no es un valor numérico, hacerlo seguro
   }
   return $value;
}
?>

</body>
</html>

_________________
PHP Data uri fier
Blog Gratis
Volver arriba
Ver perfil de usuario Enviar mensaje privado Visitar sitio web del autor
hipotecamix
Lo mío es Gigablast


Registrado: 17 Ene 2008
Mensajes: 92

MensajePublicado: Mie Ene 20, 2010 10:55 pm    Asunto: Errores que da el código Responder citando

Subo ese código cambiando los datos a mi tabla y sale este error

Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: Access denied for user 'ODBC'@'localhost' (using password: NO)

Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: A link to the server could not be established in

Linea que dice da el fallo:
$value = mysql_real_escape_string($value); #Si no es un valor numérico, hacerlo seguro
_________________
coches de importacion
Hipoteca Multidivisa
Volver arriba
Ver perfil de usuario Enviar mensaje privado
JustMe
Vivo en Xeoweb


Registrado: 27 Sep 2005
Mensajes: 3063
Ubicación: Por ahí....

MensajePublicado: Jue Ene 21, 2010 4:02 am    Asunto: Responder citando

Si, mea culpa, ¿recuerdas lo que te dije inicialmente de que debe existir una conexión previa a la base de datos?, pues, no lo tuve en cuenta, cambia a lo siguiente:

Código:
<html>
<head>
<title>Document</title>
</head>
<body>
<p>Buscar por nombre</p>
<form name="form1" method="post" action="buscador.php">
   <input name="busca" type="text" id="busca">
   <input type="submit" name="Submit" value="buscar">
</form>
<?php
if (!empty($_POST['busca'])) { ## HACER ESTO SI EL CAMPO busca DEL FORMULARIO CONTIENE ALGO Y EL BOTON FUE PULSADO
   ############## CONECTAR A LA BASE DE DATOS ########################   
   $link = mysql_connect('localhost', 'NOMBRE_DE_USUARIO_MYSQL', 'CONTRASEÑA');
   mysql_select_db('NOMBRE_DE_LA_BASE_DE_DATOS', $link);
   $busca = limpiar_valor($_POST['busca']); ## PREPARAR EL VALOR ENVIADO PARA MYSQL
   $consulta = "SELECT * FROM tablaabuscar WHERE nombre = '$busca'"; #tablaabuscar ES EL NOMBRE DE LA TABLA, nombre ES EL CAMPO EN ESA TABLA
   $busqueda = mysql_query($consulta, $link);
   while($fila = mysql_fetch_array($busqueda)){
      echo $fila['Dni'].' '.$fila['Nombre'].' '.$fila['Direccion'].'<br />'; ## Dni, Nombre, Direccion CORRESPONDEN A LOS NOMBRES DE LOS CAMPOS EN LA TABLA
   }
   mysql_free_result($busqueda); ## DEVOLVER RECURSOS AL SISTEMA
   mysql_close($link); ## CERRAR LA CONEXION A LA BASE DE DATOS
}
############ FUNCIONES AUXILIARES ###################
# function limpiar_valor($value)
# Recibe un valor numerico o de texto.
# Devuelve el valor recibido seguro para MySQL
function limpiar_valor($value) {
   if (get_magic_quotes_gpc()) {
      $value = stripslashes($value); # Stripslashes si se necesita
   }
   if (!is_numeric($value)) {
      $value = mysql_real_escape_string($value); #Si no es un valor numérico, hacerlo seguro
   }
   return $value;
}
?>

</body>
</html>

_________________
PHP Data uri fier
Blog Gratis
Volver arriba
Ver perfil de usuario Enviar mensaje privado Visitar sitio web del autor
Mostrar mensajes de anteriores:   
Publicar nuevo tema   Responder al tema    Foros de discusión -> Lenguajes de Programación Web Todas las horas son GMT
Ir a página 1, 2  Siguiente
Respuesta Rápida y Acciones
 

 

Página 1 de 2


Cambiar a:  
Puede publicar nuevos temas en este foro
No puede responder a temas en este foro
No puede editar sus mensajes en este foro
No puede borrar sus mensajes en este foro
No puede votar en encuestas en este foro

 


Logo diseñado por iLevante
Powered by phpBB © 2001, 2009 phpBB Group