Problema con el login (PostgreSQL+Apache+PHP5)

Iniciado por ars1993, 22 Enero 2014, 12:05 PM

0 Miembros y 1 Visitante están viendo este tema.

ars1993

Buenas, es la primera vez que utilizo PostgreSQL como gestor de base de datos y estoy haciendo un informe sobre SQL injection. El problema es que estoy teniendo un error en el código y no tengo ni idea de donde estoy cometiendo el fallo. A ver si alguien mas experimentado me hecha una mano :P Basicamente son dos archivos:

login.php

<?php
session_start
();

include 
'pg.inc.php';

//Si se ha rellenado anteriormente el formulario, comprobar los datos
if(isset($_POST["nombre"])){

//Sentencia SQL a ejecutar
$sql "SELECT * FROM usuarios WHERE nombre = ".$_POST["nombre"]." and contrasena = ".$_POST["pwd"];
echo $sql;
$resultado ejecutar_SQL($conexion,$sql);

//Si hay filas, los datos de acceso eran correctos
if(numero_filas($resultado) != 0){

//Obtener los datos del usuario loggeado
$fila fila($resultado,0);

//Almacenar su ID en los datos de la sesión
$_SESSION["usuario"] = $fila["id"];

//Dar la bienvenida
echo "<h3>Login OK</h3> Bienvenid@ ".$fila["desc"]."<br> Pulse <a href='prducto.php'>aqui;</a> para continuar.";
}
else{
echo "<h3>Login fallido</h3>";
}
}

//Si no se ha iniciado la sesión, mostrar un formulario de logon
if(!isset($_SESSION["usuario"])){
print  '<form method="POST" action="login.php">
<table border="1">
<tr>
<td colspan="2"> Introduzca sus datos de acceso</td>
</tr>
<tr>
<td>Nombre:&nbsp;</td>
<td><input type="text" name="nombre" id="nombre"></td>
</tr>
<tr>
<td>Clave:&nbsp:</td>
<td><input type="password" name="pwd" id="pwd"></td>
</tr>
</table>
<input type="submit" value="Enviar">
</form>'
;
}

?>




pg.inc.php

<?php
//Abrir una conexión con la Base de Datos
function conectar($host$db$usuario$contraseña){
return pg_connect("host=$host dbname=$db user=$usuario password=$contraseña");
}

//Cerrar una conexión
function cerrar_conexion($conexion){
pg_close($conexion);
}

//Ejecutar una consulta SQL sobre una conexión
function ejecutar_SQL($conexion$cadena){
return pg_exec($conexion$cadena);
}

//Obtener el número de filas de un resultado
function numero_filas($resultado){
return pg_numrows($resultado);
}

//Obtiene la fila número $i de un resultado
//Para obtener un campo se usa la sintaxis $fila_obtenida["nombre-de-la-columna"]
function fila($resultado$i){
return pg_fetch_array($resultado$i);
}


//Nos conectamos a la bd
$conexion conectar('localhost''SQL_injection''postgres''***********');
?>



El error que me da cuando hago el submit en el formulario es el siguiente:
Warning: pg_exec(): Query failed: ERROR: column "faqef" does not exist LINE 1: SELECT * FROM usuarios WHERE nombre = faqef and contrasena =... ^ in C:\xampp\htdocs\sql_injection\pg.inc.php on line 14


Pero lo mejor de todo, es que hago un echo de la consulta SQL que construyo y es correcta! :S
SELECT * FROM usuarios WHERE nombre = faqef and contrasena = fewe
En este caso, tendria que devolver un "login fallido" en vez de tirar un error.


Aver si alguien tiene mas vista que yo. Muchas gracias ;D ;D
640k deberian ser suficientes para todo el mundo..

engel lex

los valores a comprar en los parámetros van entre comillas simples porque siempre puede causar errores
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

Shell Root

Cambia esto,
Código (php) [Seleccionar]
$sql = "SELECT * FROM usuarios WHERE nombre = ".$_POST["nombre"]." and contrasena = ".$_POST["pwd"];

Por esto,
Código (php) [Seleccionar]
$sql = "SELECT * FROM usuarios WHERE nombre = '".$_POST["nombre"]."' AND contrasena = '".$_POST["pwd"]."'";
Por eso no duermo, por si tras mi ventana hay un cuervo. Cuelgo de hilos sueltos sabiendo que hay veneno en el aire.

ars1993

@shellroot, tu solucion me ha funcionado, muchas gracias
640k deberian ser suficientes para todo el mundo..