Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: PHP & MySQL: Rekisteröityminen

qwerty12302 [20.06.2015 14:56:51]

#

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?

dartvaneri [20.06.2015 15:14:14]

#

Sulla ei ole taulussa tuon nimistä saraketta. Tarkistappa että oot kirjoittanut oikein sarakkeen nimen.

Grez [20.06.2015 15:46:12]

#

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.

Eki++ [20.06.2015 19:17:10]

#

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.

The Alchemist [20.06.2015 20:41:27]

#

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.

HTML5 [20.06.2015 21:39:19]

#

Tämä lienee se mainittu koodivinkki: PHP: Salasanojen käsittely

Eki++ [20.06.2015 22:15:40]

#

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.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta