¿Cómo prevenir la inyección de SQL en PHP?

En este artículo, vamos a discutir cómo prevenir la inyección de SQL en PHP. El requisito previo de este tema es que tenga XAMPP en su computadora.

¿Por qué se produce la inyección de SQL?

La inyección SQL es una técnica de inyección de código utilizada para atacar aplicaciones basadas en datos, en la que se insertan declaraciones SQL maliciosas en un campo de entrada para su ejecución (por ejemplo, para volcar el contenido de la base de datos al atacante).

En este tipo de técnica, el pirata informático o atacante utiliza algunos caracteres especiales que convierten la consulta SQL en una nueva consulta SQL y el atacante puede manipular la consulta ingresando más tipos de palabras clave.

Hagamos un escenario de inyección SQL y luego aprenderemos cómo solucionarlo.

Paso 1: Entonces, comencemos creando una base de datos: 

CREATE DATABASE GFG;

Paso 2: Usa esta base de datos –

USE GFG;

Paso 3: cree una tabla de credenciales de inicio de sesión en la base de datos de GFG: 

CREATE TABLE users( 
    id int(10) PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(255),
    password VARCHAR(255)
);

Paso 4: Inserte algunos datos en la base de datos – 

INSERT INTO users VALUES(1, 'idevesh', '1234');
INSERT INTO users VALUES(2, 'geeksforgeeks', 'gfg');

Datos después de la inserción

Paso 5: ahora cree un script PHP para la página de inicio de sesión: 

(a) Crear un archivo de conexión DB (dbconnection.php) – 

PHP

<?php
  
$db = mysqli_connect("localhost","root","","GFG");
  
if (mysqli_connect_errno()) {
    echo "Failed to connect to MySQL: " 
        . mysqli_connect_error();
}
?>

(b) Cree un formulario HTML para ingresar desde el USUARIO – 

PHP

<!DOCTYPE html>
<html>
  
<head>
    <title>GFG SQL Injection Article</title>
    <link rel="stylesheet" type="text/css" 
        href="style.css">
</head>
  
<body>
    <div id="form">
        <h1>LOGIN FOR SQL INJECTION</h1>
        <form name="form" 
            action="verifyLogin.php" method="POST">
  
            <p>
                <label> USER NAME: </label>
                <input type="text" id="user" 
                    name="userid" />
            </p>
  
            <p>
                <label> PASSWORD: </label>
                <input type="text" id="pass" 
                    name="password" />
            </p>
  
            <p>
                <input type="submit" 
                    id="button" value="Login" />
            </p>
        </form>
    </div>
</body>
  
</html>

(c) Cree un archivo verificarLogin.php para validar la entrada del usuario – 

PHP

<?php
  
include 'dbconnection.php';
$userid = $_POST['userid'];
$password = $_POST['password'];
$sql = 
"SELECT * FROM users WHERE username = '$userid' AND password = '$password'";
$result = mysqli_query($db, $sql) or die(mysqli_error($db));
$num = mysqli_fetch_array($result);
      
if($num > 0) {
    echo "Login Success";
}
else {
    echo "Wrong User id or password";
}
?>

Paso 6: ahora pasaremos una contraseña envenenada para ingresar al perfil de usuario: 

Poisoned password = ' or 'a'='a

Entonces, como puede ver, la string envenenada mencionada anteriormente puede hacer que cualquier usuario inicie sesión en el nombre de usuario geeksforgeeks, por lo que esto se llama Inyección SQL.

Ahora, para evitar este tipo de inyección de SQL, debemos desinfectar la entrada de contraseña y la entrada de nombre de usuario usando la función mysqli_real_escape_string() .

La función mysqli_real_escape_string() toma los caracteres especiales como si fueran una entrada del usuario y no los considera como uso de consulta.

Entonces, el nuevo código para verificarLogin.php será: 

PHP

<?php
  
include 'dbconnection.php';
$userid = $_POST['userid'];
$password = $_POST['password'];
  
$sanitized_userid = 
    mysqli_real_escape_string($db, $userid);
      
$sanitized_password = 
    mysqli_real_escape_string($db, $password);
      
$sql = "SELECT * FROM users WHERE username = '" 
    . $sanitized_userid . "' AND password = '" 
    . $sanitized_password . "'";
      
$result = mysqli_query($db, $sql) 
    or die(mysqli_error($db));
      
$num = mysqli_fetch_array($result);
      
if($num > 0) {
    echo "Login Success";
}
else {
    echo "Wrong User id or password";
}
  
?>

Publicación traducida automáticamente

Artículo escrito por idevesh y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *