Prevenció d'atacs d'injecció de SQL en PHP

Aprendràs a protegir el teu lloc web contra atacs d'injecció de SQL en PHP. Descobreix com validar dades d'entrada, utilitzar consultes preparades, limitar permisos d'usuari i actualitzar el software.

Prevenció de la injecció de SQL en PHP: tècniques efectives

L'injecció de SQL és una tècnica utilitzada per ciberdelinqüents per accedir a dades confidencials en un lloc web. En aquest article, es descriuen algunes tècniques efectives per prevenir els atacs d'injecció de SQL en aplicacions PHP.

Com funciona un atac d'injecció de SQL?

Abans de parlar sobre les tècniques de prevenció de la injecció de SQL, és important entendre com funciona aquest tipus d'atac. En resum, els atacants insereixen codi SQL maliciós en una consulta SQL enviada a la base de dades, amb l'objectiu d'obtenir informació confidencial o fins i tot prendre el control del lloc web. Un cop que s'entén aquest procés, es poden aplicar mesures efectives per prevenir la injecció de SQL.

Validació de dades d'entrada

La validació de dades d'entrada és una de les tècniques més importants per prevenir la injecció de SQL. Validant totes les dades d'entrada, s'assegura que només s'acceptin dades del tipus i format esperats, la qual cosa redueix en gran mesura el risc d'injecció de SQL.

En PHP, es pot realitzar la validació de dades utilitzant funcions com filter_var() i preg_match(). Aquí hi ha un exemple:

$email = $_POST['email']; if (!filter_var($email, FILTER_VALIDATE_EMAIL)) { // Si el correu electrònic no és vàlid, es mostra un missatge d'error echo "El correu electrònic no és vàlid"; }

Ús de consultes preparades

Les consultes preparades són una tècnica efectiva per prevenir els atacs d'injecció de SQL en PHP. En lloc de concatenar les variables directament a la consulta SQL, s'utilitzen marcadors de posició que es reemplacen per valors segurs durant l'execució.

A continuació es presenten exemples de com utilitzar consultes preparades en diferents frameworks i en PHP pur:

Laravel

En Laravel, pots utilitzar l'objecte DB i el mètode select per realitzar consultes preparades. Aquí tens un exemple:

$usuaris = DB::select('SELECT * FROM usuaris WHERE usuari = ? AND contrasenya = ?', [$usuari, $contrasenya]);

CodeIgniter

En CodeIgniter, pots utilitzar l'objecte $this->db i el mètode query per executar consultes preparades. Aquí tens un exemple:

$query = $this->db->query('SELECT * FROM usuaris WHERE usuari = ? AND contrasenya = ?', array($usuari, $contrasenya));
$usuaris = $query->result();

PHP pur

En PHP pur, pots utilitzar l'extensió mysqli o PDO per crear consultes preparades. Aquí tens un exemple utilitzant mysqli:

$stmt = $mysqli->prepare('SELECT * FROM usuaris WHERE usuari = ? AND contrasenya = ?');
$stmt->bind_param('ss', $usuari, $contrasenya);
$stmt->execute();
$resultat = $stmt->get_result();
$usuaris = $resultat->fetch_all(MYSQLI_ASSOC);

Recorda que en utilitzar consultes preparades, els valors proporcionats es tracten com a dades i no com a part de la consulta SQL, la qual cosa ajuda a prevenir l'injecció de SQL assegurant que les dades s'insereixin de manera segura a la consulta.

Altres mesures de prevenció

A més de la validació de dades i les consultes preparades, hi ha diverses mesures addicionals que es poden prendre per prevenir la injecció de SQL en PHP:

  • Escapament dels caràcters especials: Els caràcters especials en les dades d'entrada s'han d'escapar abans de ser utilitzats en una consulta SQL. En PHP, es pot utilitzar la funció mysqli_real_escape_string() per escapar els caràcters especials.
  • Ús d'una capa d'abstracció de base de dades: Les capes d'abstracció de base de dades com Laravel o Doctrine poden ajudar a prevenir la injecció de SQL al proporcionar una interfície més segura per accedir a la base de dades.
  • Límit de permisos d'usuari: Limitar els permisos d'escriptura en la base de dades només a usuaris autoritzats.
  • Actualització i aplicació de parches: Mantenir tot el programari actualitzat i aplicar parches de seguretat per solucionar vulnerabilitats conegudes.

Exemple d'injecció en una consulta d'autenticació

En aquest exemple, es mostra una consulta d'autenticació on es verifica un nom d'usuari i una contrasenya introduïts per l'usuari. No obstant això, el codi és vulnerable a l'injecció SQL.

Si un atacant introdueix certs caràcters especials en el camp de contrasenya, pot manipular la consulta per eludir l'autenticació. Per exemple, si l'atacant introdueix `' OR '1'='1` en el camp de contrasenya, modificarà la consulta de la següent manera:

SELECT * FROM usuaris WHERE nom_usuari='[valor del camp de nom d'usuari]' AND contrasenya='' OR '1'='1'

Això farà que la condició `OR '1'='1'` sempre sigui certa, permetent a l'atacant eludir l'autenticació i accedir al compte d'un usuari legítim sense conèixer la seva contrasenya.

Exemple d'injecció en una consulta de supressió

En aquest exemple, es mostra una consulta de supressió que elimina un producte d'una base de dades basant-se en l'ID proporcionada. No obstant això, el codi és vulnerable a l'injecció SQL.

Si un atacant introdueix certs caràcters especials al paràmetre ID de l'URL, pot manipular la consulta per executar comandes SQL no desitjades. Per exemple, si l'atacant introdueix `1'; DROP TABLE usuaris;--` com a valor del paràmetre ID a l'URL, modificarà la consulta de la següent manera:

DELETE FROM productes WHERE id='1'; DROP TABLE usuaris;--'

Això eliminarà el producte amb ID 1 i després executarà una comanda SQL addicional per eliminar completament la taula d'usuaris.

Exemple d'injecció en una consulta d'obtenció d'informació

En aquest exemple, es mostra una consulta que obté productes d'una base de dades basant-se en la categoria proporcionada. No obstant això, el codi és vulnerable a l'injecció SQL.

Si un atacant introdueix certs caràcters especials al paràmetre de categoria de l'URL, pot manipular la consulta per obtenir informació no desitjada. Per exemple, si l'atacant introdueix `' OR 1=1--` com a valor del paràmetre de categoria a l'URL, modificarà la consulta de la següent manera:

SELECT * FROM productes WHERE categoria='' OR 1=1--'

Això farà que la condició OR 1=1 sempre sigui certa, retornant tots els productes de la base de dades, en lloc de només els de la categoria especificada.

Exemple d'injecció en una consulta d'actualització

En aquest exemple, es mostra una consulta d'actualització que modifica el preu d'un producte basant-se en l'ID proporcionada. No obstant això, el codi és vulnerable a l'injecció SQL.

Si un atacant introdueix certs caràcters especials al paràmetre ID de l'URL, pot manipular la consulta per realitzar canvis no desitjats a la base de dades. Per exemple, si l'atacant introdueix `1; UPDATE productes SET preu = 0 WHERE id = 1;--` com a valor del paràmetre ID a l'URL, modificarà la consulta de la següent manera:

UPDATE productes SET preu = 0 WHERE id = 1;--'

Això canviarà el preu del producte amb ID 1 a 0, independentment del valor originalment especificat.

  1. Què és la injecció de SQL?

    La injecció de SQL és una tècnica utilitzada per ciberdelinqüents per accedir a dades confidencials en un lloc web manipulant les consultes SQL.

  2. Per què és important prevenir la injecció de SQL?

    És crucial prevenir la injecció de SQL perquè pot comprometre la seguretat de les dades confidencials i permetre l'accés no autoritzat a un lloc web.

  3. Com funcionen els atacs d'injecció de SQL?

    Els atacants insereixen codi SQL maliciós en una consulta SQL enviada a la base de dades amb l'objectiu d'obtenir informació confidencial o prendre el control del lloc web.

  4. Quina és una tècnica efectiva per prevenir la injecció de SQL en PHP?

    L'ús de consultes preparades és una tècnica efectiva per prevenir la injecció de SQL. S'utilitzen marcadors de posició en lloc de concatenar variables directament a la consulta SQL.

  5. Com s'utilitzen les consultes preparades a Laravel?

    A Laravel, pots utilitzar l'objecte DB i el mètode select per realitzar consultes preparades. S'inclou un exemple de codi.

  6. Com s'utilitzen les consultes preparades a CodeIgniter?

    A CodeIgniter, pots utilitzar l'objecte $this->db i el mètode query per executar consultes preparades. S'inclou un exemple de codi.

  7. Com s'utilitzen les consultes preparades a PHP pur?

    A PHP pur, pots utilitzar l'extensió mysqli o PDO per crear consultes preparades. S'inclou un exemple utilitzant mysqli.

  8. Què és la validació de dades d'entrada i com ajuda a prevenir la injecció de SQL?

    La validació de dades d'entrada assegura que només s'acceptin dades del tipus i format esperats, la qual cosa redueix el risc d'injecció de SQL en filtrar i descartar dades malicioses.

  9. Quines altres mesures es poden prendre per prevenir la injecció de SQL en PHP?

    A més de les consultes preparades i la validació de dades, es poden aplicar mesures com escapar els caràcters especials, utilitzar una capa d'abstracció de base de dades, limitar permisos d'usuari i mantenir el programari actualitzat amb pactes de seguretat.

  10. Quines avantatges ofereixen les consultes preparades en comparació amb la concatenació de variables a les consultes SQL?

    Les consultes preparades ofereixen major seguretat en separar les dades de la consulta SQL, evitant així la possibilitat d'injecció de SQL. A més, ajuden a millorar el rendiment en permetre que la base de dades compili i reutilitzi consultes.