Hei!
Kokeilin nyt kerrankin tuota PDO:ta ja naputtelin testiversion vieraskirjasta!
Tähän asti kuvittelin, että esim :
public function message($conn){ try{ $q = $conn->prepare("SELECT message_number, message, persons, answers FROM messages ORDER BY message_number DESC"); $q->execute(); }catch(PDOException $e){ die("ERROR: " . $e->getMessage()); } while($r = $q->fetch()){ $id = $r['message_number']; $message = $r['message']; }
Edellämainittu pätkä huolehtii seuraavat asiat :
Tiedon tallentamisessa tiedon escapettamisen ( mysql_real_escape_string)
Tiedon tulostamisessa
1. htmlspecialcharssin, intvallin jne.. mutta näin ei testaukseni myötä ilmeisesti ole? Eli vaikuttaako PDO vain tiedon tallentamiseen kantaan vai onko siitä apua myös tiedon hakemisessa?
PDO ei tee yhtään mitään. Se on vain rajapinta tietokantaan. Se syöttää ja palauttaa kaikki tiedot juuri sellaisina, kuin sinä tai tietokanta ne sille antaa. PDO ei escapeta mitään kumpaankaan suuntaan.
Prepared statements on tietokantatason ominaisuus, joka erottaa varsinaisen kyselyn ja sen parametrit toisistaan. Tällöin SQL-injektioista ei ole vaaraa, kun parametrin arvo ei vaikuta kyselyn tulkitsemiseen.
Esimerkissäsi on siis turha käyttää prepared statementiä, koska kyselyllä ei ole parametreja. Säästät koodissa, kun käytät suoraan funktiota PDO::query() eli syötät ja suoritat kyselyn samalla kutsulla.
Ymmärtänet myös, että query():ä käyttäessä injektion vaara on olemassa ihan normaalisti.
Kuinka tiedon escapettaminen tapahtuu!
Kokeilin seuraavaa tapaa, mutta näin tieto kulki kantaan tyhjänä.
Korvattuani muuttujat $message ja $persons pelkillä post arvoilla kylelyyn tallennus tapahtuu oikein. Muuttujia se ei näyttäisi hyväksyvän. Miten allaoleva esimerkki tulisi kirjoittaa oikeaoppisesti.
$message = mysql_real_escape_string($_POST['message']); $persons = mysql_real_escape_string($_POST['persons']); if($_COOKIE["check"] == $_POST["c"]) { try{ $q = $conn->prepare("INSERT INTO messages (message, persons) VALUES (?,?)"); $q->execute(array($message,persons)); }catch(PDOException $e){ die("ERROR: " . $e->getMessage()); }
Jos The Alchemistin selitys lausekkeista meni ohi, voit ajatella, että PDO:n execute-funktio "huolehtii escapetuksesta". Tulosten muuttamisessa HTML-muotoon sen sijaan ei olisi järkeä, koska dataa pitää usein käsitellä PHP-puolellakin ja turhasta muunnoksesta olisi silloin haittaa.
Ja kyllähän parametrien escapetus on yhtä lailla (tai jopa enemmän) tarpeen myös tiedon hakemisessa, kun kyselyyn lisätään ehtoja. Muuten hakkeri voisi kysellä tietokannasta vaikka käyttäjien salasanoja.
manninen kirjoitti:
Kuinka tiedon escapettaminen tapahtuu!
Escapettamista ei tarvitse prepared statementsien kanssa, juurihan me niin totesimme.
Juuri näin totesimme! Sori, luin ajatuksen kanssa läpi ja tajusin!! Hienoa! Kiitos teille!
Aihe on jo aika vanha, joten et voi enää vastata siihen.