Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: md5+kirjautuminen - miksi kahteen kertaan ??

Sivun loppuun

sprawl [29.03.2006 20:42:55]

#

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.

juha127 [29.03.2006 21:22:23]

#

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ä.

folio [29.03.2006 21:24:53]

#

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']}");

sprawl [29.03.2006 21:44:50]

#

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 !

tsuriga [29.03.2006 23:06:28]

#

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.

ajv [29.03.2006 23:15:11]

#

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 :)

sprawl [30.03.2006 16:03:23]

#

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);

tsuriga [30.03.2006 16:36:25]

#

Nyt sieltä taisi jäädä se "UPDATE testi" alusta pois :). Ja pitääkö myslissä ennen UPDATE kyselyä tehdä SELECT kysely? Testaile eri vaihtoehtoja.

sprawl [30.03.2006 17:00:11]

#

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ä...

sprawl [30.03.2006 20:40:57]

#

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 =)

tsuriga [30.03.2006 21:06:57]

#

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

sprawl [30.03.2006 21:10:53]

#

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

tsuriga [30.03.2006 21:40:31]

#

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) {
    }
  }

sprawl [30.03.2006 21:48:51]

#

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

tsuriga [30.03.2006 21:57:08]

#

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'] != "") {

sprawl [30.03.2006 22:06:07]

#

// 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ää

tsuriga [30.03.2006 22:20:00]

#

Jaa-a. Pistä koko koodi taas niin katsotaan, kyllähän tuon pitäisi tulostaa joko sisallys2 tai sitten tuo formi.

sprawl [30.03.2006 22:23:28]

#

<?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>
    ');

}

?>

tsuriga [30.03.2006 23:05:09]

#

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>';
?>

sprawl [31.03.2006 15:01:20]

#

Ei kirjaudu sisään vaan näyttää tuon saman lomakkeen uudelleen. Kirjoitti sitten salasanan ilman nimeä tai ihan tyhjänä..

sprawl [31.03.2006 15:08:24]

#

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=***

sprawl [31.03.2006 16:09:31]

#

Mistäköhän lie johtuu sitten että ei toimi. Itse en ainakaan mitään näe (yllätys :D)

Lebe80 [31.03.2006 17:03:49]

#

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']);

sprawl [31.03.2006 18:14:49]

#

ei auttanut

sprawl [31.03.2006 19:15:41]

#

Mikäköhän ihme siinä on kun näyttää sen lomakkeen aina vaan uudestaan??

tsuriga [31.03.2006 19:45:03]

#

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.

sprawl [31.03.2006 20:55:05]

#

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ä =)

sprawl [31.03.2006 22:36:25]

#

<?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.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta