Olen (monta kertaa) kokeillut tehdä oman loginskriptin PHP:llä, huonoin tuloksin. Istuntoja ja keksejä ja niin edelleen olen kokeillut.
Tuo pitäisi saada toimimaan tekstitietokannalla, ja käyttäjämäärät tuskin aivan hirveät tulisi olemaan.
Perus .htacces kyllä onnistuu helposti, mutta jostain syystä en saa lomakepohjaista toimimaan...
Voisiko joku ohjata oikeaan suuntaan?
Kysymyksesi on hieman laaja, että...
Tiedot voit tallentaa teksti tiedostoon, joka on vaikka omassa hakemistossa ja suojattu .htacces:lla. Muoto voisi olla: tunnus::|::vähintään md5 cryptattu passu
Tuohon voit laittaa erinäisiä asioita aina ::|:: merkillä erotettuna ja rekkaamisessa voit vielä tarkistaa ettei tunnus tai passu sisällä tätä ::|:: merkkiä.
ja tiedosto, jossa käyttäjien tiedot on, on nimetty joksikin muuksi, kuin kayttajat.txt.
Juu... siis ei noissa kohdissa ole mitään ongelmaa, vaan siinä itse php-skriptissä.. Sitä en ole saanut toimimaan.
Kentti kirjoitti:
Perus .htacces kyllä onnistuu helposti
Tuolla taas tarkoitin, että sellainen suojaus, jossa tulee se please authenticate (tjs) ikkuna onnistuu (headereja käyttäen)
Mutta ei esim. sellainen kuin putkassa.
Md5 ei ole kryptausalgoritmi, vaan kryptografinen tiivistealgoritmi - sillä lasketaan tiiviste datasta. Näitä kirjautumisskriptejä löytyy Internetistä, jopa Putkastakin, valmiina enemmän kuin etsiä jaksaa.
Putkastakin olen sita "kirjautuminen sessioilla" juttua kokeillut. Se toimi, kun kaikki oli siinä kiinteästi arrayssa, mutta heti kun tekstitiedostosta arrayhyn haki, niin ei..
Kuulostaa siltä, että itse arkkitehtuurissa ei ole vikaa, vaan toteutuksessa. Pistätkö vaikka vähän koodia esille, niin voidaan katsoa missä mättää.
<?php function kirjaudu() { # Aloita istunto. session_start(); # Muuttujia... $kayttis = strip_tags($_POST['tunnus']); $pswd = strip_tags($_POST['salasana']); $pswd = sha1($pswd); # Jos käyttäjätunnus ja salasana on asetettu. strip_tags()-funktion kanssa ei voi käyttää isset():iä, sillä jonkin arvon tuo tuohon asettaa... if ($kayttis != "" and $pswd != "") { # Haetaan tunnukset ja salasanat taulukkoon. $auth_filu = file_get_contents("autentikaatio.auth"); $auth_taulukko = explode("\n", $auth_filu); foreach ($auth_taulukko as $rivi) { # Haetaan tiedostosta muuttujat $kayttajatunnus ja $salasana. list($kayttajatunnus, $salasana) = explode("|", $rivi); # Jos käyttäjätunnus ja salasana täsmäävät... if (strcmp($kayttis, $kayttajatunnus) == 0 and strcmd($pswd, $salasana)) { $_SESSION['kayttis'] == $kayttis; $_SESSION['pswd'] == $pswd; break; } else { echo "Väärät kirjautumistiedot"; continue; } } } if ($_SESSION['kayttis'] == $kayttis and $_SESSION['pswd'] == $pswd) { echo "Sisällä ".$_SESSION['kayttis']."<a href=\"".$_SERVER['PHP_SELF']."?log=out\">Kirjaudu ulos</a>"; } else { echo "Käyttäjätunnus tai salasana väärin"; echo "<form method=\"post\">"; echo "<input type=\"text\" name=\"tunnus\">"; echo "<input type=\"password\" name=\"salasana\">"; echo "<input type=\"submit\" value=\"Lähetä!\">"; } } kirjaudu(); ?>
Tuossa voi olla mukana vähän muutakin säätöä, mutta sama koodi se on millä olen tiedostostakin hakua kokeillut...
Ja salasanatiedostossa on kryptaamattomat salasanat, näin testiä varten..
== -> = (sijoituksessa), echo "\"" -> echo '"', $_SERVER['PHP_SELF'] -> $_SERVER['SCRIPT_NAME'], == -> === (vertailussa), echo "." -> echo " . " (välit selkeyttävät koodia), file_get_contents+explode = file (muista trimmaus jos teet tämän muutoksen). Myös sha1 on tiivistealgoritmi, ei kryptausalgoritmi.
En saanut kyllä vieläkään toimimaan :(
Tuossa missä tarkistetaan noita tietoja on pari yhtäsuuruusmerkkiä liikaa. Korjaa ne muotoon:
# Jos käyttäjätunnus ja salasana täsmäävät... if (strcmp($kayttis, $kayttajatunnus) == 0 and strcmd($pswd, $salasana)) { $_SESSION['kayttis'] = $kayttis; $_SESSION['pswd'] = $pswd; break; }
Ja jos oikein luin tota koodia niin tuo missä tarkistetaan ollaanko sisällä toimii vain sen yhden sivunlatauksen verran. Tämä siitä syystä että muuttujiin $kayttis ja $pswd ei haeta muuten mitään ellei lomakkeelta ole tullut noita tietoja. Kannattaisi muuttaa tuota niin että ensin avataan se tiedosto, sitten tarkistetaan että ollaanko sisällä, jos ei olla niin näytetään kirjautumisformi ja jos ollaan sisällä niin kerrotaan että ollaan sisällä.
No niin.. Nyt kopioin suoraan koodivinkin Kirjautuminen sessioilla (monta käyttäjää) ja tein siihen sen muutoksen, että se hakee ne käyttäjätunnukset & salasanat tiedostosta.
<?php //Sessiot käyntiin session_start(); //Tunnukset ja salasanat(md5) taulukkoon $filu=file("tunnukset.txt"); trim($filu); $n = 0; $kayttikset=array(); $salasanat=array(); foreach ($filu as $tunnus) { list($kayttis, $pswd) = explode(":", $tunnus); $kayttikset[$n]=$kayttis; $salasanat[$n]=$pswd; $n++; } $tunnukset = array_combine($kayttikset, $salasanat); //Lomakkeen käsittely. Tarkistetaan löytyykö taulukosta vastaavaa kohtaa. Tarvittaessa tulostetaan virheilmoitus. //Jos löytyi, tallennetaan kirjautumisen tiedot sessioihin. if(isset($_POST['tunnus'])&&isset($_POST['salasana'])){ if(md5($_POST['salasana'])==$tunnukset[$_POST['tunnus']]){ $_SESSION["tunnus"]=$_POST['tunnus']; $_SESSION["salasana"]=$_POST['salasana']; } else echo"Tunnus tai salasana väärin"; } //Jos sessioissa olevien tietojen mukaista kohtaa ei löydy taulukosta, tulostetaan kirjautumislomake. if(md5($_SESSION['salasana'])!=$tunnukset[$_SESSION['tunnus']]){ echo"<form action=\"".$_SERVER['PHP_SELF']."\" method=\"post\"> Tunnus: <input type=\"text\" name=\"tunnus\" /><br /> Salasana: <input type=\"password\" name=\"salasana\" /><br /> <input type=\"submit\" value=\"Kirjaudu\" /></form>"; } //Muuten muuten tulostetaan tervehdys ja uloskirjautumiseen tarvittava linkki. else { echo"Kirjautuminen onnistui. Tervetuloa ".$_SESSION["tunnus"]."<br /> <form method=\"post\"><input type=\"submit\" value=\"Kirjaudu ulos!\" name=\"logout\" /></form>"; //Uloskirjautuminen. Poistetaan sessiot ja näytetään onnistumisviesti. if(isset($_POST['logout'])){ unset($_SESSION["tunnus"]); unset($_SESSION["salasana"]); echo"Kirjautuminen ulos onnistui."; } } ?>
Tuo ei siis toimi... Tuo kohta, jossa se haetaan tiedostosta ja tehdään taulukoksi, muodostaa samanlaisen taulukon kuin tämä:
<?php $tunnukset=array( "tunnus1" => "8efd6b1b8a4266d19101ebf5a346a42c", //tunnus1 , passu "tunnus2" => "6b694e8cf87fc88d392ed8ebf81d9385", //tunnus2 , sala "ja_niin" => "edelleen", //ja_niin , ???????? ); ?>
mutta ainoastaan tuollainen, kiinteästi sijoitettu taulukko toimii, ei se minun yritelmä, joka tulostaa vastaavan taulukon..
Mikä siinä minun säädössä tuohon on vikana kun se ei toimi
Kokeilepa tiedostonlukua näin:
$filu = file("tunnukset.txt"); $tunnukset = array(); foreach ($filu as $tunnus) { list($kayttis, $pswd) = explode(":", trim($tunnus)); $tunnukset[$kayttis] = $pswd; }
En ole aivan varma, mutta käsittääkseni trim ei tepsi taulukkoon. ^^
P*****E!!!!
Tuon trimmin takia 3 kuukautta pähkäillyt tuota!!!
(Noh.. En ihan koko aikaa, mutta kumminkin..)
ARRGH!!!!
Mutta nyt toimii :)
Aihe on jo aika vanha, joten et voi enää vastata siihen.