Ero sivun ”SQL-injektio” versioiden välillä
[katsottu versio] | [katsottu versio] |
Poistettu sisältö Lisätty sisältö
p Removing Link GA template (handled by wikidata) |
p Botti: Korvaa vanhentunut <source>-tagi ja "enclose"-parametri |
||
Rivi 5:
Klassinen esimerkki on seuraavan tyyppinen ohjelmakoodissa annettu komento (pseudokoodina):
<
execute("SELECT * FROM users WHERE user_name = '" + user_name + "';");
</syntaxhighlight>
Jos muuttujan <tt>user_name</tt> sisältö tulee suoraan käyttäjältä, voi käyttäjä antaa nimeksi <tt>"'; DROP TABLE users; --"</tt> jolloin seuraava käsky suoritetaan tietokantapalvelimella:
<
SELECT * FROM users WHERE user_name = ''; DROP TABLE users; --';
</syntaxhighlight>
Jälkimmäinen komento suoritetaan, vaikka ohjelmoijan tarkoitus oli sallia vain SELECT-lauseen suoritus.
Rivi 21:
Tästäkin huolimatta tilanne, jossa SQL-komento muodostetaan yhdistelemällä muuttujien arvoja, on riskialtis. Useimmissa tietokantarajapinnoissa voi käyttää parametreja:
<
prepare("SELECT * FROM users WHERE user_name = ?;");
set_parameter(1,user_name,STRING);
execute_prepared();
</syntaxhighlight>
Tällöin itse ohjelman ei tarvitse varmistua merkkijonon oikeellisuudesta, vaan tietokantarajapinta tekee tarvittavat toimenpiteet.
|