Eli käytän sivulla seuraavaa scriptiä
<?php $salasana = "10fd1a79685e9bb8cfa46a67d48d69ac"; // Sisään kirjautuminen if($_POST['log'] == "in"){ // Muutetaan salasana md5 muotoon $salasana = md5($_POST['salasana']); // Asetetaan cookie (keksi) setcookie("passu", $salasana, time()+60*60); header("location: $PHP_SELF"); //yhteys $query = "SELECT * FROM testi"; $result = mysql_query($query, $yhteys) or die (mysql_error()); $query = "UPDATE testi SET edellinen = now() WHERE ID = '$ID'"; $result = mysql_query($query, $yhteys) or die (mysql_error()); mysql_close($yhteys); //yhteys $query = "SELECT kertoja FROM testi"; $result = mysql_query($query, $yhteys) or die (mysql_error()); $query = "UPDATE testi SET kertoja=kertoja+1 WHERE ID = '$ID'"; $result = mysql_query($query, $yhteys) or die (mysql_error()); mysql_close($yhteys); } // Ulos kirjautuminen if($_POST['log'] == "out"){ // Poistetaan keksi setcookie("passu", "", time()-60*60); header("location: $PHP_SELF"); } // Verrataan cookieta oikeaan salasanaan if($_COOKIE['passu'] == $salasana){?> <!------------------------------------------------------------------------näkyy kirjaantuneelle --> <?php include ('sisallys2.txt'); ?> <!---------------------------------------------------------------------näkyy kirjaantuneelle --> <?php // Jos cookie ei ole salasana näytetään kirjautumislomake } else{ echo(' <form method="post" action="'.$_SERVER['PHP_SELF'].'?log=in"> Valitse nimi ja syötä salasana. <input type="radio" name="ID" value="1">nimi1 <br> <input type="radio" name="ID" value="2">nimi2 <br> <input type="radio" name="ID" value="3">nimi3 <br> <input type="radio" name="ID" value="4">nimi4 <br> <input type="radio" name="ID" value="5">nimi5 <br> <input type="radio" name="ID" value="6">nimi6 <br> <input type="radio" name="ID" value="7">nimi7 <br> <input type="radio" name="ID" value="8">nimi8 <br> Syötä salasana:<br> <input type="password" name="salasana"> <input type="submit" value="Ok!"> </form> '); } ?>
Tämähän toimii mutta väärin, ja siihen haluaisin vinkkejä miten saan seuraavan asian pois. Eli kun kayttaja tulee sivulle joutuu hän kirjoittamaan salasanan kaksi kertaa ennenkuin pääsee sisään, miksi näin ?
eli kun kirjoitat ekan kerran salasanan oikein se päivittää sivun vaan uudestaan ja joudut kirjoittamaan salasanan toisen kerran ennenkuin se näyttää tuon tekstitiedoston mikä tuossa on mainittu.
Tämä
if($_POST['log'] == "in")
pitäisi kaiketi tulla näin:
if($_GET['log'] == "in")
koska se on osoitteessa (?log=in).
Ja, ja...
Tuollainen saman tyyppinen ongelma oli itselläni, käytin jotain valmista koodia, jota olin muunnellut. Eli kun kirjautuu sisään ei olekkaan kirjautunut, vaan pitää painaa refresh(tai painaa linkkiä), että on kirjautunut sisälle.
Ja jotta suojaus toimisi paremmin, kannattaa tuo sisallys2.txt laittaa omaan kansioonsa joka on suojattu .htaccess tiedostolla. Nimittäin jos kansio on suojattu ei sinne pääse selaimella, mutta php scripti kyllä hakee tiedot sieltä.
header("location: $PHP_SELF");
Ei uusimmissa php:n versioissa ohjaa käyttäjää yhtään mihinkään. Seuraavaa voisit kokeilla:
header("Location: http://{$_SERVER['HTTP_HOST']}{$_SERVER['SCRIPT_NAME']}");
Näillä avuilla sain tosiaan toimimaan, tai pääasiassa tuo locationin vaihto vaikutti asiaan, toki tuo post->Get vaihtokin jonka olin kyllä jo tehnyt. Kiitoksia !
Lisäksi tuossa on kaksi querya, kun voisi hoitaa yhdelläkin.
SET edellinen = now(), kertoja = kertoja+1 WHERE ID='$ID'
Tuo $ID olisi tietysti hyvä poimia sieltä $_POST-taulukosta ja ajaa vaikkapa manuaalistakin löytyvän esimerkkifunktio quote_smartin läpi. Lisäksi luullakseni kertoja-kenttään voisi asettaa auto_incrementin, en vain valitettavasti tiedä kuinka se päivitetään.
tsuriga kirjoitti:
Lisäksi luullakseni kertoja-kenttään voisi asettaa auto_incrementin, en vain valitettavasti tiedä kuinka se päivitetään.
Ei voi, minäkin kuhan puolella opastelin sprawlia ilmeisesti saman kirjautumissysteemin kanssa käyttämään auto_incrementiä, kun en suorilta käsin tajunnut mitä koodi tekee, mutta auto_increment ei kuitenkaan toimi noin :)
saattaapi olla sama juu =) Mutta nyt on jotain taas pielessä kun ei kantaan päivity mikään tieto.
$yhteys = mysql_connect(****) or die(mysql_error()); mysql_select_db("***", $yhteys) or die("Tietokantaa ei löytynyt!"); $query = "SELECT * FROM testi"; $result = mysql_query($query, $yhteys) or die (mysql_error()); $query = "SET edellinen = now(), kertoja = kertoja+1 WHERE ID='".$_POST['ID']."'"; $result = mysql_query($query, $yhteys) or die (mysql_error()); mysql_close($yhteys);
Nyt sieltä taisi jäädä se "UPDATE testi" alusta pois :). Ja pitääkö myslissä ennen UPDATE kyselyä tehdä SELECT kysely? Testaile eri vaihtoehtoja.
Lähtihän se toimimaan kun korjasin tuon huolimattomuusvirheen =)
En tiedä oletteko huomanneet kuhan puolella tuota yhtä otsikkoa missä olen yrittänyt saada erääseen koodin tekemiseen apuja, Täällä...
Tuli tässä vielä mieleen että miten saisin tuohon sellasen eston että jos nimeä ei valita niin se ei hyväksy kirjautumista?
edit: koitin laittaa tuohon salasanan tarkistuksen yteyteen seuraavaa:
// Verrataan cookieta oikeaan salasanaan if ($_POST['ID'] > 0); if($_COOKIE['passu'] == $salasana){?>
Mutta eihän tietenkään noin onnistunut =)
isset($_POST['ID'])
jos tämä ei toimi niin kokeile debugata,
var_dump($_POST['ID'])
ja katso mitä arvoja se saa tyhjänä ja epätyhjänä ja rakenna ehtolauseke siltä pohjalta). Ja muina huomioina, 1) salasanan tallentaminen keksiin ei ole niitä turvallisimpia vaihtoehtoja 2) eikö tuo nimen valinta kannattaisi olla selecti
Kyllä mulle riittää että salasana on md5 muodossa keksissä. =) Kun ei tässä mitään pankkitietoja kuitenkaan siirrellä. Onhan se tietenkin ikävää jos joutuu ilkivallan kohteeksi mutta varmuuskopioit on kuitenkin olemassa :)
Koitan saada tuolla sun vinkillä toimimaan-->
edit:
if (var_dump($_POST['ID'])) if($_COOKIE['passu'] == $salasana){?>
Tuo tulostaa vain "NULL"
.. Voisihan sitä tietty selectiksi vaihtaa kunhan saisi itse koodin ensin toimimaan
// Verrataan cookieta oikeaan salasanaan if (!isset($_POST['ID'])) if($_COOKIE['passu'] == $salasana){?>
Tuollalailla se ei huomioi mitenkään onko nimeä valittu vai ei, mitenkäs tuohon saikaan lisättyä että mitä se suorittaa jos ID on tyhja? {} merkkien sisään piti vissiin jotain laitella ? =)
edit2: ääää hajoo pää ku koskaan osaa mitään itse
Tarkotin, että katsot ensin var_dumpilla, mitä arvoja tuo ID sisältää jos nimi valitaan / nimeä ei valita. Oletetaan vaikkapa, että se sisältää tuon NULL (en testannut) jos nimeä ei anneta, niin laitat silloin ehtolausekkeeksi
if ($_POST['ID'] != null) { if ($_COOKIE['passu'] == $salasana) { } }
Muistaakseni se antoi null kummallakin, en mene kuitenkan ihan takuuseen siitä. Nyt kun osaisi tuon vielä soveltaa tuohon itse scriptiin. Lähinnä noiden { ja } tagien laittaminen oikeille paikoille jotta se toimisi koska tuollaisenaan se ei oikeen tykkää tuosta koodista..
edit: jos vanhaa kaavaa yrittää vähänkin seurata niin koodi olisi:
if ($_POST['ID'] != null) { if ($_COOKIE['passu'] == $salasana) { <?php include ('sisallys2.txt'); ?> <?php // Jos cookie ei ole salasana näytetään kirjautumislomake } } else{ echo(' <form method="post" action="'.$_SERVER['PHP_SELF'].'?log=in">
Mutta näköjään sitä ei vanhan mukaan kannata pelata tämän kanssa
var_dump tulostaa valittaessa esim. nimi 7 seuraavaa:
string(1) "7"
Eli ehtolauseeksi kävisi esimerkiksi tuo edellä mainittu tai sitten
// isset tietysti, että vältytään E_NOTICElta if (isset($_POST['ID']) && $_POST['ID'] != "") {
// Verrataan cookieta oikeaan salasanaan if (isset($_POST['ID']) && $_POST['ID'] != "") if($_COOKIE['passu'] == $salasana){?> <?php include ('sisallys2.txt'); ?> <?php // Jos cookie ei ole salasana näytetään kirjautumislomake } else{ echo(' <form method="post" action="'.$_SERVER['PHP_SELF'].'?log=in">
-Tämä näyttää vain tyhjää
Jaa-a. Pistä koko koodi taas niin katsotaan, kyllähän tuon pitäisi tulostaa joko sisallys2 tai sitten tuo formi.
<?php $salasana = "10fd1a79685e9bb8cfa46a67d48d69ac"; // Sisään kirjautuminen if($_GET['log'] == "in"){ // Muutetaan salasana md5 muotoon $salasana = md5($_POST['salasana']); // Asetetaan cookie (keksi) setcookie("passu", $salasana, time()+60*60); header("Location: http://{$_SERVER['HTTP_HOST']}{$_SERVER['SCRIPT_NAME']}"); $yhteys = mysql_connect(****) or die(mysql_error()); mysql_select_db("***", $yhteys) or die("Tietokantaa ei löytynyt!"); $query = "SELECT * FROM testi"; $result = mysql_query($query, $yhteys) or die (mysql_error()); $query = "UPDATE testi SET edellinen = now(), kertoja = kertoja+1 WHERE ID='".$_POST['ID']."'"; $result = mysql_query($query, $yhteys) or die (mysql_error()); mysql_close($yhteys); } // Ulos kirjautuminen if($_GET['log'] == "out"){ // Poistetaan keksi setcookie("passu", "", time()-60*60); header("Location: index.htm"); } // Verrataan cookieta oikeaan salasanaan if (isset($_POST['ID']) && $_POST['ID'] != "") if($_COOKIE['passu'] == $salasana){?> <!------------------------------------------------------------------------näkyy kirjaantuneelle --> <?php include ('sisallys2.txt'); ?> <!---------------------------------------------------------------------näkyy kirjaantuneelle --> <?php // Jos cookie ei ole salasana näytetään kirjautumislomake } else{ echo(' <form method="post" action="'.$_SERVER['PHP_SELF'].'?log=in"> <strong>Valitse nimi</strong> ja syötä salasana. <br> <input type="radio" name="ID" value="1">NooraK <br> <input type="radio" name="ID" value="2">IiroK <br> <input type="radio" name="ID" value="3">MikaK <br> <input type="radio" name="ID" value="4">JouniK <br> <input type="radio" name="ID" value="5">JouniV <br> <input type="radio" name="ID" value="6">Upi <br> <input type="radio" name="ID" value="7">Ritva <br> <input type="radio" name="ID" value="8">Reijo <br> <br> Syötä salasana:<br> <input type="password" name="salasana"> <input type="submit" value="Ok!"> </form> '); } ?>
Muokkasin tuota tämmoiseksi. Tuossa oli vain else väärässä iffissä, skripti toimi aivan kuten sen pitikin. En päässyt testaamaan kunnolla kotiservulla, mutta jos ei toimi niin katso kommentteja ja yritä muokata omaa skriptiä niiden mukaan.
<?php $salasana = "10fd1a79685e9bb8cfa46a67d48d69ac"; // Sisään kirjautuminen if(isset($_GET['log']) && $_GET['log'] == "in"){ // Muutetaan salasana md5 muotoon if (isset($_POST['salasana'])) { $salasana = $_POST['salasana']; // tuota select kyselyä ei tarvitse eikä update-kyselyn resurssia tarvitse ottaa talteen muuttujaan ellei sitä käytetä myöhemmin // pitikö tämän queryn tulla tässä iffissä? jos kyllä niin ennen headeria, muuten sitä ei suoriteta koskaan $yhteys = mysql_connect(****) or die(mysql_error()); mysql_select_db("***", $yhteys) or die("Tietokantaa ei löytynyt!"); $query = "UPDATE testi SET edellinen = now(), kertoja = kertoja+1 WHERE ID='".$_POST['ID']."'"; mysql_query($query, $yhteys) or die (mysql_error()); mysql_close($yhteys); // Asetetaan cookie (keksi) setcookie("passu", $salasana, time()+60*60); header("Location: http://".$_SERVER['HTTP_HOST'].$_SERVER['SCRIPT_NAME']); } } // Ulos kirjautuminen if(isset($_GET['log']) && $_GET['log'] == "out"){ // Poistetaan keksi setcookie("passu", "", time()-60*60); header("Location: http://".$_SERVER['SERVER_NAME']."/index.htm"); // tästä puuttui alusta serverin osoite } // tarkistetaan, onko lähetetty ID if (isset($_POST['ID']) && $_POST['ID'] != "") { // jos käyttäjä on kirjautunut if(isset($_COOKIE['passu']) && $_COOKIE['passu'] == $salasana) require 'sisallys2.txt'; } // Jos keksiä ei ole, tai se poikkeaa oikeasta salasanasta, näytetään kirjautumislomake (tämä echo oli väärän iffin yhteydessä) // PHP_SELFin sijasta suositellaan käytettäväksi SCRIPT_NAMEa else echo' <form action="'.$_SERVER['SCRIPT_NAME'].'?log=in" method="POST"> <strong>Valitse nimi</strong> ja syötä salasana. <br /> <input type="radio" name="ID" value="1" />NooraK <br /> <input type="radio" name="ID" value="2" />IiroK <br /> <input type="radio" name="ID" value="3" />MikaK <br /> <input type="radio" name="ID" value="4" />JouniK <br /> <input type="radio" name="ID" value="5"> /JouniV <br /> <input type="radio" name="ID" value="6" />Upi <br /> <input type="radio" name="ID" value="7" />Ritva <br /> <input type="radio" name="ID" value="8" />Reijo <br /> <br /> Syötä salasana:<br /> <input type="password" name="salasana"> <input type="submit" value="Ok!"> </form>'; ?>
Ei kirjaudu sisään vaan näyttää tuon saman lomakkeen uudelleen. Kirjoitti sitten salasanan ilman nimeä tai ihan tyhjänä..
jaa hetki nyt täytyy vähän panostaa tähän.. Tuli taas vähän hätänen viesti :D
edit:väärä hälytys :)
..: osoitteeksi näyttää nytten keilaajat.php?ID=2&salasana=***
Mistäköhän lie johtuu sitten että ei toimi. Itse en ainakaan mitään näe (yllätys :D)
En tiedä vaikka johtuisi tästäkin
tämä:
// Muutetaan salasana md5 muotoon if (isset($_POST['salasana'])) { $salasana = $_POST['salasana'];
varmaankin pitäisi olla:
// Muutetaan salasana md5 muotoon if (isset($_POST['salasana'])) { $salasana = md5($_POST['salasana']);
ei auttanut
Mikäköhän ihme siinä on kun näyttää sen lomakkeen aina vaan uudestaan??
Joo tuo md5 jäi jonneki matkan varrelle. Jos se näyttää lomakkeen aina uudestaan niin se tarkoittaa sitä, että joko ID ei tullut POSTissa tai 'ID' saa jotenkin väärän arvon. Jos se $_POST['ID'] on null vaikka painaisit "Ok!"-nappia niin formin lähetys ei jostain syystä onnistu.
Jooh, sanokaas jos tiiätte jonkun sivun osote missä olisi toimiva vastaavanlainen tai jokin yhtäpieni kirjautumis systeemi, mielellään kuitenkin niin että ei tartte paljoa myslillä kikkailla...
Tai, jos tiiätte vian tässä scriptissä =)
<?php $salasana = "10fd1a79685e9bb8cfa46a67d48d69ac"; // <---Salasanasi tuohon (md5) oletuksena salasana on testi // Sisään kirjautuminen if($_GET['log'] == "in"){ // Muutetaan salasana md5 muotoon $salasana = md5($_POST['salasana']); // Asetetaan cookie (keksi) setcookie("passu", $salasana, time()+60*60); header("location: $PHP_SELF"); } // Ulos kirjautuminen if($_GET['log'] == "out"){ // Poistetaan keksi setcookie("passu", "", time()-60*60); header("location: $PHP_SELF"); } // Verrataan cookieta oikeaan salasanaan if($_COOKIE['passu'] == $salasana){?> <!--näkyy kirjaantuneelle --> <?php include ('sisallys2.txt'); ?> <!--näkyy kirjaantuneelle --> <?php // Jos cookie ei ole salasana näytetään kirjautumislomake } else{ echo(' <form method="post" action="'.$_SERVER['PHP_SELF'].'?log=in"> <b>Salasana</b> <input type="password" name="salasana"> <input type="submit" value="kirjaudu"> </form> '); } ?>
päätin tyytyä tähän vanhaan versioon ilman mysli hienouksia, tosin vieläkin joutuu kahteen kertaan kirjoittamaan.
Aihe on jo aika vanha, joten et voi enää vastata siihen.