Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: PHP Login-lomake

Sivun loppuun

Hoover [05.12.2006 09:04:39]

#

Elikkä, rupesin nyt yhtä omaa login-koodinkikkaretta muuntamaan niin, että siinä on samassa tiedostossa HTML-formi ja sitten PHP-koodilohko joka testaa lomakkeen tiedot.

Jostain syystä en saa lomaketta latautumaan uudestaan ja samalla ilmoittamaan virheilmoitusta, jos tiedot ovat väärin. Jos laitan väärät tunnukset tai muuten epäkelvot, niin latautuu vain tyhjä sivu. Jos tiedot ovat oikein, niin silloin kyllä latautuu seuraava vaihe.

Tässä on pelkistetty versio toiminnasta:

<?php

include 'config.php';	// Määritetään MySQL-yhteyden asetukset
include 'opendb.php';	//Avataan MySQL-yhteys
mysql_select_db($dbname);

$error = "";

if ($_POST['process'] == 1){

	$login = $_POST['login'];
	$pass = $_POST['pass'];

	// Tarkistus, että käyttäjä on loggautunut omilla tunnuksillaan.
	$query = "SELECT * FROM kayttaja WHERE login = '$login' and pass = '$pass'";
	$result = mysql_query($query) or die(mysql_error());		// Ajetaan haku
	$tuloksia = mysql_num_rows($result) or die(mysql_error());

	include 'closedb.php';	// Suljetaan MySQL-yhteys

	// Jos $tuloksia löytyi, niin ohjataan seuraavaan vaiheeseen, muutoin takaisin loginiin virheilmoituksen kera.
	if ($tuloksia > 0){
		header("location: edit.php");
	}
else{
	$error = "Väärä käyttäjätunnus tai salasana.";
echo $error;

}
}

?>


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<HTML>
<HEAD>
<TITLE>Login</TITLE>
</HEAD>
<BODY>

<h1>Login</h1>

<?php
if ($error != ""){
	echo $error . "<br>";
}
?>

<form action="login.php" method="post">

<table border="0">
	<tr>
		<td><b>Käyttäjätunnus:</b></td>
		<td><input type="text" name="login" maxlength="10"></td>
	</tr>
	<tr>
		<td><b>Salasana:</b></td>
		<td><input type="password" name="pass" maxlength="10"></td>
	</tr>
</table>
<br>
<input type="submit" value="Kirjaudu"><input type="reset" value="Tyhjennä">
<input type="hidden" name="process" value="1">

</form>

</BODY>
</HTML>

El-Ejecutor [05.12.2006 09:10:53]

#

Jos nyt oikein ymmärsin kun nopeasti vilkuilin niin ota header("location: login.php"); pois ja laita tilalle vain echo $error;

Hoover [05.12.2006 09:16:13]

#

Tyhjää tulee vieläki. :I

Lisäys:
Näyttää ikään kuin tuo toinen "else"-ehto jätettäisiin kokonaan testaamatta. Eikö se tuon $tuloksia -muuttujan arvo pitäisi olla 0 jos ei löydy mitään?

Miksiköhän muuten osoiterivissä lukee osoitteena vieläkin */login.php silloin kun tuosta pääsee oikeilla tunnuksilla */edit.php -sivulle? Eikö sen pitäisi vaihtua kun mennään headerilla toiselle sivulle.

siirappi [05.12.2006 10:19:00]

#

Eihän tuota virhettä voida näyttää, koska skriptin suoritus lopetetetaan, jos tulosrivejä ei ole.

$tuloksia = mysql_num_rows($result) or die(mysql_error());

Hoover [05.12.2006 10:28:13]

#

Vautsi, sehän toimii. :)

Tuo vaan kummastuttaa kun osoiterivin osoite ei muutu headerin osoitteeksi... Mikähän siinä voisi olla?

Lisäsin vähän tietoa menemään sinne osoitteeseen, eli se on tälläinen nykyään:
header("location: edit.php?login=$login&pass=$pass");

El-Ejecutor [05.12.2006 11:08:52]

#

Älä lähetä urlin mukana moisia tietoja. Älä ainakaan salaamatta. Parempi että otat sessionit käyttöön.

Hoover [05.12.2006 11:15:57]

#

Saako noita mitenkään muuten vietyä? Ennen lähettelin _$POST:lla, mutta kun tuo php-osio on nyt samassa tiedostossa html-osion kanssa, niin se ei sinne edit.php:lle päädy. :/

El-Ejecutor [05.12.2006 11:26:02]

#

Tee käyttäjätarkistukset vaikka if ($tuloksia > 0) jälkeen ja ohjaa sitten käyttäjä itse sivuille, mikäli tunnus ja salasana täsmää.
Tietojen säilytykseen on kyllä sitten evästeet ja istunnot: https://www.ohjelmointiputka.net/oppaat/opas.php?tunnus=phpj7
Kannattaa muistaa myös salasanan salaaminen vaikkapa md5:lla https://www.ohjelmointiputka.net/oppaat/opas.php?tunnus=salaphp

Hoover [05.12.2006 11:28:49]

#

Jop. Onko tuo sitten miten iso aukko tietoturvan kannalta ja mitenkä helppo sitä on hyväksikäyttää? Eihän tuossa kuitenkaan kukaan sivullinen tiedä millä tunnuksilla sinne kirjaudutaan (ellei sitten kerro kaverille), niin eihän sieltä mitään asiatonta silloin ulos saa.

El-Ejecutor [05.12.2006 11:34:25]

#

No jos lähetät salasanan osoitteen mukana niin aukko on aika mieletön ;) . Salasanat on aina hyvä kryptata. Evästeitä ja istuntoja käyttäessä kannattaa muistaa että eväste eli cookie eli keksi on käyttäjän koneella oleva tiedonpalanen ja käyttäjän manipuloitavissa. Istunto eli session pyörii palvelinpuolella ja siinä on parempi säilöä sitten esim. kirjautumiseen liittyvää tietoa.

Tallenna käyttäjien salasanat tietokantaan hashaamalla ne ensin md5:lla md5($pass);
Käyttäjän kirjautuessa tarkistat sitten syötetyn salasanan hashia tietokannassa sijaitsevaan if (md5($_POST['pass']) == $tietokannasta_haettu_passu)

Hoover [05.12.2006 11:36:42]

#

Joo, tuon hashin meinasin tunkea tähän myöhemmin kunhan saan systeemit rullaamaan.

Mutta siis noita käyttäjätunnuksia en oikein käsitä, että mikä siinä on kun eihän sitä missään näy, edes käyttäjän koneella. :o

El-Ejecutor [05.12.2006 11:52:41]

#

Meinaatko tunnuksen lähettämistä vai? Kyllä sitä voi lykkiä osoitteessa jos mielii mutta helpompaa luoda sille esim. cookie.

Hoover [05.12.2006 11:57:03]

#

Joo, tuossa kun vie headerissa tunnukset seuraavalle sivulle, niin sitä tarkotin, että onko siinä tietoturva-aukkoa.

Ei minulla kyllä mitään noita istuntoja ja cookieta vastaan oo. Ei vaan viitti ruveta tekemään jotain jos ei ymmärrä miksi sellainen pitäisi tehdä. :)

El-Ejecutor [05.12.2006 12:06:55]

#

Kunhan et sitä salasanaa lyki osoitteen mukana. Selviäisi turhan helposti käyttäjän olan yli kurkkimalla ;)
Mieti järkevin ratkaisu tunnuksen viemiseen käyttötarpeesi mukaan. Jos esim tulostat etusivulle "Tervetuloa $user", on syytä tehdä tunnusta varten cookie. Muuten joudut viemään käyttäjätunnuksen sivustosi jokaisen linkin mukana aina uudestaan (olettaen että haluat tervehdyksen näkyvän jatkuvasti).

Selitys on sekavaa kuin edellisen paavin uudenvuodenpuheet, mutta toivottavasti sait selkoa.

Hoover [05.12.2006 15:21:11]

#

Entäpä onko mahdollista tehdä ilman keksejä tämä login jos on pakko? Näytästi vähän siltä, että istuntoihin pitäisi olla aina keksejä kun selailin pikaisesti.

El-Ejecutor [05.12.2006 15:45:53]

#

On toki mahdollista. Ratkaisuja on monia. Jäi epäselväksi vielä että mihin kaikkeen tarvitset $login ja $pass -muuttujia edit.php:ssä?
Kuten sanottu, mikäli tarkoituksena on vain suorittaa käyttäjän tarkistus, voit tehdä sen jo tuossa login-sivussa. Jos käyttäjä syöttää oikeat tiedot, hänet ohjataan vasta sitten headerilla eteenpäin. Muuten herjataan jotain rivoa punaisella fontilla.

Blaze [05.12.2006 15:52:30]

#

Hoover kirjoitti:

Näytästi vähän siltä, että istuntoihin pitäisi olla aina keksejä kun selailin pikaisesti.

Ei tarvi. Jos keksit ei oo käytössä, PHP kuljettaa sessio-id:tä GET-parametrina osoterivillä. https://www.php.net/manual/en/ref.session.php­#session.idpassing


Sivun alkuun

Vastaus

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

Tietoa sivustosta