Mikä on olennaisin ero näillä koodauksilla?
1)
$user_name = htmlspecialchars($_POST['user_name']);
2)
$user_name = mysqli_real_escape_string($mysqli,$_POST['user_name']);
3)
$user_name = mysqli_real_escape_string($mysqli,htmlspecialchars($_POST['user_name']));
4)
prepare("SELECT * FROM users WHERE user_name = ?;"); set_parameter(1,user_name,STRING); execute_prepared();
5)
if ($stmt = $con->prepare('SELECT password FROM users WHERE username = ?')) { $stmt->bind_param('s', $_POST['user_name']); $stmt->execute(); $stmt->store_result();
EDIT: lisätty case 5)
Mikä ihmeen "olennaisin ero"? Lue funktioiden kuvaukset php:n dokumentaatiosta, niin tiedät, mitä kyseiset funkkarit tekevät. Pienenä vinkkinä voin kertoa sen, että htmlspecialcharsia käytetään merkkijonon eskapointiin html:ään upotettavaksi ja mysqli_real_escape_stringtiä taasen samassa hengessä sql-kyselyiden kanssa. Näin myös funktioiden nimet hyvin pitkälti kertovat, joten asian ei pitäisi tulla yllätyksenä.
Josset ymmärrä, mitä funktiot tarkalleen ottaen tekevät (muuttavat), niin kokeilepa ajaa niitä (erikoismerkkejä sisältäville) merkkijonoille ja tulosta merkkijonot ennen ja jälkeen, niin eiköhän se ala selvetä.
Kohdat 4–5 käyttävät parametrisoituja kyselyitä, joka on vain luettavampi tapa kyselyiden rakentamiseen erottamalla parametrit eli muuttujat kyselyn rungosta.
The Alchemist kirjoitti:
Kohdat 4–5 käyttävät parametrisoituja kyselyitä, joka on vain luettavampi tapa kyselyiden rakentamiseen erottamalla parametrit eli muuttujat kyselyn rungosta.
Mielestäni parametrisoidut kyselyt eivät ole "vain luettavampi tapa" vaan sikäli ihan merkittävästi erilainen tapa, että siinä pidetään ohjelmakoodi ja data erillään, kun muissa tavoissa data tungetaan tavalla tai toisella SQL-ohjelmakoodin sekaan. Jos vielä käytetty tietokantapalvelin ja asiakaskirjasto tukee parametreja, niin SQL-injektio ei ole mahdollinen - ei edes vaikka clienttiohjelmassa tai tietokantakirjastossa olisi bugi.
Aihe on jo aika vanha, joten et voi enää vastata siihen.