Eli mikä mahtaa olla SQL Injection bug? Googlettamalla sain selville, että se liittyy lainausmerkkeihin kyselyssa, mutta mitäköhän se sitten varsinaisesti tekee?
Kyselen, kun yritän tässä opetella mysql:ää...
Oletetaan että käytössä on vanha php ja seuraavanlainen skripti:
<?php $kantaan = $_POST['viesti']; $result = mysql_query("INSERT INTO taulu SET viesti = '$kantaan'"); echo "kiitos"; ?>
Nyt kantaan tuodaan dataa suoraan post-muuttujasta ilman käsittelyä. Jos PHP:n asetuksissa on vielä magic_quotes_gpc = off, voidaan MySQL injection suorittaa lähettämällä viestinä "'; DROP DATABASE 'db" jolloin query kokonaisuudessaan näyttää seuraavalta:
INSERT INTO taulu SET viesti = ''; DROP DATABASE 'db'
Eli pai pai tietokanta. Tämä voidaan välttää käyttämällä tarpeeksi uutta php-versiota (estää puolipilkut queryissa) sekä escapettamalla data (addslashes, mysql_escape_string tmv.) jolloin query näyttääkin seuraavalta:
INSERT INTO taulu SET viesti = '\'; DROP DATABASE \'db'
Jolloin viesti-kenttään ilmestyy siis "\'; DROP DATABASE \'db" eikä vahinkoa pääse syntymään.
Tuon tietokannan droppaamisen voi myös estää tehokkaasti sillä ettei salli www-tunnuksen käsitellä tietokantaa muuten kuin select, insert ja update -käskyillä. Adminia varten voi sitten olla toiset tunnukset jolla on suurempia oikeuksia.
Eikös Microsoftin sivuja muuteltu tuota käyttäen?
Empäs tiedä... käväsin vaan kattomassa sitä häkkiä. Mutta kyllä varmaankin tuntien MS:n tietoturvan :P
Eikös drop sanan voi korvata jollain muulla... eipähän ole ainakaan mahdollista "tiputtaa" mitään..
jotenki tyyliin...
str_replace(" drop", " drob", $string);
(pitäs varmaan huomioida isot kirjaimetkin..)
Siinähän ei ole mitään järkeä. Entä jos joku haluaisi käyttää viestissään sanaa drop? Kyllä se on parempi escapettaa ja tulostusvaiheessa käyttää stripslashes-funkkaria poistamaan kenot.
leftover kirjoitti:
Siinähän ei ole mitään järkeä.
Totta. Eihän tossa mun esimerkissä mitään järkeä ollut, Mutta eikös esim. jos tietokantaan laitetaan matskua niin siltä sitten tulostusvaiheessa voida kääntää takaisin...
laitetaan vaikka korvaavaksi sanaksi sellainen mitä ei luulisi kenenkään kirjoittavan
str_replace(" drop", " gagattaagagattaa", $string);
no ei nyt enempää tästä aiheesta...
Aihe on jo aika vanha, joten et voi enää vastata siihen.