Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: PHP: setcookie() ei luo keksiä

Sivun loppuun

Burton [13.04.2012 20:20:41]

#

Heippa kaikille.

Rakentelen nettisivuilleni kirjautumismahdollisuutta käyttäen keksejä. Minulla on index.php, jossa sijaitsee kirjautumisformi, jota käsittelee tunnista_kirjautuminen.php:

# tämä ei ole koko tiedosto, mutta oleellisimmat osat rakenteesta


$kayttajanimi = $_POST['kayttaja'];
$salasana = $_POST['salasana'];

# ...

# avataan tiedosto, joka sisältää tunnukset (public_html-kansion ulkopuolella)
# ja tutkitaan, antoiko käyttäjä olemassaolevaa tunnusta
$tunnukset = file("../tunnukset");

# ...

# menikö salasana oikein

# jos meni, niin
setcookie("kaurapala", $kayttajanimi, 0, "/", "http://www.osoite.fi");
echo '<p><a href="kayttajasivu/">Hyppää käyttäjäsivulle!</a></p>';
die();

Jostain kumman syystä keksiä ei kuitenkaan ikinä luoda, vaikka salasana ja käyttäjätunnus menevätkin oikein. Lueskelin, että setcookie pitää kutsua ennen tulosteita, mutta kaikki html-aiheiset tulostukset tehdään vasta kutsun jälkeen, joten siitä ei pitäisi ainakaan kiikastaa.

Keksien luomisessa vika ei voi olla, koska tein tiedoston cookie.php, joka kutsuu vain setcookie(...)-komentoa, ja se onnistui firefoxin mukaan luomaan keksin ongelmitta. Vika on siis tunnista_kirjautuminen.php:ssa, mutta en keksi, missä siellä. Ko. tiedostossa ei tehdä mitään salasanojen hashauksien purkamisesta poikkeavaa.

PHP:n versio on 5.3.

The Alchemist [13.04.2012 20:45:34]

#

Ei vian tarvitse olla juuri tuossa PHP-tiedostossa. Riittää, että tulostus tapahtuu ihan missä tahansa vaiheessa suoritusta ennen setcookie()-kutsua. Whitespace ennen <?php-avaustagiakin riittää. Kannattaisi tosin laittaa output buffering päälle, koska se parantaa suorituskykyä. Haittapuolena sitten tällaiset suunnittelu- tai huolimattomuusvirheet jäävät piiloon.

Burton [13.04.2012 20:51:32]

#

Nyt en aivan ymmärtänyt.

Tiedostossa tunnista_kirjautuminen.php ei tehdä tulostuksia ennen setcookies()-kutsua. Whitespaceja ei ole, ellei editorini niitä kätke jostain syystä.

Kirjautumisen rakenne on:
index.php (form action) -> tunnista_kirjautuminen.php -> /kayttajasivu/index.php -> ../ulos.php
index.php sisältää aivan perinteisen formin:

<form action="tunnista_kirjautuminen.php" method="post">
    Tunnus:
    <input type="text" name="unam"><br />
    Salasana:
    <input type="password" name="pass"><br />
    <input type="submit" value="Kirjaudu">
</form>

Minun pitää googlettaa tuo mainitsemasi output buffering.

The Alchemist [13.04.2012 20:54:43]

#

No heität exitin kirjautumisprosessin loppuun ennen uudelleenohjausta, niin näet, mitä kaikkea skriptisi onkaan tulostanut ennen setcookieta. Ei ollenkaan vaikeaa.

Burton [13.04.2012 20:55:55]

#

Mutta kun uudelleenohjausta ei tapahdu. tunnista_kirjautuminen.php:sta siirrytään manuaalisesti käyttäjäsivulle, joten kaikki tulosteet näkyvät kyllä.

Onko siitä haittaa, jos tulosteita tehdään php-lohkon jälkeen?

<?php
...
?>
<p>Tekstiä</p>

The Alchemist [13.04.2012 21:01:40]

#

Sanoin jo, että mikä tahansa tuloste ennen setcookie()-kutsua rikkoo keksin asettamisen, mikäli ob ei ole päällä. Yksikin välilyönti jne.

Koodia tehdessä pitäisi lisäksi aina olla virheraportointi päällä ja tiukoilla asetuksilla:

ini_set('display_errors', 1);
ini_set('error_reporting', E_ALL | E_STRICT);

Burton [13.04.2012 21:46:03]

#

Kytkin virheraportoinnin päälle, starttasin ob:n, eikä siltikään keksiä synny. Ennen setcookiesia ei ole tulosteita, ellei sitten index.php:n html:ää lasketa, mitä epäilen suuresti.

Kokeilin myös sijoittaa setcookies-kutsun tiedoston toiselle riville (eli heti <?php:n jälkeen), mutta siltikään mitään ei synny.

Merri [13.04.2012 22:01:32]

#

Keksille pitäisi määrittää päivämäärä tulevaisuuteen.

neau33 [13.04.2012 22:44:07]

#

Moi Burton!

jätä se path ja domain pois niin rulaa elikäs:

setcookie("kaurapala", $kayttajanimi, 0);

-Nea-

Burton [13.04.2012 23:01:38]

#

Merri kirjoitti:

Keksille pitäisi määrittää päivämäärä tulevaisuuteen.

php.net sanoo expire-parametrista näin:

https://www.php.net/manual/en/function.setcookie.php:

If set to 0, or omitted, the cookie will expire at the end of the session (when the browser closes).

Eli arvolla 0 olen yrittänyt luoda keksiä, joka vanhenee session päättyessä. Kokeilin varmuuden vuoksi arvolla time() + 3600, mutta se ei vaikuttanut lopputulokseen mitenkään.

neau33 kirjoitti:

jätä se path ja domain pois niin rulaa

Ja niinhän se rulasikin.

Kiitos, nea. Ja kiitos muillekin yrittämisestä. Mistä johtuu, ettei keksiä syntynyt pathin kanssa, mutta ilman kylläkin?

neau33 [13.04.2012 23:33:12]

#

Heippa taas!

Burton kirjoitti:

Mistä johtuu, ettei keksiä syntynyt pathin kanssa, mutta ilman kylläkin?

Lue tämä!

Metabolix [14.04.2012 11:19:00]

#

Protokolla ei ole osa domainia. Domain voi olla vaikka www.esimerkki.fi.


Sivun alkuun

Vastaus

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

Tietoa sivustosta