Kansainvälisenä standardina tietokantakyselylauseena SQL-lauseita on käytetty laajasti erilaisissa ohjelmointiympäristöissä. Kypsänä ja vakaana järjestelmänä käyttäjän kirjautuminen ja salasanan varmistus ovat välttämättömiä. Päivittäisessä ohjelmointityössäni huomasin, että monet ohjelmoijat käyttävät SQL-lauseita vahvistaakseen käyttäjäsalasanoja tällaisella lauseella:
sql="Valitse * käyttäjätaulukosta, jossa nimi='"+nimi+"' ja password='"+password+"'"
Nimi ja salasana ovat käyttäjän syöttämät käyttäjätunnukset ja salasanat, ja yllä olevat lauseet suoritetaan varmistamaan, ovatko käyttäjä ja salasana päteviä. Analyysin kautta voidaan kuitenkin havaita, että yllä mainituissa väitteissä on kohtalokkaita porsaanreikiä. Kun syötämme seuraavan merkkijonon käyttäjänimeen: 111'or'1=1 ja syötämme salasanan rennosti, asetamme sen aaaa-arvoon. Kun muuttuja on vaihdettu, SQL-lause muuttuu seuraavaksi merkkijonoksi:
sql="Valitse * käyttäjätaulusta, jossa nimi='111'tai'1=1' ja salasana='aaaa'
Me kaikki tiedämme, että kun select-lause arvioi kyselyehdot, se jättää seuraavat ja (ja) operaatiot huomiotta kohdatessaan tai (tai) operaatioita, ja yllä olevan lauseen arvo 1=1 on aina tosi, mikä tarkoittaa, että riippumatta siitä, mitä arvoa salasanaan syötetään, se voi läpäistä yllä olevan salasanan varmennuksen! Ratkaisu tähän ongelmaan on hyvin yksinkertainen, ja menetelmiä on monia; yleisin on arvioida käyttäjän ja syötetyn salasanan laillisuus ennen varmistusta, eikä erityismerkkejä kuten yksittäisiä lainausmerkkejä ja yhtäsuuria merkkejä ole sallittuja.
Edellä mainitut ongelmat, vaikka ne saattavat vaikuttaa yksinkertaisilta, ovat olemassa. Esimerkiksi kuuluisan verkkopelin "Smiling Proud Jianghu" varhaisessa versiossa internetissä oli tällainen ongelma, ja kirjoittaja analysoi huolellisesti joitakin aiemmin kirjoittamiaan ohjelmia luettuaan haavoittuvuusraportin tästä pelistä, ja tällaisia porsaanreikiä oli monia. Tämän pitäisi todella kiinnittää huomiomme. Tämä paljastaa myös nuorten ohjelmoijien, mukaan lukien kirjoittajan, ohjelmointikokemuksen ja turvallisuustietoisuuden puutteen. Samaan aikaan se muistuttaa meitä siitä, että ohjelmoijien tulisi ottaa ohjelman turvallisuus täysin huomioon ohjelmaa suunnitellessaan, eikä heidän tulisi olla huolimattomia, ja näennäisesti pieni puute voi aiheuttaa vakavia seurauksia.
|