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.[1]

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.[2]

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.[3]

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:[4]

El codi SQL original i vulnerable és:

consulta := "SELECT * FROM usuaris WHERE nom = '" + nomUsuari + "';"

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):

SELECT * FROM usuaris WHERE nom = 'Alícia';
DROP TABLE usuaris;
SELECT * FROM dades WHERE nom LIKE '%';

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:

 Project.find(:all, :conditions => ["name = ?", params[:name]])
 # o bien
 Project.find(:all, :conditions => {:name => params[:name]})

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:

 # NO S'HAURIA DE FER AIXÒ
 Project.find(:all, :conditions => "name = '#{params[:name]}'")

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):

 $query = $sql->prepare 
 (
 "SELECT * FROM usuaris WHERE nom = " 
.
 $sql->quote($nom_usuari) 
);

O també es pot utilitzar la característica placeholder (amb cometes automàtiques) com aquest exemple:

 $query = $sql->prepare("SELECT * FROM usuaris WHERE nom = ?"); 
 $query->execute($nombre_usuari);

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[5] o mysql_real_escape_string.[6][7] Amb l'extensió mysql es programaria el següent:

 $query_result = mysql_query("SELECT * FROM usuaris WHERE nom = \"". mysql_real_escape_string($nom_usuari). "\"");

I amb l'extensió mysqli es programaria el següent:

 $con = mysqli_connect($host_db, $usuario_db, $clave_db,$nombre_db);
 $query_result = mysqli_query($con, "SELECT * FROM usuaris WHERE nom = \"". mysql_real_escape_string($con, $nom_usuari). "\"");

Java

En llenguatge Java, es pot utilitzar la classe PreparedStatement

En comptes de:

 Connection con = (acquire Connection) 
 Statement stmt = con.createStatement(); 
 ResultSet rset = stmt.executeQuery("SELECT * FROM usuaris WHERE nom = '" + nomUsuari + "';");

es pot utilitzar parametrització o escapament de variables, com s'indica en els següents apartats.

Parametrizació de sentències SQL

 Connection con = (acquire Connection) 
 PreparedStatement pstmt = con.prepareStatement("SELECT * FROM usuaris WHERE nom = ?"); 
 pstmt.setString(1, nomUsuari); 
 ResultSet rset = pstmt.executeQuery();

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.

 Connection con = (acquire Connection) 
 Statement stmt = con.createStatement(); 
 ResultSet rset = stmt.executeQuery("SELECT * FROM usuaris WHERE nom = '" + nomUsuari.replace("\\", "\\\\").replace("'", "\\'") + "';");

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

 Connection con = (acquire Connection) 
 Statement stmt = con.createStatement(); 
 ResultSet rset = stmt.executeQuery("SELECT * FROM usuaris WHERE nom = '" + StringEscapeUtils.escapeSQL(nomUsuari) + "';");

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:

 using(SqlConnection con = (acquire connection)) { 
 con. Open(); 
 using(SqlCommand cmd = new SqlCommand("SELECT * FROM usuaris WHERE nom = '" + nomUsuari + "'", con)) { 
 using(SqlDataReader rdr = cmd.ExecuteReader()){ 
 ...
 } 
 } 
 }

es podria utilitzar lo següent:

 using(SqlConnection con = (acquire connection)) { 
 con. Open(); 
 using(SqlCommand cmd = new SqlCommand("SELECT * FROM usuaris WHERE nom = @nomUsuari", con)) { 

 cmd.Parameters.AddWithValue("@nomUsuari", nomUsuari); 

 using(SqlDataReader rdr = cmd.ExecuteReader()){ 
 ...
 } 
 } 
 }

Vegeu també

Referències

  1. «Injecció de codi SQL» (en castellà). Juan Martínez Llinás, 21-04-2009. [Consulta: 20 maig 2012].
  2. «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].
  3. «Què és la Injecció SQL?» (en anglès). Robert Auger. [Consulta: 20 maig 2012].
  4. «Atacs d'injecció SQL Estàs fora de perill?]» (en anglès). Mitchell Harper, 17-06-2002. [Consulta: 20 maig 2012].
  5. «Manual PHP: mysqli_real_escape_string» (en anglès). PHP, 06-09-2012. [Consulta: 7 setembre 2013].
  6. «Manual PHP: mysql_real_escape_string» (en anglès). PHP, 18-05-2012. [Consulta: 20 maig 2012].
  7. «Tècniques d'atac en servidors web amb scripts via injecció SQL» (en anglès). [email protected], 26-01-2007. Arxivat de l'original el 16 d’abril 2012. [Consulta: 20 maig 2012].

Enllaços externs

Read other articles:

كأس جمهورية أيرلندا 2017 تفاصيل الموسم كأس جمهورية أيرلندا  النسخة 94  البلد جمهورية أيرلندا  التاريخ بداية:30 أبريل 2017  نهاية:5 نوفمبر 2017  المنظم اتحاد أيرلندا لكرة القدم  البطل نادي كورك سيتي  مباريات ملعوبة 40   عدد المشاركين 40   كأس جمهورية أيرلندا 2016...

 

 

Perangko gambar badut. Badut adalah seseorang yang merias yang memoles wajahnya dengan bedak tebal dengan pulasan berbagai warna mencolok. Badut biasanya berpakaian berwarna-warni dan mahir memperagakan berbagai ekspresi wajah lucu. Profesi badut sebenarnya cukup tua. Konon, sejak zaman Yunani Kuno dan Romawi Kuno. Mereka tak hanya membuat tertawa lewat pertunjukannya, tapi juga menghibur. Badut mencari nafkah di jalan-jalan atau yang dikenal dengan istilah ngamen. Kemampuan pantomim dengan g...

 

 

American theoretical physicist and string theorist (1954–2018) Joseph PolchinskiPolchinski in 2004Born(1954-05-16)May 16, 1954White Plains, New York, U.S.DiedFebruary 2, 2018(2018-02-02) (aged 63)Santa Barbara, California, U.S.Alma materCalifornia Institute of Technology (BS)University of California, Berkeley (PhD)Known forPolchinski equationPolchinski's paradoxD-branes[1]Black hole firewallEverett phoneAwardsDannie Heineman Prize (2007)Dirac Medal (2008)Breakthrough ...

New Zealand netball player Casey KopuaONZM Kopua in 2011Personal informationFull name Casey May Kopua (née Williams)Born (1985-06-19) 19 June 1985 (age 38)Hamilton, New ZealandHeight 1.88 m (6 ft 2 in)School Matamata CollegeUniversity University of WaikatoSpouse Terry KopuaMarried 1 December 2012Children 3Netball career Playing position(s): GK, GDYears Club team(s) Apps2003–2015, 2018–2019 Waikato Bay of Plenty Magic (Correct as of 30 July 2019)Years National tea...

 

 

رابح سعدان معلومات شخصية الاسم الكامل رابح سعدان الميلاد 3 مايو 1946 (العمر 77 سنة)باتنة الطول 1.75 م (5 قدم 9 بوصة) مركز اللعب مدافع الجنسية  الجزائر اللقب الشيخ مسيرة الشباب سنوات فريق مولودية باتنة المسيرة الاحترافية1 سنوات فريق مشاركات (أهداف) 1964–1968 مولودية باتنة 150 ...

 

 

Voce principale: Paris Saint-Germain Football Club. Paris Saint-Germain Football ClubStagione 2016-2017Sport calcio Squadra Paris Saint-Germain Allenatore Unai Emery All. in seconda Jean-Louis Gasset Presidente Nasser Al-Khelaïfi Ligue 12° (in Champions League) Coupe de FranceVincitore Coupe de la LigueVincitore Champions LeagueOttavi di finale Trophée des championsVincitore Maggiori presenzeCampionato: Lucas (37)Totale: Lucas (53) Miglior marcatoreCampionato: Cavani (35)Totale: Cava...

Ubuntu 23.10 Canonical publie une nouvelle version d’Ubuntu tous les six mois. Parallèlement, Ubuntu dispose d'une version bisannuelle dite LTS (long term support, « support à long terme ») considérée comme plus stable, avec un cycle de mise à jour de cinq ans. Ce calendrier prévisible suit le principe de publication à date fixe initiée par GNOME. Ubuntu sort ainsi un mois environ après chaque version de GNOME pour l'intégrer, de même qu'une nouvelle version de X.Org ...

 

 

Campionati europei di canottaggioSport canottaggio TipoNazionali ContinenteEuropa OrganizzatoreFederazione Internazionale Canottaggio TitoloCampione europeo Cadenzaannuale StoriaFondazione1893 Modifica dati su Wikidata · Manuale I campionati europei di canottaggio hanno una tradizione molto più antica rispetto ai campionati mondiali di canottaggio, infatti mentre questi ultimi si disputano solamente dal 1962, gli europei hanno invece visto la loro prima edizione nel 1893 al lago d'Orta...

 

 

Questa voce sull'argomento calciatori italiani è solo un abbozzo. Contribuisci a migliorarla secondo le convenzioni di Wikipedia. Segui i suggerimenti del progetto di riferimento. Filippo Dovichi Nazionalità  Italia Calcio Ruolo Portiere Carriera Squadre di club1 1914-1915 Lucca? (-?)1916-1920 Pisa? (-?)1920-1924 Lucchese32 (-17+) 1 I due numeri indicano le presenze e le reti segnate, per le sole partite di campionato.Il simbolo → indica un trasferimento in prest...

Peta menunjukkan lokasi Santo Tomas Data sensus penduduk di Santo Tomas Tahun Populasi Persentase 199529.628—200032.6952.14%200737.8662.05% Santo Tomas adalah munisipalitas yang terletak di provinsi Pampanga, Filipina. Pada tahun 2010, munisipalitas ini memiliki populasi sebesar 37.866 jiwa dan 7.573 rumah tangga. Pembagian wilayah Secara administratif Santo Tomas terbagi menjadi 7 barangay, yaitu: Moras De La Paz Poblacion San Bartolome San Matias San Vicente Santo Rosario (Pau) Sapa (Sant...

 

 

U.S. atomic bomb type used at Nagasaki, 1945 This article is about the World War II nuclear weapon. For other uses, see Fat Man (disambiguation). Fat Man Replica of the original Fat Man bombTypeNuclear fission gravity bombPlace of originUnited StatesProduction historyDesignerLos Alamos LaboratoryProduced1945–1949No. built120SpecificationsMass10,300 pounds (4,670 kg)Length128 inches (3.3 m)Diameter60 inches (1.5 m)FillingPlutoniumFilling weight6.4 kgBlast&#...

 

 

Berbagai jenis kari sayuran dari India. Murgh makhani (butter chicken). Kari ayam India Kari atau yang dikenal di Indonesia sebagai kare adalah berbagai jenis hidangan berkuah yang dimasak dengan rempah-rempah hingga mempunyai cita rasa tajam dan pedas. Kari berasal dari wilayah Asia Selatan, terutama di India, dan telah meluas ke seluruh negara di kawasan Asia Pasifik dan Eropa. Bumbu dan rempah-rempah yang digunakan untuk membuat kari sangat beragam dan tidak terbatas pada ketumbar, kunyit,...

Ordine PianoOrdine di Pio IXMedaglia di Cavaliere dell'Ordine Piano Santa SedeTipologiaOrdine statale MottoVirtuti et Merito Statusattivo CapoPapa Francesco IstituzioneRoma, 17 giugno 1847 Primo capoPio IX GradiCavaliere/Dama di CollareCavaliere/Dama di Gran CroceCommendatore/Dama di Commenda con PlaccaCommendatore/Dama di CommendaCavaliere/Dama PrecedenzaOrdine più altoOrdine dello Speron d'Oro Ordine più bassoOrdine Equestre Pontificio di San Gregorio Magno Nastro dell'ordine Modifica dat...

 

 

Agostino ValliniVikar Jenderal RomaPenunjukan27 Juni 2008PendahuluCamillo RuiniJabatan lainKardinal-Imam San Pier Damiani ai Monti di San PaoloImam Agung Basilika Agung Santo Yohanes LateranAnggota Dewan bagi EkonomiImamatTahbisan imam19 Juli 1964oleh Vittorio LongoTahbisan uskup13 Mei 1989oleh Michele GiordanoPelantikan kardinal24 Maret 2006oleh Benediktus XVIPeringkatKardinal-ImamInformasi pribadiLahir17 April 1940 (umur 84)Poli, Lazio, ItaliaKewarganegaraanItaliaDenominasiKa...

 

 

This article may require cleanup to meet Wikipedia's quality standards. The specific problem is: Need to move Chinese-language names to linked articles or create stubs. Please help improve this article if you can. (August 2018) (Learn how and when to remove this message) Location of Hubei province in China This is a list of township-level divisions of the province of Hubei, People's Republic of China (PRC). After province, prefecture, and county-level divisions, township-level divisions cons...

This article needs additional citations for verification. Please help improve this article by adding citations to reliable sources. Unsourced material may be challenged and removed.Find sources: Sans Souci Island – news · newspapers · books · scholar · JSTOR (July 2023) (Learn how and when to remove this message) 42°30′57″N 92°22′13″W / 42.51583°N 92.37028°W / 42.51583; -92.37028Sans Souci Island is an island in the ...

 

 

  「岛」重定向至此。关于其他用法,请见「岛 (消歧义)」。 島嶼或島(英語:island)是指於海洋、江河或湖泊中被水体圍繞,面积小于大陆的陆地区域[1]。世界上面积最大的岛屿是北美洲的格陵兰岛,面积更大的陸地則不再被視為島嶼,而叫做「大陸」。在狹小的地域集中2個或以上的島嶼,即成「島嶼群」,大規模的島嶼群稱作「群島」或「諸島」,列狀排�...

 

 

Species of mammal See also: Atlantic white-sided dolphin Pacific white-sided dolphin[1] Size compared to an average human Conservation status Least Concern  (IUCN 3.1)[2] CITES Appendix II (CITES)[3] Scientific classification Domain: Eukaryota Kingdom: Animalia Phylum: Chordata Class: Mammalia Order: Artiodactyla Infraorder: Cetacea Family: Delphinidae Genus: Lagenorhynchus Species: L. obliquidens Binomial name Lagenorhynchus obliquidens(Gill, 1865) ...

Demographics of FrancePopulation pyramid, 2021Population 68,373,433 (January 2024)[1]Birth rate 11.0 births/1,000 population (2020)[2]Death rate 10.0 deaths/1,000 population (2020)[2]Life expectancy 83.2 (2023) • male 80.0 • female 85.7Fertility rate 1.68 (2023)[3]Infant mortality rate 3.6 deaths/1,000 live births (2020)[4]Net migration rate 1.1 migrant(s)/1,000 population (2024 est.)Age structure0–14 years 16.96% (2024)1...

 

 

1972 film by Hajrudin Krvavac Valter brani SarajevoFilm posterDirected byHajrudin KrvavacWritten byĐorđe Lebović (main writer)Hajrudin KrvavacSavo PređoProduced byPetar SobajićStarringBata ŽivojinovićLjubiša SamardžićRade MarkovićCinematographyMiroljub DikosavljevićEdited byJelena BjenjašMusic byBojan AdamičProductioncompanyBosna FilmRelease date 12 April 1972 (1972-04-12) (Yugoslavia) Running time133 minutesCountryYugoslaviaLanguagesSerbo-CroatianGerman Walte...