0

Tengo un problema, en un login en php tengo una linea de código que comprueba si el user y la password son correctas, si es así, continua el código. El error esta en que introduzco el usuario y contraseña que existen en la DB y me dice como si no existieran.

$result = mysqli_query($link,"SELECT user, pass FROM usuarios WHERE user=    $username AND pass= $password");

if($result && mysqli_num_rows($result) > 0)
{
   // Login OK, continuar con el codigo.
}
else
{
   // Introduciendo un usuario y password que existen me salta este error todo el rato.
   echo 'Usuario o password no existe';
}
Alan
  • 2,262
  • 2
  • 22
  • 35
marc
  • 37
  • 1
  • 2
  • 7
  • debes tener en cuenta esto http://es.stackoverflow.com/questions/10518/qu%C3%A9-es-la-inyecci%C3%B3n-sql-y-c%C3%B3mo-puedo-evitarla – Dev. Joel Sep 23 '16 at 16:13
  • 3
    Posible duplicado de [¿Cómo evitar la inyección SQL en PHP?](http://es.stackoverflow.com/questions/18232/c%c3%b3mo-evitar-la-inyecci%c3%b3n-sql-en-php) – Mariano Oct 03 '16 at 04:28

2 Answers2

1

debes de usar sentencias preparadas para evitar la inyenccion de código SQL.

contantes.php

define('DB_HOST','TU IP');
define('DB_USERNAME','USUARIO');
define('DB_PASSWORD','CONTRASEÑA');
define('DB_NAME','BASE DE DATOS');

DBConnection

include_once 'Constantes.php';
class DBConnection {
 private $connection;
 public function connectMySQLi(){
     mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
     try {
         $this->connection = new mysqli(DB_HOST, DB_USERNAME, DB_PASSWORD, DB_NAME);
     } catch (mysqli_sql_exception $e) {
         echo "Falló al hacer la conexion: ".$e->getMessage();
     }
     //retornamos el link de conexion
     return $this->connection;
 }
}

Mandar a llamar

require_once 'DBConnection.php';
    $bd = new DBConnection();
    //realizamos la instancia de la conexion
    $connection = $bd->connectMySQLi();
    //hacemos el query
        $query = "SELECT * FROM usuarios WHERE username = ? AND pass= ?";
        $stmt = $connection->prepare($query);
        $stmt->bind_param('ss', $username, $password);
        $stmt->execute();
        //obtenemos los resultados
        $result = $stmt->get_result()->fetch_assoc();
        $stmt->close();
        if (count($result) > 0) {
            return "Acceso correcto";
        } else {
            return "Usuario no encontrado";
        }
El Micke
  • 1,456
  • 12
  • 24
0

El el query es necesario encerrar las variables entre comillas simples.

así.

"SELECT user , pass FROM usuarios WHERE user='$username' AND pass='$password'"

Suerte.

Donovan Pardo
  • 520
  • 2
  • 9
  • Funciona! Gracias, pero hay otro problema, no se si sabrás como solucionarlo, si pongo 'or '1'='1 en user y password me inicia sesion, hay alguna manera de evitarlo? Gracias! – marc Sep 23 '16 at 15:59
  • 1
    Si es posible, cuando llegan los datos por $_POST o por $_GET, hay que asignar las variables usando la funcion filter_input() http://php.net/manual/es/function.filter-input.php – Donovan Pardo Sep 23 '16 at 16:08
  • 1
    Esta respuesta introduce un gran riesgo de seguridad. Se debería leer [¿Cómo evitar la inyección SQL en PHP?](http://es.stackoverflow.com/a/18233/127) – Mariano Oct 03 '16 at 04:25