Foros del Web » Programando para Internet » PHP »

Problema con Consulta (php-sql)

Estas en el tema de Problema con Consulta (php-sql) en el foro de PHP en Foros del Web. Saludos amigos estoy haciendo mis consultas en php y sql tengo un formulario, que pasa el pasa mediante el metodo post el valor a ser ...
  #1 (permalink)  
Antiguo 09/11/2004, 15:09
 
Fecha de Ingreso: noviembre-2004
Mensajes: 50
Antigüedad: 13 años, 1 mes
Puntos: 0
Exclamación Problema con Consulta (php-sql)

Saludos amigos estoy haciendo mis consultas en php y sql

tengo un formulario, que pasa el pasa mediante el metodo post el valor a ser
usado en la consulta. Este es el código del Formulario

-----------------------------------------------------------------------
<html>
<head>
<title>Titulo form</title>
</head>
<body>
<form action="consulta.php" method="post">
Criterio de búsqueda:
<input type="text" name="buscar" id="buscar" size="22" maxlength="150">
<input type="submit" value="buscar" >
</form>
</body>
</html>
----------------------------------------------------------------------


Y este es el código del archivo php que recibe el valor del input text de nombre "buscar" y lo recibe en la consulta.

--------------------------------------------------------------
<?

$busqueda =$_POST["buscar"];


$conectID = mssql_connect("localhost","SA","12345");
mssql_select_db("facturas", $conectID);
$mssql = "SELECT ordencompra, total,igv from factura
where idcliente= '$busqueda'";


$resultid=mssql_query($mssql,$conectID);


?>

<table width=500 align=center>
<tr bgcolor="#D9D9EC" align=center>
<td ><b>Pedido Nº</b></td>
<td><b>Orden Compra</b></td>
<td><b>Total</b></td>
<td><b>IGV</b></td>
</tr>

<?


$contador=1;
$num_fila = 0;


while ($damefila=mssql_fetch_object($resultid)){
echo "<tr ";
if ($num_fila%2==0)
echo "bgcolor=#E9E9E9";
else
echo "bgcolor=#ddddff";
echo ">";

?>

<td><?echo $contador ?></td>
<td><?echo $damefila->ordencompra;?></td>
<td><?echo $damefila->total;?></td>
<td><?echo $damefila->igv;?></td>
</tr>

<?
$contador++;
$num_fila++;

}

?>

</table>

<?
echo "<br>";
echo "<center>";
echo "Usted tiene ","<b>", $contador-1,"</b>", "<p>","Pedidos ", "</p>";
echo "</center>";
?>

------------------------------------------------------------------------

Mi problema es el Siguiente Cuando ingreso mediante el formulario un codigo que no exista en la bd me imprime la palabra este codigo no existe en la base de datos pero debajo me imprime la tabla, he usado if pero igual.

Ahora para el segundo caso en el cual no tenga registros también me sucede lo mismo me imprime la palabra Usted no tiene registros pero debajo me imprime la tabla.. He usado if, else if pero algo estoy haciendo mal,

me podrian Ayudar? gracias

Moises Alvarez
  #2 (permalink)  
Antiguo 09/11/2004, 15:21
Avatar de claudiovega  
Fecha de Ingreso: octubre-2003
Ubicación: Puerto Montt
Mensajes: 3.667
Antigüedad: 14 años, 1 mes
Puntos: 11
Prueba esto:

<?
$busqueda =$_POST["buscar"];
$conectID = mssql_connect("localhost","SA","12345");
mssql_select_db("facturas", $conectID);
$mssql = "SELECT ordencompra, total,igv from factura where idcliente= '$busqueda'";
$resultid=mssql_query($mssql,$conectID);
//compruebo si hay registros y si la consulta se ejecutó
if ($resultid && mssql_num_rows($resultid)>0)
{
?>
<table width=500 align=center>
<tr bgcolor="#D9D9EC" align=center>
<td ><b>Pedido Nº</b></td>
<td><b>Orden Compra</b></td>
<td><b>Total</b></td>
<td><b>IGV</b></td>
</tr>
<?
$contador=1;
$num_fila = 0;
while ($damefila=mssql_fetch_object($resultid))
{
echo "<tr ";
if ($num_fila%2==0)
echo "bgcolor=#E9E9E9";
else
echo "bgcolor=#ddddff";
echo ">";
?>
<td><?echo $contador ?></td>
<td><?echo $damefila->ordencompra;?></td>
<td><?echo $damefila->total;?></td>
<td><?echo $damefila->igv;?></td>
</tr>
<?
$contador++;
$num_fila++;
}
?>
</table>
<?
echo "<br>";
echo "<center>";
echo "Usted tiene ","<b>", $contador-1,"</b>", "<p>","Pedidos ", "</p>";
echo "</center>";
}
else
{
echo "No hay registros";
}
?>
  #3 (permalink)  
Antiguo 09/11/2004, 15:41
 
Fecha de Ingreso: octubre-2004
Ubicación: Barcelona
Mensajes: 195
Antigüedad: 13 años, 1 mes
Puntos: 7
Como mínimo añade un $busqueda = addslashes($_POST["buscar"]); para evitar en parte un ataque por inyección de código SQL, sinó lo dejas totalmente inseguro.
  #4 (permalink)  
Antiguo 09/11/2004, 16:06
Avatar de andinistas  
Fecha de Ingreso: julio-2003
Ubicación: Bogotá COL
Mensajes: 1.000
Antigüedad: 14 años, 5 meses
Puntos: 0
ok

Cita:
Iniciado por pintix
Como mínimo añade un $busqueda = addslashes($_POST["buscar"]); para evitar en parte un ataque por inyección de código SQL, sinó lo dejas totalmente inseguro.
Como qué tipo de ataque con una consulta SQL se puede ejecutar si no se le agrega addslashes ?, podria ejecutarse un UPDATE, DELETE ?

creo que el usuario que quisiera hacer eso tendría que conocer las tablas de la base de datos..

Si puedes explicarme mejor
__________________
Un Saludo, Andinistas.
"Llegaron... Ellos tenían la biblia y nosotros la tierra... y nos dijieron: 'Cierren los ojos y recen.' Cerramos los ojos y cuando los abrimos,
ellos tenían la tierra y nosotros la biblia." Abadío Green.
  #5 (permalink)  
Antiguo 10/11/2004, 01:22
 
Fecha de Ingreso: octubre-2004
Ubicación: Barcelona
Mensajes: 195
Antigüedad: 13 años, 1 mes
Puntos: 7
Mira este ejemplo, que está en diferentes idiomas por la red, pero he encontrado una versión en castellano aquí. Parecido tipo de ataques se pueden hacer en otras bases de datos.

Cita:
Ejemplo 15_9_ Ataque al sistema operativo de la máquina anfitriona de la base de datos (MSSQL Server)

$consulta = "SELECT * FROM productos WHERE id LIKE '%$prod%'";
$resultado = mssql_query($consulta);
Si el atacante envía el valor a%' exec master__xp_cmdshell 'net user test testpass /ADD' __ a $prod, entones la $consulta será:


$consulta = "SELECT * FROM productos
WHERE id LIKE '%a%'
exec master__xp_cmdshell 'net user test testpass /ADD'__";
$resultado = mssql_query($consulta);

MSSQL Server ejecuta sentencias SQL en el lote, incluyendo un comando para agregar un nuevo usuario a la base de datos de cuentas locales_ Si esta aplicación estuviera corriendo como sa y el servicio MSSQLSERVER está corriendo con los privilegios suficientes, el atacante tendría ahora una cuenta con la que puede acceder a esta máquina
Con este código si mssql está en el mismo servidor que el servidor web, el hacker/cracker puede acceder fácilmente a toda la base de datos, si es un hacker solo husmeará, pero...
  #6 (permalink)  
Antiguo 10/11/2004, 06:46
Avatar de claudiovega  
Fecha de Ingreso: octubre-2003
Ubicación: Puerto Montt
Mensajes: 3.667
Antigüedad: 14 años, 1 mes
Puntos: 11
Asi es, nadie debiera trabajar con SA o con root, pues aunque no conozcan la estructura de tus tablas las pueden averiguar, por ejemplo en sql server existe una tabla que indica que base de datos hay en el servidor, otra que muestra las tablas de la bd. En mysql tiene una consulta especial que muestra las base de datos, otra que muestra las tablas de la bd, otra que describe los campos de la tabla y si usas para la conexion el usuario root o SA puede el atacante ejecutar todos esos comandos.
He visto siempre que pocos nos damos el trabajo de administrar la BD de manera de otorgar los permisos minimos a cada usuario para realizar su trabajo, y queremos que simplemente funcione
  #7 (permalink)  
Antiguo 10/11/2004, 10:11
Avatar de andinistas  
Fecha de Ingreso: julio-2003
Ubicación: Bogotá COL
Mensajes: 1.000
Antigüedad: 14 años, 5 meses
Puntos: 0
ok

Cita:
Iniciado por claudiovega
Asi es, nadie debiera trabajar con SA o con root, pues aunque no conozcan la estructura de tus tablas las pueden averiguar, por ejemplo en sql server existe una tabla que indica que base de datos hay en el servidor, otra que muestra las tablas de la bd. En mysql tiene una consulta especial que muestra las base de datos, otra que muestra las tablas de la bd, otra que describe los campos de la tabla y si usas para la conexion el usuario root o SA puede el atacante ejecutar todos esos comandos.
He visto siempre que pocos nos damos el trabajo de administrar la BD de manera de otorgar los permisos minimos a cada usuario para realizar su trabajo, y queremos que simplemente funcione
Ok Claudio, bueno personalmente tengo en mi computador una aplicación para gestionar una agenda telefónica mia con mis contactos, yo accedo desde internet porque mi pc tiene un ip fijo y reviso mis contactos, ingreso, modifico, etc., pero me alarmó el tema de la seguridad y para solventar el problema comencé por crear un usuario llamado 'seguro' con su password, lo cree con el phpmyadmin y le asigné los permisos:

DATOS: SELECT, INSERT, UPDATE, DELETE, FILE
ESTRUCTURA: CREATE, ALTER, INDEX, DROP, CREATE TEMPORARY TABLES

y le denegué los permisos de administración (osea los que tiene un super usuario como root), no sé si cree bien el usuario si me puedes orientar, también el la parte de accesar via localhost o por host o un %...

ok la segunda es la manera de pasar los datos de un form de login HTML a un .php para ser procesado, ya sea por POST o por GET.

Pero esta bien si yo hago lo siguiente?

Código PHP:
$usuario $_POST[usuario];
$password $_POST[password];

$consulta "SELECT usuario, password FROM tabla_usuarios WHERE usuario='$usuario' AND $password = '$password' ";

$resultado mysql_query($consulta); 
?
__________________
Un Saludo, Andinistas.
"Llegaron... Ellos tenían la biblia y nosotros la tierra... y nos dijieron: 'Cierren los ojos y recen.' Cerramos los ojos y cuando los abrimos,
ellos tenían la tierra y nosotros la biblia." Abadío Green.
  #8 (permalink)  
Antiguo 10/11/2004, 10:39
Avatar de claudiovega  
Fecha de Ingreso: octubre-2003
Ubicación: Puerto Montt
Mensajes: 3.667
Antigüedad: 14 años, 1 mes
Puntos: 11
Con ese tipo de validacion se hace necesario usar la funcion stripslashes() para evitar ataques de inyeccion de sql, no se si evitará todas la posibilidades, pero ahi no estas usando esa función.
Tal vez como yo he hecho portales y sistemas en php, con acceso sólo para un numero reducido de personas no he tenido contratiempos con la administracion de usuarios, es por eso que uso una validación asi:

1. creo y otorgo los permisos minimos a cada usuario en mysql, base por base, tabla por tabla.
2. Al crear el usuario le indico que sólo se puede conectar desde el equipo local, lo cual funciona por que no necesito dar acceso a la bd desde el exterios, y quien acdede a fin de cuentas a mysql no es otra maquina sino la local, al logearse desde una pagina web.
3. por tanto valido con mysql_connect();

mysql_connect("localhost",$_POST['login'],$_POST['password']);

Si no pasa de alli, entonces es por que el usuario no puede entrar a la bd.

No se si en mysql se pueden crear grupos de usuarios si fuera asi, mejoraria la gestion de la forma que uso para validar.
  #9 (permalink)  
Antiguo 10/11/2004, 11:29
 
Fecha de Ingreso: octubre-2004
Ubicación: Barcelona
Mensajes: 195
Antigüedad: 13 años, 1 mes
Puntos: 7
Yo una de las cosas que hago, cuando se trata sólo de entrar usuario y contraseña para hacer login, es convertir con md5 ($valor) los valores y compararlos con valores de la base de datos convertidos de la misma forma. Con esto te aseguras el estar protegido de las técnicas de inyección de SQL ya que una cadena md5 no es posible que se interprete de ninguna forma como un comando SQL.
  #10 (permalink)  
Antiguo 10/11/2004, 15:31
 
Fecha de Ingreso: noviembre-2004
Mensajes: 50
Antigüedad: 13 años, 1 mes
Puntos: 0
Sonrisa Gracias por la respuesta Claudio

Gracias Claudio, tu ayuda me sirvio bastante.

Hasta la próxima

Moises A.
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.
Tema Cerrado




La zona horaria es GMT -6. Ahora son las 23:32.