Aloitin PHP:n ja MySQL:n opettelun ja yritän nyt koodata yksinkertaista rekisteröitymissivua, jonne käyttäjä syöttää käyttäjänimen ja salasanan, minkä jälkeen ne tallennetaan tietokantaan, salasana tietysti MD5-muodossa. Koodi on seuraavanlainen:
<?php $nimi=$_POST["username"]; $pw=$_POST["password"]; $hash=md5($pw); try { $yhteys = new PDO("mysql:host=localhost;dbname=kayttajat", "kayttajanimi", "salasana"); } catch (PDOException $e) { die("VIRHE: " . $e->getMessage()); } $yhteys->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $yhteys->exec("SET NAMES latin1"); $kysely = $yhteys->prepare("INSERT INTO users (username, hash) VALUES ($nimi, $hash);"); $kysely->execute(); ?>
Se antaa kuitenkin seuraavanlaisen virheilmoituksen:
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42S22]: Column not found: 1054 Unknown column 'abcdefgh' in 'field list'' in C:\xampp\xxxx.php:21 Stack trace: #0 C:\xampp\xxxx.php(21): PDOStatement->execute() #1 {main} thrown in C:\xampp\xxxx.php on line 21.
Mitä mahtaa olla vialla?
Sulla ei ole taulussa tuon nimistä saraketta. Tarkistappa että oot kirjoittanut oikein sarakkeen nimen.
Ongelma on se, että käytät preparea väärin, eli tunget nuo arvot suoraan kyselylausekkeeseen. Noin tehden altistat kätevästi järjestelmäsi kaikenlaisille SQL-injektioille ja muille ikävyyksille.
Virheilmoitus tulee, kun käyttäjä on antanut käyttäjänimeksi tuon abcdefgh, ja nyt kun siihen ei tule edes ' -merkkejä ympärille, niin MySQL luulee että tarkoitetaan kenttää abcdefgh eikä merkkijonoa 'abcdefgh'. Oikea ratkaisu EI kuitenkaan ole lisätä ' -merkkejä noiden muuttujien ympärille vaan käyttää preparea oikein:
$kysely = $yhteys->prepare("INSERT INTO users (username, hash) VALUES (?,?);"); $kysely->execute(array($nimi, $hash));
Huomaa siis että Prepareen ei laiteta MITÄÄN käyttäjän syöttämiä arvoja suoraan, vaan ne annetaan parametreina tuossa execute -komennossa. Ne voidaan vaihtoehtoisesti laittaa preparen jälkeen ennen executea bindValuella.
qwerty12302 kirjoitti:
salasana tietysti MD5-muodossa
MD5 on suolaamattomana ihan lelu. Katso https://crackstation.net/.
Käytä PHP:n uusia salasanafunktioita jotka esitellään Metabolixin vinkissä tai vanhemmissa versioissa crypt-funktiota.
Pakko ihmetellä, että minkä oppaan pohjalta tämäkin on tehty, kun tässä toistetaan kaikki ne ohjelmointivirheet, mitkä ovat tyypillisiä 2000-luvun alkupuolen php-alkeille. Muistelin Putkassa ainakin olleen kirjoituksen salasanojen hashaamisesta php:llä, mutta sellaista ei opassarjasta löytynyt. Pdo:n käytöstä löytyy useampikin luku.
Tämä lienee se mainittu koodivinkki: PHP: Salasanojen käsittely
HTML5 kirjoitti:
Tämä lienee se mainittu koodivinkki: PHP: Salasanojen käsittely
Kyllä, juuri tuota tarkoitin.
The Alchemist kirjoitti:
Muistelin Putkassa ainakin olleen kirjoituksen salasanojen hashaamisesta php:llä, mutta sellaista ei opassarjasta löytynyt. Pdo:n käytöstä löytyy useampikin luku.
Arkistosta löytyi tämä. Se on tosin päivitetty viimeksi vuonna -07.
Aihe on jo aika vanha, joten et voi enää vastata siihen.