Terve
Sen tiedän, että jos tiedot annetaan kyselyyn execute-funktiolle arrayna, ne suodatetaan eikä SQL-injektioon ole mahdollisuutta. Mutta mitä jos jostain syystä tekeekin näin?
$kysely = $yhteys->prepare("CREATE DATABASE IF NOT EXISTS {$tietokanta}"); $kysely->execute();
Tarkistetaanko nytkin $tietokanta-muuttuja SQL-injektion varalta? Mitä eroa on, jos arvot annetaan jo prepare-funktiolla executen sijaan?
Ei tietenkään tarkisteta*, eihän PDO tuossa tilanteessa näe mitään muuttujaa vaan vain valmiin kyselyn. Jos tuollaiseen tapaan olisi mahdollista liittää automaattinen heittomerkkimagia, tuskinpa SQL-injektio-ongelmia näin paljon olisikaan.
*) Tietoja ei muutenkaan tarkisteta, vaan ne käsitellään turvalliseen muotoon. Tarkistaminen tarkoittaisi sitä, että tutkittaisiin syötteen sisältöä ja tuotettaisiin virheilmoitus, jos sisältö vaikuttaa vaaralliselta.
Sinänsä en keksi yhtään järkevää syytä, miksi käyttäjän syötettä edes pitäisi päästää CREATE DATABASE -lauseeseen, joten kysymyksesi lienee täysin hypoteettinen.
Metabolix kirjoitti:
Tarkistaminen tarkoittaisi sitä, että tutkittaisiin syötteen sisältöä ja tuotettaisiin virheilmoitus, jos sisältö vaikuttaa vaaralliselta.
Joka olisi muutenkin väärä lähtökohta. SQL-injektioiden sun muiden vaarojen torjumiseen käytetään käsittelyä ja tarkistamista käytetään tiedojen oikeamuotoisuuden yms. varmistamiseen sekä mahdollisesti eri käyttäjille näytettävän ja syötettävissä oelvan tiedon rajaamiseen.
Mutta lause kumminkin käsitellään SQL-injektion varalta, vai ei?
Ei. Kuten sanoin, PDO ei tuossa näe mitään muuttujia eikä siis voi mistään tietää, mitkä osat lauseesta ovat siinä tarkoituksella ja mitkä vahingossa.
Selvä.
Aihe on jo aika vanha, joten et voi enää vastata siihen.