<?php # Hoitaa uloskirjautumisen. function kirjaudu_ulos($echotus="") { # Jos on kirjauduttu ulos, tuhotaan istunto ja palautetaan TRUE. Muutoin palautetaan FALSE ja tulostetaan $echotus (ts. uloskirjautumisnappula). if (isset($_POST['logout'])) { return 1; setcookie('overpower', "", time()-3600*24*30*24); } else { echo $echotus; return 0; } } # Hoitaa sisäänkirjautumisen. Palauttaa 1 tai 0 sekä jotain tekstiä. function kirjaudu_sisaan() { # Asetetaan $sisalla tilaksi false. $GLOBALS['sisalla'] = false; $keksiolemassa = false; # Haetaan tiedostosta tunnukset. $filu = file("C:\\Documents and Settings\\Anttoni\\Työpöytä\\Muut servujutut\\overpower\\tunnukset.txt"); # Taulukko valmista tunnustaulukkoa varten. $tunnukset = array(); # Muodostetaan taulukko. foreach ($filu as $tunnus) { list($kayttis, $pswd) = explode(":", trim($tunnus)); $tunnukset[$kayttis] = $pswd; } # Tarkistetaan tunnukset. Oikeat, niin tallennetaan tiedot istuntoon, väärät, niin virheilmoitus. if (isset($_POST['tunnus']) and isset($_POST['salasana']) or trim(strip_tags($_COOKIE['overpower'])) != "") { # Muodostetaan keksin muuttujat jos keksi on olemassa. if (trim(strip_tags($_COOKIE['overpower'])) != "") { list($keksiusr, $keksipswd) = explode(" - ", trim(strip_tags($_COOKIE['overpower']))); $keksiolemassa = true; } if (md5(strip_tags($_POST['salasana'])) == $tunnukset[strip_tags($_POST['tunnus'])]) { $GLOBALS['username'] = trim(strip_tags($_POST['tunnus'])); $username = $GLOBALS['username']; $usrpswd = trim(strip_tags($_POST['salasana'])); setcookie('overpower', $username."-".md5($usrpswd), time()+3600*24*30*24); # Jos istunnossa olevien tietojen mukaista kohtaa ei löydy, tulostetaan kirjautumislomake. # Jos löytyy, tulostetaan tervehdys sekä uloskirjautumiseen tarvittava lomake. if (md5($usrpswd) == $tunnukset[$username]) { return 1; } else { return 0; } } elseif ($keksiolemassa == true and $keksipswd == $tunnukset[$keksiusr]) { if ($keksipswd == $tunnukset[$keksiusr]) { return 1; $GLOBALS['username'] = $keksiusr; } else return 0; } else echo "<span class=\"kayttajaterve\">Tunnus tai salasana väärin</span>"; } } # Tämä hoitaa pääaasiassa kaiken viestinnän. function kirjautuminen() { # Jos ollaan kirjauduttu ulos, kutsutaan kirjaudu_sisaan() funktiota. if (kirjaudu_ulos()) { kirjaudu_sisaan(); } if (kirjaudu_sisaan() and kirjaudu_ulos() == 0) { echo "<span class=\"kayttajaterve\">Tervetuloa ".ucfirst($GLOBALS['username'])."</span><br />"; kirjaudu_ulos("<form method=\"post\"><input type=\"submit\" value=\"Kirjaudu ulos!\" name=\"logout\" class=\"submit\" /></form>"); } else { echo "<form method=\"post\" name=\"kirjautumislomake\"> <input type=\"text\" name=\"tunnus\" size=\"8\" value=\"Tunnus\" onClick=\"tyhjenna_lootat();\" class=\"textiloota\" /><br /> <input type=\"password\" name=\"salasana\" size=\"8\" value=\"Salasana\" onClick=\"tyhjenna_lootat();\" class=\"textiloota\" /><br /><br /> <input type=\"submit\" value=\"Kirjaudu\" class=\"submit\" /></form>"; } } ?>
Eli käytän tuollaista skriptiä sisään/uloskirjautumisessa. Kyllästyin käyttämään sessioita, mutta kyllä tuokin toimii.
Evästeistä tou ei kuitenkaan pysty kunnolla lukemaan kirjautumistietoja, eikä myöskään uloskirjautuessa poista evästettä, joten vaikka laittaisi väärän salasanan/käyttäjätunnuksen, tuohon tuolee teksti "Tervetuloa" ja uloskirjautumisnappi. Onnistuneessa sisäänkirjautumisessa pitäisi tulla "Tervetuloa nimi" ja uloskirjautumislomake, väärässä virheilmoitus.
Eli... Vaikka väärät tunnukset, tuo funktio kirjaudu_sisaan() palauttaa true, vaikka sen pitäisi silloin palauttaa false.
Cookien tuhoamisesta sen verran, että olen jostain lukenut, että keksit voi tuhota setcookie() funktiolla asettamalla identtiset arvot, paitsi expiredateksi esimerkiksi time()-10.
Tuota kun kokeilin ei siltikään toiminut :(
Mahtaako kukaan tietää missä vika, kun ei skripti osaa lukea keksin tietoja ja ei voi myöskään tuhota sitä?
Kentti kirjoitti:
Cookien tuhoamisesta sen verran, että olen jostain lukenut, että keksit voi tuhota setcookie() funktiolla asettamalla identtiset arvot, paitsi expiredateksi esimerkiksi time()-10.
Tuota kun kokeilin ei siltikään toiminut :(
Cookien tuhoaminen kannattaa tehdä asettamalla sille tyhjä arvo. Tuo on hieman kyseenalainen tuo time()-10, sillä jos selaajan kone on esimerkiksi vuoden etuajassa palvelimen konetta tuohoutuu keksi vasta vuoden päästä...
Eli setcookie("keksin_nimi")?
Antin oppaasta lainaus:
setcookie("auto", "", time() - 60 * 10);
En nyt muista oliko tuo aika vaillinnainen parametri, kyllä sekin sinne kannattaa aina kuitenkin laittaa (suurimmalla osalla sekin toiminee)
Parametreistä sen verran, että ainoastaan tuo nimi, eli ensimmäinen parametri on pakollinen.
PHP.net kirjoitti:
bool setcookie ( string name [, string value [, int expire [, string path [, string domain [, bool secure]]]]] )
Edit: Eipä keksi tuhoudu tyhjälläkään arvolla :/
Ei välttämättä tuhoudu, mutta ei sen ainakaan pitäisi enää toimia. Koitappa tuhota eväste selaimesta manuaalisesti ja kokeile uudestaan.
Edit. Enpä muuten katsonut tuota koodiasi yhtään. Nyt kun katsoin, en yhtään ihmettelisi jos vika olisi siinä, vähintäänkin hieman hämärällä logiikalla tuo toimii. Nyt ei kuitenkaan ole aikaa sitä tutkia.
ajv kirjoitti:
Nyt ei kuitenkaan ole aikaa sitä tutkia
Olisin kuitenkin kiitollinen, jos joskus muulloin vilkaisisit sitä, tuon kanssa on v*******u niin prkl paljon.. ARRRRGH!!!
manuska sanoo, että jos keksin arvoksi laitetaan false, se yritetään tuhota. Eli kokeile vaikka setcookie('overpower', "", time()-3600*24*30*24); -> setcookie('overpower', false, time()-3600*24*30*24);
Sinnikäs keksi taistelee vieläkin olemassaolostaan, sen arvo ei muutu, joten olisiko jossain muualla vikaa?
Hieman asiaan liittyvä kysymys, eli miten kannattaa tietokannasta uutta käyttäjätunnusta luodessa tarkistaa, onko tunnus/sähköpostiosoite jo ennestään käytössä? Tulee mieleen tehdä mysql haku ehtona käyttäjätunnus, mutta onko tuohon mitään järkevämpää tapaa? Ja jos sen tarkistaa ensin silleen ja sitten lisää, niin periaatteessahan jos samaa käyttäjätunnusta luodaan täysin samaan aikaan, molemmissa tarkistus palauttaa, ettei kyseistä tunnusta ole, mutta heti perään lisättäessä, jos ne lisätään samaan aikaan, tuleekin kaksi samaa tunnusta sitten?
Tee tunnuksesta ja sähköpostiosoitteesta uniikkeja kenttiä. Hakusanoilla mysql unique fields, sekä mysql:n manuskaa selaamalla voisi löytyä vinkkiä tähän, itse en tiedä tarkemmin sanoa.
Aihe on jo aika vanha, joten et voi enää vastata siihen.