# Injecció SQL

Injecció SQL és un mètode d'infiltració de codi intrús que utilitza un error del programari present en una aplicació en el nivell de validació de les entrades per a poder fer consultes a una base de dades.
L'origen de la vulnerabilitat radica en la incorrecta comprovació i/o filtrat de les variables utilitzades en un programa que conté, o bé genera, codi SQL. És, de fet, un error d'una classe més general de vulnerabilitats que pot ocórrer en qualsevol llenguatge de programació o script que estigui incrustat dintre d'un altre.
Es coneix com a Injecció SQL al tipus de vulnerabilitat, al mètode d'infiltració, al fet d'incrustar codi SQL intrús a la porció de codi incrustat.

## Descripció

Es diu que existeix o s'ha produït una injecció SQL quan, d'alguna manera, s'insereix o "injecta" codi SQL invasor dins del codi SQL programat per a alterar el funcionament normal del programa i fer que s'executi la porció de codi "invasor" incrustat, en la base de dades.
Aquest tipus d'intrusió normalment és de caràcter maliciós, nociu o espia, per tant és un problema de seguretat informàtica, i ha de pensar pel programador de l'aplicació per a poder-lo prevenir. Un programa elaborat amb oblit, displicència o amb ignorància d'aquest procediment, pot resultar vulnerable, i la seguretat del sistema (base de dades) pot quedar eventualment compromesa. La intrusió té lloc durant l'execució del programa vulnerable, ja sigui, en computadores d'escriptori o bé en llocs Web, en aquest últim cas òbviament executant-se en el servidor que els conté.
La vulnerabilitat es pot produir automàticament quan un programa "arma descuidadament" una sentència SQL en temps d'execució, o bé durant la fase de desenvolupament, quan el programador explicita la sentència SQL a executar en forma desprotegida. En qualsevol cas, sempre que el programador necessiti i faci ús de paràmetres a ingressar per part de l'usuari, a efectes de consultar una base de dades, ja que, justament, dins dels paràmetres és on es pot incorporar el codi SQL intrús.
En executar-se la consulta en la base de dades, el codi SQL injectat també s'executarà i podria fer moltes coses, com inserir registres, modificar o eliminar dades, autoritzar accessos i, fins i tot, executar un altre tipus de codi maliciós a la computadora.
Per exemple, assumint que el següent codi està en una aplicació web i que existeix un paràmetre "nomUsuari" que conté el nom de l'usuari a consultar, una injecció SQL es podria provocar de la següent manera:
El codi SQL original i vulnerable és:
Si l'operador escriu un nom, per exemple "Alícia", res anormal passarà, l'aplicació generaria una sentència SQL similar a la següent, que és perfectament correcta, on se seleccionarien tots els registres amb el nom "Alícia" en la base de dades:
    SELECT * FROM usuaris WHERE nom = 'Alícia';
Però si un operador malintencionat escriu com nom d'usuari a consultar:
    "Alícia'; DROP TABLE usuaris; SELECT * FROM dades WHERE nom LIKE '%"
(sense les cometes), es generaria la següent consulta SQL, (el color verd és el que vol el programador, el blau és la dada, i el vermell, el codi SQL injectat):
En la base de dades s'executaria la consulta en l'ordre donat, se seleccionarien tots els registres amb el nom 'Alícia', s'esborraria la taula 'usuaris' i finalment se seleccionaria tota la taula "dades", que no hauria d'estar disponible per als usuaris web comuns. En resum, qualsevol dada de la base de dades pot ser tret disponible per a ser llegit o modificat per un usuari malintencionat.
Cal notar per què es diu "Injecció" SQL. Si s'observa el codi maliciós, de color vermell, es notarà que està inserit en mig del codi bo, el verd. Així, el codi vermell ha sigut "injectat" dins del verd. La injecció SQL és fàcil d'evitar, per part del programador, en la majoria dels llenguatges de programació que permeten desenvolupar aplicacions web. En la següent secció es tracten resumidament aquest tema.

## Algunes formes d'evitar la Injecció SQL
### Ruby on Rails

A l'entorn de treball Ruby on Rails (RoR), les consultes són verificades automàticament per qualsevol dels mètodes de cerca inclosos. Per exemple:
L'única forma que un usuari malintencionat pugui utilitzar una injecció de SQL en RoR és que mitjançant el codi es transformi la variable a tipus string i s'utilitzi com argument de la cerca directament. Per exemple:

### Perl

En llenguatge Perl DBI, el mètode DBI::quote filtra els caràcters especials (assumint que la variable $sql conté una referència a un objecte DBI):
O també es pot utilitzar la característica placeholder (amb cometes automàtiques) com aquest exemple:

### PHP

En el llenguatge PHP, hi ha diferents funcions que poden servir d'ajuda per a utilitzar amb diferents sistemes de gestió de bases de dades. Per a MySQL, la funció a utilitzar és mysqli_real_escape_string o mysql_real_escape_string. Amb l'extensió mysql es programaria el següent:
I amb l'extensió mysqli es programaria el següent:

### Java

En llenguatge Java, es pot utilitzar la classe PreparedStatement
En comptes de:
es pot utilitzar parametrització o escapament de variables, com s'indica en els següents apartats.

#### Escapament de les variables a inserir en la sentència SQL

Escapar el text contingut en la variable reemplaçant els caràcters especials en SQL pel seu equivalent textual, de tal forma que SQL interpreti tot el contingut de la variable com si fos text.
També es pot utilitzar el métode escapeSQL Arxivat 2010-10-31 a Wayback Machine. de la classe StringEscapeUtils Arxivat 2010-10-31 a Wayback Machine. procedent de la llibreria de Apache Commons Lang

### En C#

En el llenguatge C#, de la plataforma .NET (o la seva alternativa lliure Mono), té ADO.NET SqlCommand (per a Microsoft SQL Server) o OracleCommand (per a servidors de bases de dades Oracle). L'exemple següent mostra com prevenir els atacs d'injecció de codi utilitzant l'objecte SqlCommand. El codi per a ADO.NET es programa de manera similar, encara que pot variar lleument segons la implementació específica de cada proveïdor.
En comptes de:
es podria utilitzar lo següent:

## Vegeu també

* SqlMap

## Referències

* ↑ «Injecció de codi SQL» (en castellà). Juan Martínez Llinás, 21-04-2009. [Consulta: 20 maig 2012].
* ↑ «Injecció de codi SQL en MS SQL Server 2005» (en castellà). HackTimes, 16-01-2010. Arxivat de l'original el 30 d’octubre 2013. [Consulta: 20 maig 2012].
* ↑ «Què és la Injecció SQL?» (en anglès). Robert Auger. [Consulta: 20 maig 2012].
* ↑ «Atacs d'injecció SQL Estàs fora de perill?]» (en anglès). Mitchell Harper, 17-06-2002. [Consulta: 20 maig 2012].
* ↑ «Manual PHP: mysqli_real_escape_string» (en anglès). PHP, 06-09-2012. [Consulta: 7 setembre 2013].
* ↑ «Manual PHP: mysql_real_escape_string» (en anglès). PHP, 18-05-2012. [Consulta: 20 maig 2012].
* ↑ «Tècniques d'atac en servidors web amb scripts via injecció SQL» (en anglès). memonix@roses-labs.com, 26-01-2007. Arxivat de l'original el 16 d’abril 2012. [Consulta: 20 maig 2012].

## Enllaços externs

* Article "Atacs a servidors SQL: Hacking, Cracking, i Tècniques de protecció" escrit per Seth Fogie i Cyrus Peikari (en anglès)
* Article "Automatització de injecció SQL amb PANGOLIN Arxivat 2013-06-18 a Wayback Machine." Ús d'eines gràfiques per a fer tasques.
* Article "Automatització de injecció SQL amb SQLIHELPER Arxivat 2013-10-31 a Wayback Machine." Ús d'eines gràfiques per a fer tasques.