https://www.ohjelmointiputka.net/koodivinkit/
eli sisäänkirjautuminen sessioneilla... muokkasin koodia niin, että se tekisi rekisteröitymisen ohessa tiedoston <käyttäjänimi>.dat, ja kirjoittaisi oletusarvot sinne. Tekee tiedoston ja kirjottelee ihan hyvin, mutta rekisteröityä käyttäjää ei löydy, kun kirjautuu sisään.
Miksi?
Koodi:
} elseif (isset($_POST["rekisteroidy"])) { if (in_array($tunnus, $userit) == $null) { if ($salasana == $salasana2) { if (strlen($tunnus) >= 3) { if (strlen($salasana) >= 3) { $fo = fopen($tiedosto, "a"); flock($fo, 2); fwrite($fo, $tunnus ."|". $email ."|". md5($salasana) ."|\n"); flock($fo, 3); fclose($fo); $crprof = "profiles/". $tunnus .".dat"; touch($crprof); $proc = fopen($crprof, "a"); flock($proc, 2); // etunimi, sukunimi, ikä, sukupuoli, email, osoiteet 1 ja 2, postnum, postpaik, kuvaus, kuvan url, kuvateksti, os-otsikko, os-tausta, os-teksti, os-linkki, os-vapaa html fwrite($proc, "Etunimi|Sukunimi|0|1|". $email ."|Nollakatu 0|Huone 0|00000|Helsinki|Ei kuvausta.|0.gif|Ei kuvatekstiä|Sivun otsikko|#FFFFFF|#000000|#0000FF|Minä täällä hei."); flock($proc, 3); fclose($proc); echo "<b>Rekisteröinti on valmis!</b><br>\n"; echo "Voit nyt kirjautua sisään <a href=\"". $tarkastus ."\">tästä</a>."; } else { echo "<b>Epäkelpo salasana.</b><br>\n"; echo "Voit rekisteröityä toisella salasanalla klikkaamalla <a href=\"". $tarkastus ."?act=rekisteroidy\">tästä</a>."; } } ...bloo bloo...
muuten on ihan sama koodi kuin itse vinkissä... anteeksi että taas häiritsen...
HALOO?! Saa vastata!
Arvaus: Muutit vain rekisteröintiä, et kirjautumista. Kirjautuminen yrittää hakea kaiken samasta paikasta kuin ennenkin, mutta rekisteröityminen tekee toisin.
eli miten sen voisi korjata?
Muuttamalla sitä kirjautumista(kin)? :)
...että se avaisi tuon failin <käyttäjä>.dat, ja jättäisi sen auki?
Hups oli siel muuallaki entry alustettu.
EDIT: Tällä kertaa oot sentäs jaksanu laittaa muutaki otsikoks ku pelkän "äh..."
hmm... userit.txt -tiedostoon sitä ei voi laittaa, koska silloin voisi kuka tahansa hakkeri mennä katsomaan salasanoja yms. mitä ei haluta näyttää...
EDIT: heh. mutta olipas se siellä kuitenkin!
EDIT 2: no, sitäpä tämä php on: äh, äh, ja äh!!! (...)
laita se kayttajat.txt jonnekin htaccessilla suojattuun kansioon ja chmodaa se oikein niin, että php pääsee sitä tutkimaan, mutta käyttäjät eivät. Ja laita tiedostopäätteeks .php ja laita ensimmäiseks riviks die("Eipäs h4xata");
joo, mut sepä ei ollukkaa se juttu jota hain, jos satuit unohtamaan...
kopsasin vain tuon edellä olevan kirjoitusfunktion ja lisäsin sinne ihanasti touchin, mutta ei vörki. :D
jaa-a.
EDIT:
JATKUU... (se koodi mihin se jäi.)
else { echo "<b>Epäkelpo tunnus \"<i>". $tunnus ."</i>\".</b><br>\n"; echo "Voit rekisteröityä toisella tunnuksella klikkaamalla <a href=\"". $tarkastus ."?act=rekisteroidy\">tästä</a>."; } } else { echo "<b>Salasanat eivät täsmää.</b><br>\n"; echo "Voit rekisteröityä uudelleen klikkaamalla <a href=\"". $tarkastus ."?act=rekisteroidy\">tästä</a>."; } } else { echo "<b>Tunnus \"<i>". $tunnus ."</i>\" on jo käytössä.</b><br>\n"; echo "Voit rekisteröityä toisella tunnuksella klikkaamalla <a href=\"". $tarkastus ."?act=rekisteroidy\">tästä</a>."; } } else { if ($_GET["act"] == "rekisteroidy") { echo "<form action=\"". $tarkastus ."\" method=\"post\">\n"; echo "<b>_rekisteröidy</b><br>\n"; echo "Jos sinulla on jo tunnus, <a href=\"". $tarkastus ."\">kirjaudu</a>.<br>\n"; echo "Tunnus: <input type=\"text\" name=\"tunnus\"><br>\n"; echo "E-mail: <input type=\"text\" name=\"email\"><br>\n"; echo "Salasana: <input type=\"password\" name=\"salasana\"><br>\n"; echo "Uudelleen: <input type=\"password\" name=\"salasana2\"><br>\n"; echo "<input type=\"submit\" value=\"Rekisteröidy\" name=\"rekisteroidy\">\n"; echo "</form>"; } else { echo "<form action=\"". $tarkastus ."\" method=\"post\">\n"; echo "<b>_kirjaudu_sisään</b><br><br>\n"; echo "Tunnus:<br><input type=\"text\" name=\"tunnus\"><br>\n"; echo "Salasana:<br><input type=\"password\" name=\"salasana\"><br>\n"; echo "<input type=\"submit\" value=\"Sisään\" name=\"kirjaudu\">\n"; echo "</form>"; } } } else { echo "<b>Kirjautunut.</b><br><br>\n"; echo "Hallinnoi käyttäjääsi <a href=\"". $etusivu ."\">täällä</a>.<br>"; echo "Voit halutessasi kirjautua ulos <a href=\"logout.php\">tästä</a>."; } ?>
...ja tässä itse alku...
<?php session_start(); $tiedosto = "userit.txt"; $tarkastus = "front.php"; $etusivu = "userfilu.php"; if(!file_exists($tiedosto)) { touch($tiedosto); chmod($tiedosto, "0766"); } $data = file($tiedosto); $userit = array(); for ($i=0; $i<count($data); $i++) { $entry = explode("|", $data[$i]); $userit[$i] = $entry[0]; } function clean ($string) { $string = str_replace("|", "", $string); $string = strip_tags($string); $string = ereg_replace("\n", "", $string); return strtolower($string); } if (empty($_SESSION["sess_tunnus"]) || $_SESSION["sess_iposoite"] != $_SERVER["REMOTE_ADDR"]) { $tunnus = clean($_POST["tunnus"]); $email = clean($_POST["email"]); $salasana = clean($_POST["salasana"]); $salasana2 = clean($_POST["salasana2"]); if (isset($_POST["kirjaudu"])) { if (in_array($tunnus, $userit) != "") { $entry = explode("|", $data[array_search($tunnus, $userit)]); if ($entry[2] == md5($salasana)) { session_register("sess_tunnus"); $_SESSION["sess_tunnus"] = $tunnus; session_register("sess_iposoite"); $_SESSION["sess_iposoite"] = $_SERVER["REMOTE_ADDR"]; // Tässä on sitten varmaan jotai skörbää... echo "<b>Kirjautunut.</b><br><br>\n"; echo "Hallinnoi käyttäjääsi <a href=\"". $etusivu ."\">täällä</a>.<br>"; echo "Voit halutessasi kirjautua ulos <a href=\"logout.php\">tästä</a>."; } else { echo "<b>Virheellinen salasana.</b><br>\n"; echo "Voit kirjautua uudelleen klikkaamalla <a href=\"". $tarkastus ."\">tästä</a>."; } } else { echo "<b>Tunnusta \"<i>". $tunnus ."</i>\" ei löydy.</b><br>\n"; // MITEN NIIN? echo "Voit kirjautua uudelleen klikkaamalla <a href=\"". $tarkastus ."\">tästä</a>."; } }
Tuo on kyllä hieman huonohko, sillä tuo käyttäjän etsintä on casesensitive. Tietysti ihan miten haluaa. En nyt jaksa kyllä tarkemmin tutkia, mutta voisin vinkkailla, että debuggaa, tulostele noita taulukoita ja katso eikö sitä tunnusta tosiaan löydy sieltä.
Salasanat olis hyvä kryptaa... md5($salasana)...
Onkos ne salasanat ees kryptattu? Koodi vaatii toimiakseen salasanojen kryptaamisen...
tunnus löytyy kyllä.
en ymmärrä. sitten taas käyttäjät joilla ei ole testin takia tätä profile .dat -tiedostoa, toimivat kuitenkin.
passyt on laitettu jotenkin md5:llä. enemmän teknisiä tietoja Tumpilta, hän tämän skriptin teki.
Tuolla on in_array($tunnus, $userit) != "".
in_array palauttaa booleanin eli kokeiles fixaa tota. Aika outoa sinänsä, sillä jos et ole kirjautumista vaihtanut mitenkään, etkä myöskään ole koskenut rekisteröitymisen userit.txt:hen kirjoittamis -osioon niin kyllä sen pitäisi toimia. Pistä jokaisen iffin jälkeen tulostamaan jotain ja katso missä ei enää tulosta mitään.
okei.
EDIT: kiinni! rivin
if (in_array($tunnus, $userit) != "") {
jälkeen ei mitään echojani!!!
...mutta miten tämän voi korjata?
Aihe on jo aika vanha, joten et voi enää vastata siihen.