Foros del Web » Programando para Internet » PHP »

Seguridad base de datos con mysql_real_escape_string

Estas en el tema de Seguridad base de datos con mysql_real_escape_string en el foro de PHP en Foros del Web. Tengo una web con base dedatos y he oido que pueden atacar la web y que se puede poner código para evitarlo. He leido algo ...
  #1 (permalink)  
Antiguo 24/01/2010, 08:21
 
Fecha de Ingreso: julio-2009
Mensajes: 7
Antigüedad: 14 años, 9 meses
Puntos: 0
Seguridad base de datos con mysql_real_escape_string

Tengo una web con base dedatos y he oido que pueden atacar la web y que se puede poner código para evitarlo. He leido algo sobre esta función: mysql_real_escape_string . El problema es que no tengo conocimientos de php y por mucho que busco en foros e intento ponerlo siempre me da error.
Este es el código que yo tengo de acceso a base de datos:
<?php
$link=mysql_connect("localhost","usuario","passwor d");

mysql_select_db('base_datos');
$n=$_GET['id'];
$todo=mysql_fetch_array(mysql_query("select * from pueblos where cod_id='".$n."'"));

?>

¿donde y como tendría que poner el código para tener mayor seguridad ante una posible inyeccion sql ?
Como digo no tengo conocimientos de php y en cuanto cambio una comilla o una coma me sale error por lo que tendría que hacerlo sobre este código que pongo aqui.
Gracias por vuestra colaboración.
  #2 (permalink)  
Antiguo 24/01/2010, 08:38
 
Fecha de Ingreso: enero-2010
Mensajes: 152
Antigüedad: 14 años, 3 meses
Puntos: 5
Respuesta: Seguridad base de datos con mysql_real_escape_string

Bueno, antes que nada te recomiendo leer esto:

http://code.google.com/p/doctype/wiki/EsArticleIntroductionToXSS


mysql_real_escape_string, como te dice en el manual, te escapa caracteres especiales tomando en cuenta la codificación de la base de datos.

pero por sí mismo no funciona, segun el código que pusiste, imaginate que yo meto desde mi url esto:

archivo.php?id=(delete from pueblos where id>0).

Entonces, la query que pasaría sería:

Código MySQL:
Ver original
  1. select * from pueblos where cod_id=(delete from pueblos where id>0)

con lo cual yo podría borrar todos los registros de tu tabla.

Entonces, antes que nada debes tener la costumbre de incluir comillas en tus consultas así:

Código PHP:
Ver original
  1. $todo=mysql_fetch_array(mysql_query("select * from `pueblos` where `cod_id`='".$n."'"));

Así mi código maligno quedará como texto y tu tabla estará segura.

pero digamos que yo soy mas listo y escribo esto en la URL:

archivo.php?id=43' and id=(delete from pueblos where id>0) and nombre='sdf.

Y con eso ahora la query quedara como:

Código MySQL:
Ver original
  1. select * from `pueblos` where `cod_id`='43' and id=(delete from pueblos where id>0) and nombre='sdf'

Y nuevamente estás en peligro, allí es donde entra mysql_real_escape_string():

Código PHP:
Ver original
  1. $todo=mysql_fetch_array(mysql_query("select * from `pueblos` where `cod_id`='".mysql_real_escape_string($n,$link)."'"));

tras lo cual la consulta quedaría como:

Código MySQL:
Ver original
  1. select * from `pueblos` where `cod_id`='43\' and id=(delete from pueblos where id>0) and nombre=\'sdf'

Y de nuevo has evitado mi intento de hacerte pasar un muy mal día.
  #3 (permalink)  
Antiguo 24/01/2010, 09:23
Avatar de xbx
xbx
 
Fecha de Ingreso: mayo-2008
Ubicación: /home/xbx
Mensajes: 301
Antigüedad: 15 años, 11 meses
Puntos: 11
Respuesta: Seguridad base de datos con mysql_real_escape_string

paynalton,
Los casos como ID's numéricos lo mejor es hacer un cast:

Código PHP:
$n=(int)$_GET['id']; 
Saludos,
  #4 (permalink)  
Antiguo 24/01/2010, 10:35
 
Fecha de Ingreso: julio-2009
Mensajes: 7
Antigüedad: 14 años, 9 meses
Puntos: 0
Respuesta: Seguridad base de datos con mysql_real_escape_string

Perfeco, ahora si funciona paynalton
Muchisimas gracias por tu aportación
A pesar de haberme leido horas y horas no era capaz de introducir el código y que funcionara
En el caso de que la consulta la tenga de esta forma:
$resultado = mysql_query('select distinct ID,`campo` from `pueblos` order by `campo` limit 0,13');

¿donde se pondría el código? y con este código es suficiente para estar seguro?

Por otra parte, si tienes alguna web y quieres algún enlace, puedes dejarme un privado y te pongo alguno
  #5 (permalink)  
Antiguo 08/02/2010, 16:29
Avatar de zerpico_01  
Fecha de Ingreso: enero-2008
Ubicación: Wilde - Avellaneda -
Mensajes: 421
Antigüedad: 16 años, 3 meses
Puntos: 13
Respuesta: Seguridad base de datos con mysql_real_escape_string

Cita:
Iniciado por ferruiz Ver Mensaje
Tengo una web con base dedatos y he oido que pueden atacar la web y que se puede poner código para evitarlo. He leido algo sobre esta función: mysql_real_escape_string . El problema es que no tengo conocimientos de php y por mucho que busco en foros e intento ponerlo siempre me da error.
Este es el código que yo tengo de acceso a base de datos:
<?php
$link=mysql_connect("localhost","usuario","passwor d");

mysql_select_db('base_datos');
$n=$_GET['id'];
$todo=mysql_fetch_array(mysql_query("select * from pueblos where cod_id='".$n."'"));

?>

¿donde y como tendría que poner el código para tener mayor seguridad ante una posible inyeccion sql ?
Como digo no tengo conocimientos de php y en cuanto cambio una comilla o una coma me sale error por lo que tendría que hacerlo sobre este código que pongo aqui.
Gracias por vuestra colaboración.
Código PHP:
$link=mysql_connect("localhost","usuario","password");

mysql_select_db('base_datos');
$n=htmlentities($_GET['id'],ENT_QUOTES);

////SI $n NO ES NUMERO ENVIO A OTRA PAGINA 
  
if (!preg_match("/^[0-9]+$/"$n))
  {
 
header("Location:../index.php");
exit();
}

$todo=sprintf("select * from pueblos where cod_id='%s'",stripslashes(mysql_real_escape_string($n))); 
SALUDOS!
  #6 (permalink)  
Antiguo 10/02/2010, 20:11
 
Fecha de Ingreso: febrero-2010
Mensajes: 1
Antigüedad: 14 años, 2 meses
Puntos: 0
Respuesta: Seguridad base de datos con mysql_real_escape_string

Cita:
Iniciado por paynalton Ver Mensaje
Bueno, antes que nada te recomiendo leer esto:

imaginate que yo meto desde mi url esto:

archivo.php?id=(delete from pueblos where id>0).

Entonces, la query que pasaría sería:

Código MySQL:
Ver original
  1. select * from pueblos where cod_id=(delete from pueblos where id>0)

con lo cual yo podría borrar todos los registros de tu tabla.
¡Hola! soy nuevo. ¿este problema de seguridad se evitaria enviando mediante POST y no variables en la url (GET) ? ¿es asi?

Porque soy nuevo con PHP pero para evitar problemas siempre envio variables mediante POST (cuando se trata de datos importantes).
Aunque es verdad que tambien puedo enviar 'codigo' en campos de un formulario (lo habia pasado por alto)
pero en ese caso puedo "validar" los campos de alguna forma para evitar que ingresen codigo.

¿les parece correcto esto? o aun es inseguro...

¡Saludos!
Adoro PHP y este foro es de lo mejor!
  #7 (permalink)  
Antiguo 01/11/2010, 11:32
Avatar de Hobby72  
Fecha de Ingreso: junio-2009
Mensajes: 34
Antigüedad: 14 años, 10 meses
Puntos: 0
Respuesta: Seguridad base de datos con mysql_real_escape_string

Hola tengo un problema similar con un libro de visitas que me bombardearon de todo tipo de script maligno, se que se utiliza mucho mysql_real_escape_string pero en mi caso estoy igual no se en que parte de mi codigo fuente de libro de visitas lo puedo insertar. Dejo el codigo a la vista por si alguien con los conocimientos adecuados me pueda ayudar, gracias de antemano.

<?php require_once('Connections/libreriavirtualconn.php');?>
<?php if (!function_exists("GetSQLValueString")) {
function GetSQLValueString($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = "")
{
if (PHP_VERSION < 6) {
$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 = mysql_real_escape_string($_SERVER['PHP_SELF']);
if (isset($_SERVER['QUERY_STRING'])) {
$editFormAction .= "?" . htmlentities($_SERVER['QUERY_STRING']);
}

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

mysql_select_db($database_libreriavirtualconn, $libreriavirtualconn);
$Result1 = mysql_query($insertSQL, $libreriavirtualconn) or die(mysql_error());

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

mysql_select_db($database_libreriavirtualconn, $libreriavirtualconn);
$query_categorias = "SELECT * FROM categorias";
$categorias = mysql_query($query_categorias, $libreriavirtualconn) or die(mysql_error());
$row_categorias = mysql_fetch_assoc($categorias);
$totalRows_categorias = mysql_num_rows($categorias);

mysql_select_db($database_libreriavirtualconn, $libreriavirtualconn);
$query_visitas = "SELECT * FROM visitas ORDER BY visitaid DESC";
$visitas = mysql_query($query_visitas, $libreriavirtualconn) or die(mysql_error());
$row_visitas = mysql_fetch_assoc($visitas);
$totalRows_visitas = mysql_num_rows($visitas);
?>

Etiquetas: 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 13:49.