Elikkä, rupesin nyt yhtä omaa login-koodinkikkaretta muuntamaan niin, että siinä on samassa tiedostossa HTML-formi ja sitten PHP-koodilohko joka testaa lomakkeen tiedot.
Jostain syystä en saa lomaketta latautumaan uudestaan ja samalla ilmoittamaan virheilmoitusta, jos tiedot ovat väärin. Jos laitan väärät tunnukset tai muuten epäkelvot, niin latautuu vain tyhjä sivu. Jos tiedot ovat oikein, niin silloin kyllä latautuu seuraava vaihe.
Tässä on pelkistetty versio toiminnasta:
<?php include 'config.php'; // Määritetään MySQL-yhteyden asetukset include 'opendb.php'; //Avataan MySQL-yhteys mysql_select_db($dbname); $error = ""; if ($_POST['process'] == 1){ $login = $_POST['login']; $pass = $_POST['pass']; // Tarkistus, että käyttäjä on loggautunut omilla tunnuksillaan. $query = "SELECT * FROM kayttaja WHERE login = '$login' and pass = '$pass'"; $result = mysql_query($query) or die(mysql_error()); // Ajetaan haku $tuloksia = mysql_num_rows($result) or die(mysql_error()); include 'closedb.php'; // Suljetaan MySQL-yhteys // Jos $tuloksia löytyi, niin ohjataan seuraavaan vaiheeseen, muutoin takaisin loginiin virheilmoituksen kera. if ($tuloksia > 0){ header("location: edit.php"); } else{ $error = "Väärä käyttäjätunnus tai salasana."; echo $error; } } ?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN"> <HTML> <HEAD> <TITLE>Login</TITLE> </HEAD> <BODY> <h1>Login</h1> <?php if ($error != ""){ echo $error . "<br>"; } ?> <form action="login.php" method="post"> <table border="0"> <tr> <td><b>Käyttäjätunnus:</b></td> <td><input type="text" name="login" maxlength="10"></td> </tr> <tr> <td><b>Salasana:</b></td> <td><input type="password" name="pass" maxlength="10"></td> </tr> </table> <br> <input type="submit" value="Kirjaudu"><input type="reset" value="Tyhjennä"> <input type="hidden" name="process" value="1"> </form> </BODY> </HTML>
Jos nyt oikein ymmärsin kun nopeasti vilkuilin niin ota header("location: login.php"); pois ja laita tilalle vain echo $error;
Tyhjää tulee vieläki. :I
Lisäys:
Näyttää ikään kuin tuo toinen "else"-ehto jätettäisiin kokonaan testaamatta. Eikö se tuon $tuloksia -muuttujan arvo pitäisi olla 0 jos ei löydy mitään?
Miksiköhän muuten osoiterivissä lukee osoitteena vieläkin */login.php silloin kun tuosta pääsee oikeilla tunnuksilla */edit.php -sivulle? Eikö sen pitäisi vaihtua kun mennään headerilla toiselle sivulle.
Eihän tuota virhettä voida näyttää, koska skriptin suoritus lopetetetaan, jos tulosrivejä ei ole.
$tuloksia = mysql_num_rows($result) or die(mysql_error());
Vautsi, sehän toimii. :)
Tuo vaan kummastuttaa kun osoiterivin osoite ei muutu headerin osoitteeksi... Mikähän siinä voisi olla?
Lisäsin vähän tietoa menemään sinne osoitteeseen, eli se on tälläinen nykyään:
header("location: edit.php?login=$login&pass=$pass");
Älä lähetä urlin mukana moisia tietoja. Älä ainakaan salaamatta. Parempi että otat sessionit käyttöön.
Saako noita mitenkään muuten vietyä? Ennen lähettelin _$POST:lla, mutta kun tuo php-osio on nyt samassa tiedostossa html-osion kanssa, niin se ei sinne edit.php:lle päädy. :/
Tee käyttäjätarkistukset vaikka if ($tuloksia > 0) jälkeen ja ohjaa sitten käyttäjä itse sivuille, mikäli tunnus ja salasana täsmää.
Tietojen säilytykseen on kyllä sitten evästeet ja istunnot: https://www.ohjelmointiputka.net/oppaat/opas.
Kannattaa muistaa myös salasanan salaaminen vaikkapa md5:lla https://www.ohjelmointiputka.net/oppaat/opas.
Jop. Onko tuo sitten miten iso aukko tietoturvan kannalta ja mitenkä helppo sitä on hyväksikäyttää? Eihän tuossa kuitenkaan kukaan sivullinen tiedä millä tunnuksilla sinne kirjaudutaan (ellei sitten kerro kaverille), niin eihän sieltä mitään asiatonta silloin ulos saa.
No jos lähetät salasanan osoitteen mukana niin aukko on aika mieletön ;) . Salasanat on aina hyvä kryptata. Evästeitä ja istuntoja käyttäessä kannattaa muistaa että eväste eli cookie eli keksi on käyttäjän koneella oleva tiedonpalanen ja käyttäjän manipuloitavissa. Istunto eli session pyörii palvelinpuolella ja siinä on parempi säilöä sitten esim. kirjautumiseen liittyvää tietoa.
Tallenna käyttäjien salasanat tietokantaan hashaamalla ne ensin md5:lla md5($pass);
Käyttäjän kirjautuessa tarkistat sitten syötetyn salasanan hashia tietokannassa sijaitsevaan if (md5($_POST['pass']) == $tietokannasta_haettu_passu)
Joo, tuon hashin meinasin tunkea tähän myöhemmin kunhan saan systeemit rullaamaan.
Mutta siis noita käyttäjätunnuksia en oikein käsitä, että mikä siinä on kun eihän sitä missään näy, edes käyttäjän koneella. :o
Meinaatko tunnuksen lähettämistä vai? Kyllä sitä voi lykkiä osoitteessa jos mielii mutta helpompaa luoda sille esim. cookie.
Joo, tuossa kun vie headerissa tunnukset seuraavalle sivulle, niin sitä tarkotin, että onko siinä tietoturva-aukkoa.
Ei minulla kyllä mitään noita istuntoja ja cookieta vastaan oo. Ei vaan viitti ruveta tekemään jotain jos ei ymmärrä miksi sellainen pitäisi tehdä. :)
Kunhan et sitä salasanaa lyki osoitteen mukana. Selviäisi turhan helposti käyttäjän olan yli kurkkimalla ;)
Mieti järkevin ratkaisu tunnuksen viemiseen käyttötarpeesi mukaan. Jos esim tulostat etusivulle "Tervetuloa $user", on syytä tehdä tunnusta varten cookie. Muuten joudut viemään käyttäjätunnuksen sivustosi jokaisen linkin mukana aina uudestaan (olettaen että haluat tervehdyksen näkyvän jatkuvasti).
Selitys on sekavaa kuin edellisen paavin uudenvuodenpuheet, mutta toivottavasti sait selkoa.
Entäpä onko mahdollista tehdä ilman keksejä tämä login jos on pakko? Näytästi vähän siltä, että istuntoihin pitäisi olla aina keksejä kun selailin pikaisesti.
On toki mahdollista. Ratkaisuja on monia. Jäi epäselväksi vielä että mihin kaikkeen tarvitset $login ja $pass -muuttujia edit.php:ssä?
Kuten sanottu, mikäli tarkoituksena on vain suorittaa käyttäjän tarkistus, voit tehdä sen jo tuossa login-sivussa. Jos käyttäjä syöttää oikeat tiedot, hänet ohjataan vasta sitten headerilla eteenpäin. Muuten herjataan jotain rivoa punaisella fontilla.
Hoover kirjoitti:
Näytästi vähän siltä, että istuntoihin pitäisi olla aina keksejä kun selailin pikaisesti.
Ei tarvi. Jos keksit ei oo käytössä, PHP kuljettaa sessio-id:tä GET-parametrina osoterivillä. https://www.php.net/manual/en/ref.session.php#session.idpassing
Aihe on jo aika vanha, joten et voi enää vastata siihen.