SQL-injektiohyökkäysten torjunta
Estä injektiohyökkäykset
SQL-injektiohyökkäysten torjunta on ilmainen Cyber Security Academy-oppitunti CoddyKitissä. Tämä on oppitunti 1/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu Cyber Security Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Cyber Security Academy-kurssilla on yhteensä 4 oppituntia.
Mitä SQL-injektio on
SQL-injektio (SQLi) tapahtuu, kun käyttäjän epäluotettava syöte liitetään suoraan SQL-kyselyyn. Hyökkääjä ujuttaa SQL-syntaksia kenttään, jonka sovellus olettaa sisältävän pelkkää dataa, ja muuttaa näin kyselyn merkityksen.
Se on edelleen yksi haitallisimmista verkkosovellusten haavoittuvuuksista, koska sen avulla voidaan vuotaa kokonaisia tietokantoja, ohittaa kirjautumisia tai tuhota tietoja.
Haavoittuva kysely
Tyypillinen virhe on merkkijonojen yhdistäminen. Jos syöte on tom, kysely toimii oikein, mutta huolellisesti laadittu syöte muuttaa logiikkaa.
- Yksittäinen lainausmerkki sulkee merkkijonon liian aikaisin.
- Kaikesta sen jälkeisestä tulee suoritettavaa SQL:ää.
query = "SELECT * FROM users WHERE name = '" + userInput + "'";
// userInput = tom' OR '1'='1
// becomes: SELECT * FROM users WHERE name = 'tom' OR '1'='1'Todennuksen ohittaminen
Kirjautumislomakkeet ovat ensisijaisia kohteita. Lisäämällä aina toden ehdon ja kommentoimalla loput hyökkääjä kirjautuu sisään ilman salasanaa.
Jono -- kommentoi jäljellä olevan ehdon, joten salasanan tarkistus ohitetaan.
-- attacker enters in the username field:
admin' --
-- resulting query:
SELECT * FROM users WHERE user = 'admin' --' AND pass = '...'Parametrisoidut kyselyt
Ensisijainen suojauskeino on parametrisoidut kyselyt (valmistellut lauseet). SQL-rakenne lähetetään erillään datasta, joten syötettä käsitellään aina arvona, ei koskaan koodina.
Tietokanta-ajuri sitoo ?-paikkamerkit annettuihin arvoihin turvallisesti.
-- Python (sqlite3 / psycopg)
cur.execute(
'SELECT * FROM users WHERE name = ? AND pass = ?',
(username, password)
)Valmistellut lauseet Javassa
Kaikki merkittävät kielet tarjoavat parametrisoinnin. Käyttäkää Javassa PreparedStatement-luokkaa sen sijaan, että rakentaisitte merkkijonoja Statement-luokan avulla.
Sidotut parametrit eivät voi poistua omasta paikastaan, joten injektio on tässä rakenteellisesti mahdoton.
PreparedStatement ps = conn.prepareStatement(
"SELECT * FROM users WHERE name = ?");
ps.setString(1, userInput);
ResultSet rs = ps.executeQuery();Tallennetut proseduurit
Tallennetut proseduurit voivat auttaa, kun ne käyttävät sisäisesti parametroitua syötettä. Olkaa kuitenkin varovaisia: merkkijonojen yhdistämisellä dynaamista SQL:ää rakentava tallennettu proseduuri on yhtä haavoittuva.
- Turvallinen: proseduurille välitetään parametreja.
- Vaarallinen: yhdistetyistä merkkijonoista tehty
EXEC()-kutsu proseduurin sisällä.
Syötteen validointi ja sallittujen arvojen luettelot
Validointi on hyödyllinen toinen suojauskerros. Käyttäkää sallittujen arvojen luetteloita (hyväksykää vain tunnetut, kelvolliset muodot) estoluetteloiden sijaan (yrittäkää kieltää haitalliset merkit).
Esimerkiksi numeerisen tunnistekentän tulisi hylätä kaikki muu kuin numeroita sisältävä syöte ennen kuin se päätyy kyselyyn.
if not user_id.isdigit():
raise ValueError('invalid id')
# only then use the valueKoodaus on viimeinen keino
Lainausmerkkien manuaalinen koodaus on hauras ja altis virheille. Eri tietokannoilla on erilaiset koodaussäännöt, ja poikkeustapaukset, kuten koodauksen väärinkäyttö ja toisen vaiheen injektiot, voivat päästä läpi.
Suosikaa parametrisoituja kyselyjä. Käyttäkää koodausta vain, kun ORM tai ajuri ei pysty parametrisoimaan tiettyä tunnistetta.
Tietokantatilien vähimpien oikeuksien periaate
Rajoittakaa onnistuneen injektion aiheuttamia vahinkoja soveltamalla vähimpien oikeuksien periaatetta sovelluksen tietokantakäyttäjään.
- Myöntäkää tarvittaville tauluille vain oikeudet
SELECT,INSERTjaUPDATE. - Älkää koskaan käyttäkö sovelluksessa pääkäyttäjän/
root-tiliä. - Estäkää oikeudet
DROP,FILEja hallinnolliset oikeudet.
GRANT SELECT, INSERT, UPDATE ON appdb.orders TO 'webapp'@'%';
REVOKE DROP, ALTER ON appdb.* FROM 'webapp'@'%';ORM:t ja kyselyiden rakentajat
Nykyaikaiset ORM:t (Hibernate, Sequelize, Django ORM, SQLAlchemy) käyttävät oletusarvoisesti parametrisointia, mikä poistaa suurimman osan injektioriskistä.
Vaara palaa, kun kehittäjät siirtyvät käsittelemään raakaa SQL:ää tai käyttävät merkkijonojen interpolointia kyselyn rakentajassa. Välittäkää arvot aina sidottuina parametreina myös raakaa tilaa käytettäessä.
Kerroksittainen suojaus
Mikään yksittäinen suojauskeino ei riitä. Yhdistäkää useita kerroksia:
- Parametrisoidut kyselyt kaikkialla (ensisijainen keino).
- Syötteen validointi ja sallittujen arvojen luettelot.
- Vähimpien oikeuksien tietokantatilit.
- Verkkosovellusten palomuuri (WAF) tunnettujen mallien havaitsemiseen.
- Virheenkäsittely, joka ei koskaan paljasta SQL:ää tai pinolokia.
Pikatarkistus
Testatkaa, ymmärrättekö tärkeimmän suojauskeinon.
Kertaus
Opitte, miten SQL-injektio toimii ja miten se estetään:
- SQLi johtuu epäluotettavan syötteen yhdistämisestä kyselyihin.
- Parametrisoidut kyselyt ovat ensisijainen suojauskeino.
- Lisätkää sallittujen arvojen validointi, vähimpien oikeuksien tietokantatilit ja WAF.
- Välttäkää manuaalista koodausta ja dynaamista SQL:ää tallennettujen proseduurien sisällä.
Kerroksittainen suojaus estää yhtä virhettä muuttumasta tietoturvaloukkaukseksi.
Opi Cyber Security Academy tekoälytuutorin avulla — ilmaiseksi
Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.
- Kurssit
- 76
- Oppitunnit
- 303
Usein kysytyt kysymykset
Onko oppitunti ”SQL-injektiohyökkäysten torjunta” ilmainen?
Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Cyber Security Academy-oppimispolun 3 oppituntia, myös oppitunnin “SQL-injektiohyökkäysten torjunta”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Cyber Security Academy-kurssilla on yhteensä 4 oppituntia.
Mitä opin oppitunnilla ”SQL-injektiohyökkäysten torjunta”?
Estä injektiohyökkäykset Harjoittelet Cyber Security Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.
Tarvitsenko kokemusta aloittaakseni Cyber Security Academy-opiskelun?
Aiempi kokemus ei ole tarpeen. CoddyKitin Cyber Security Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 1/4.
Kuinka kauan ”SQL-injektiohyökkäysten torjunta”-oppitunnin suorittaminen kestää?
Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.
Voinko kirjoittaa ja suorittaa koodia tällä Cyber Security Academy-oppitunnilla?
Kyllä. Jokainen Cyber Security Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.
Kaikki tämän kurssin oppitunnit
- SQL-injektiohyökkäysten torjunta
- Käytönhallinta ja salaus
- Auditointi ja valvonta
- Varmuuskopioiden ja palautuksen suojaus