1

Gracias por entrar.
Quiero proteger mi conexion php de inyecciones sql, estuve intentando aplicar lo que dice en este post https://es.stackoverflow.com/questions/18232/c%C3%B3mo-evitar-la-inyecci%C3%B3n-sql-en-php pero como el ejemplo es distinto no logro comprender cómo aplicarlo en mi conexión.
Mi conexión es esta:

<?php
    $host_name = '***';
    $database = '**';
    $user_name = '***';
    $password = '***';
    $connect = mysqli_connect($host_name, $user_name, $password, $database);

    if (mysqli_connect_errno()) {
        die('<p>Failed to connect to MySQL: '.mysqli_connect_error().'</p>');
    } else {
        if(!$connect->set_charset("utf8")){
        printf("Error cargando el conjunto de caracteres utf8: %\n", $connect->error);
        exit();
    }
    $query = "SELECT * FROM informacion";
    $resultado = mysqli_query($connect,$query);
}
?>

Desde ya muchas gracias!

Gabriel Benitez
  • 115
  • 1
  • 2
  • 14
  • 5
    El trozo de código que expones no tiene inyección posible ya que no se están manejan datos externos que pudiesen provocar inyección. En cualquier caso te invito a revisar esta pregunta [¿Qué es la inyección SQL y cómo puedo evitarla?](https://es.stackoverflow.com/questions/10518/qu%c3%a9-es-la-inyecci%c3%b3n-sql-y-c%c3%b3mo-puedo-evitarla) – Xerif Jan 25 '18 at 09:34
  • Tiene alguna vulnerabilidad? – Gabriel Benitez Jan 25 '18 at 18:03
  • Los datos de conexión a tu base de datos están en la propia página. Si por cualquier motivo hay un fallo y se muestra el código, los datos de conexión quedarán expuestos. Deberías guardarse en un fichero no accesible (fuera del árbol de ficheros del servidor web) e incluirse en este fichero PHP. – Alvaro Montoro Jan 26 '18 at 03:50
  • Y no relacionado con la seguridad realmente: ¿algún motivo por el que mezclas MySQLi en estilo orientado a objetos y procedural? No es muy consistente y se hace raro leer el código. – Alvaro Montoro Jan 26 '18 at 03:57
  • Entiendo, si mezclo los estilos es porque sinceramente ni siquiera conozco las diferencias, no estudié ni nada y voy aprendiendo a medida que sea necesario para mi proyecto. Gracias por tu respuesta! – Gabriel Benitez Jan 26 '18 at 18:20

2 Answers2

1

No sé si has entendido correctamente que es la Inyección SQL, no está demás resumirte brevemente de que trata.

La Inyección SQL es como su nombre lo indica que mediante un input tipo texto te ingresen sentencias SQL que puedan afectar tu base de datos, un ejemplo claro, en un input solicitas el nombre de un artículo y allí escriben "DROP DATABASE" o "TRUNCATE TABLE"

$variable = "TRUNCATE tabla"; //lo que ingresó la persona
$sql = "UPDATE tabla SET campo1 = '$variable' where id = $id";//tu sentencia armada

Cómo en el post que referenciaste se indica que la conexión mysql (obsoleta) no es segura por que no ofrece la opción "bindparam" que las conexiónes PDO o MySqli si ofrecen.

El "bindparam" lo que hace es analizar las variables y evita la ejecución de sentencias SQL secundarias.

Para una conexión más segura se recomienda siempre después de abrir la conexión para la ejecución de alguna sentencia cerrar la conexión al terminar, acá un ejemplo

$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDB";

// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
} 

$sql = "SELECT id, firstname, lastname FROM MyGuests";
$result = $conn->query($sql);

if ($result->num_rows > 0) {
    // output data of each row
    while($row = $result->fetch_assoc()) {
        echo "id: " . $row["id"]. " - Name: " . $row["firstname"]. " " . $row["lastname"]. "<br>";
    }
} else {
    echo "0 results";
}
$conn->close(); //Cerrar conexión
Henry Parra
  • 157
  • 1
  • 13
  • Muchas gracias por la información, no me había quedado claro! Consideras que mi conexión tiene alguna vulnerabilidad? Solo estoy esperando a estar seguro para cargar la información, ya que esa base de datos comparte datos de otro servidor que son muy valiosos. – Gabriel Benitez Jan 26 '18 at 18:21
  • Desde que siempre cierres la conexión después de ejecutar las sentencias SQL, los riesgos son menores. Cómo estás haciendo la conexión es cómo la mayoría la usa y es muy segura. Si mi respuesta te sirvió por favor márcala como aceptada. – Henry Parra Jan 26 '18 at 19:09
  • Dejame cómo cerrar la conexión en tu comentario y lo marco como solución, muchas gracias por tus respuestas! – Gabriel Benitez Jan 27 '18 at 01:33
  • Al final de cada ejecución de sentencias SQL, debes colocar `$conn->close();` siendo $conn la variable donde almacenas la conexión, edito la respuesta para darte un ejemplo. – Henry Parra Jan 27 '18 at 14:16
0

Usa el método real_escape_string($variable) en todas tus variables que vayas a utilizar en las consultas a la BD.

Igual puedes checar en el manual PHP todo referente a ese método: http://php.net/manual/es/mysqli.real-escape-string.php