Tietokantayhteydet
Katsotaan seuraavaksi miten taustajärjestelmä yhdistetään tietokantaan jotta sovellus voi tallentaa, muokata, hakea ja poistaa tietoja.
Vanha, vaarallinen tapa
Ennen vanhaan oli tyypillistä että web-sovellukset juttelivat tietokannan kanssa raakoja SQL-kyselyitä rakentamalla, usein yhdistäen käyttäjän syötettä kyselyyn. Jos ajatellaan vaikkapa yksinkertaista tehtävälistasovellusta, niin koodi joka lisää uuden tehtävän voisi näyttää tältä:
1@app.route('/todos', methods=['POST'])
2def create_todo():
3 title = request.form['title']
4 result = connection.execute(f"INSERT INTO todos (title) VALUES ('{title}')")
5 todo_id = result.lastrowid
6 return '', 204
7Jos muistat HTML-pohjia käsittelevästä moduulista että tällainen vanhanaikainen malli HTML-rakennuksessa johti XSS-haavoittuvuuksiin, voit ehkä jo arvata minkälainen haavoittuvuus tästä tulee? Oikea vastaus on SQL-injektio. Jos käyttäjä syöttäisi title -muuttujassa heittomerkin, niin käyttäjähän voisi muuttaa SQL-kyselyn rakennetta mielensä mukaan.
SQL-injektioista voi oppia lisää Hakatemian SQL-injektiokurssilla, mutta katsotaan nyt oikea, moderni tapa käyttää tietokantaa web-sovelluksen taustajärjestelmästä.
Hakkeroinnin oppiminen alkaa tästä
Sadat interaktiiviset kurssit, virtuaalilabrat ja CTF-haasteet selaimessasi. Aloita ilmainen kokeilu ilman korttitietoja.