Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: PHP: Kirjautumissysteemi

Sivun loppuun

Oikkis [18.10.2004 10:41:46]

#

Eli pienimuotoinen kirjautumis/kirjautumisen tarkistamiseen tarkoitettu skripti. Käyttää MySQL yhteyden muodostamiseen omaa Classia(mikä ei ihan kokonaan omaa käsialaa ole). SQL-queryssä jolla luodaan db:een taulu on vielä ylimääräisiä kenttiä, tarkoitus olisi joskus laajentaa systeemiä...

Formi sivu nimetään index.php:eeksi ja formi kutsuu index.php:tä eli itseään... jolloin logSystem.php(joka on includattu index.php:hen) saa formin tiedot ja tarkistaa tietokannasta löytyykö käyttäjänimi ja jos löytyy niin luo Session. tsekkaaLog sitten tarkistaa löytyykö sessionia ja sen mukaan päästää sivulle tai ohjaa muualle, logout nimensä mukaan loggaa ulos...

Jep kommentteja turvallisuudesta ym. parannuksesta otetaan mielellän vastaan...Mun eka skripti minkä tänne lähetän ja Php:eeni vielä lapsen kengissä.

tietokanta luokka

<?php
//tietokanta luokka....


class database {
	//tänne yhteyden tarvitsemat muuttujat
	var $dbName = "db:een nimi";
	var $dbHost = "hosti";
	var $dbUser = "käyttäjänimi";
	var $dbPass = "salasana";

	function Database() {

	}

	function DB_databaseConnect() {
	 // yhdistä MySQL servuun ja valitse db
	 $dbLink = mysql_connect($this->dbHost, $this->dbUser, $this->dbPass);
	 	if (!$dbLink)
	 		die ("Database Class : Couldn't connect to MySQL Server");
	 	mysql_select_db($this->dbName, $dbLink)
	 		or die("Database Class: Couldn't open database");
	 return $dbLink;
	}

	function DB_executeQuery($query, $dbLink) {
		//suorita SQL tämän function kautta
		$dbResult = mysql_query($query, $dbLink)
			or die ("Database Class: MySQL Error: " . mysql_error() );
		return $dbResult;
	}

	function DB_getRecords($dbResult) {
		// kertoo löytyikö sql-querystä osumia ja kuinka paljon
		$rows = mysql_num_rows($dbResult);
		return $rows;
	}

	function DB_closeDatabase($dbLink) {
		//Sulkee yhteyden
		mysql_close($dbLink);
	}

}?>

logSystem.php

<?php
require_once("../class/database.php");	// db-classi mukaan!
//logisysteemi
$login ='false';
session_start();		// startataan sessio
$loginusername = $_POST['nick'];
$password = $_POST['passw'];


if ($loginusername <> '' ) {
	//otetaan yhteys tietokantaan
	//luodaan uusi databaolio
	$db = new database();
	$loglink = $db->DB_databaseConnect(); //asetetaan muuttujaan yhteysmerkkijono
	$query = sprintf("SELECT nick, passw FROM tblloguser WHERE nick= '%s' AND passw= '%s' ",
					get_magic_quotes_gpc() ? $loginusername : addslashes($loginusername), get_magic_quotes_gpc() ? $password : addslashes($password));
	$result = $db->DB_executeQuery($query, $loglink); //suoritetaan sql...

	$osuJaUppos = $db->DB_getRecords($result); //katsotaan löytyikö osumia
	$db->DB_closeDatabase($loglink);	//suljetaan yhteys

	if ($osuJaUppos) {
		$login = 'true';
	} else {
		$printti = "nyt mättää jokin kirjautumisessa, kokeile uudestaan!";
		$login = 'false';
	}
	// jos login on true niin jatketaan eteenpäin
	if ($login == 'true') {
		$GLOBALS['MM_UserN'] = $loginusername;
		session_register("MM_UserN");
		header("location: ../sisaan.php"); //minne mennään kun kirjautuminen Ok

} else {
$printti = "Täytä kentät ja loggaa ineen";
}
}
?>
//html filun tiedot
<?php require_once("logSystem.php"); // eli includataan mukaan edeltävä koodin pätkä.?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Loggaa hallintaan!</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>

<body>
<?php echo $printti ?>
<form name="form1" method="POST" action="index.php">
<p>nimi :</p>
<p><input name="nick" type="text" id="nick" size="20" maxlength="20"></p>
<p>salasana:</p>
<p><input name="passw" type="password" id="passw" size="20" maxlength="20"></p>
<p><input type="submit" name="Submit" value="Kirjaudu"><input type="reset" name="Submit2" value="Peruuta"></p>
</form>
</body>
</html>

tsekkaaLog.php

tämä filu includataan sitten sivuille johon halutaan tunnistus onko logattu vai ei...

<?php
session_start();
$login = 'false';
// tsekataan onko sessioniin asetettu MM_UserN-arvo
// ja jos ei ole niin ohjataan käyttäjä login sivulle!
if (isset($_SESSION['MM_UserN'])) {
	$login = 'true'
}
if ($login == 'false') {
header("location: index.php");
}
?>

logout.php

jep ja tämä sitten omaafiluun vaikka logout.php ja logout linkin taakse osoite tänne...

<?php
session_start();
//logout
session_unregister('MM_UserN');
header ("location: ../page.php")
?>

MySQL

CREATE TABLE `tblloguser` (
  `id` INT NOT NULL,
  `name` VARCHAR(100),
  `nick` VARCHAR(20) NOT NULL,
  `passw` VARCHAR(10) NOT NULL,
  `level` INT(8),
  PRIMARY KEY (`id`)
);

Cc [20.10.2004 23:35:16]

#

eikös ton tietokanta luokan pitäisi loppua ?> tagii???

Oikkis [21.10.2004 08:58:59]

#

No kyllähän sen pitää... mulla on muutakin tuossa luokassa ja näköjäs oli unohtunut...

T.M. [22.10.2004 21:11:53]

#

    function DB_getRecords($dbResult) {
        // kertoo löytyikö sql-querystä osumia ja kuinka paljon
        $rows = mysql_num_rows($dbResult);
        return $rows;
    }

    function DB_closeDatabase($dbLink) {
        //Sulkee yhteyden
        mysql_close($dbLink);
    }

Miksi en tajua mitä varten noille piti tehdä omat funktiot?
Eihän tuossa ole tehty mitään muuta kuin uusi nimi kyseiselle funktiolle :|

Luokan käytön hyöty on vähän hämärän peitossa tässä scriptissä. Kahta funktiota varten on aivan turhaa tehdä luokka. (kaksi, koska nuo toiset kaksi funktiota olivat turhia)

Sotkuista koodia kaikin puolin.

ajv [24.10.2004 11:36:05]

#

Salasana ei ole kryptattuna kannassa, mikä on erittäin huono asia.
Koodi ei tosiaankaan ole kauhean selkeätä. Esim. muuttujanimet ovat osa englanniksi ja osa suomeksi. Selvästikkin tässä on käytetty jotain koodia pohjana(?).
Lisäksi koodissa käytetään monessa kohtaa

$login = 'false'

, jolloin $login-muuttuja on muodoltaan string. Ja näin ollen myös joudut sitä aina stringiin vertaamaankin. Parempi käytäntö voisi ehkä olla määritellä

$login = false

, jolloin muuttujatyyppi olisi boolean. Ei siinä mitään, toimiihan se noinkin, mutta antaa huonoa esimerkkiä.

Oikkis [16.11.2004 12:00:14]

#

Jep tarvii noita virheitä karsia ja yrittää selkeyttää koodia...kun vaan jaksas. Mulle on valitettavasti jäänyt tapa käyttää suomenkielisiä ja englanninkielisiä muuttujan nimiä sekaisin :-(... Toi db-class on yhden kirjan esimerkeistä poimittu ja jonkin verran loginin koodiin on otettu pohjaa dreamweaverin generoimasta login koodista...

Crewi [16.11.2005 09:25:22]

#

Siis tarvitseeko tämä MYSQL:n?

teppu [22.11.2005 16:13:41]

#

Tarvitsee

sittura [31.12.2006 19:32:28]

#

siis mikä tuo tietokanta luokka -tiedosto on? miksikä se pitää nimetä? ja mitä nuo db:een nimi, hosti, käyttäjänimi ja salasana -jutut ovat? mitä niihin pitää laittaa?

Kristal [07.02.2007 14:01:26]

#

sittura kirjoitti:

siis mikä tuo tietokanta luokka -tiedosto on? miksikä se pitää nimetä? ja mitä nuo db:een nimi, hosti, käyttäjänimi ja salasana -jutut ovat? mitä niihin pitää laittaa?

Niitä tarvitsee, jotta tietokantaan voitaisiin tehdä kyselyjä. Eli haetaan tiedot tunnuksista.

walkout_ [06.07.2007 13:07:57]

#

Tämä rivi,

if ($login == 'false') {
header("location: index.php");
}

pitäisi olla näin,

if ($login == 'false') {
header("location: index.php");
session_destroy();
ob_clean();
exit();
}

Tai muuten mm. systeemin takana olevat tietokantaan tallentavat lomakkeet on käytettävissä ulkopuoliselta palvelimelta jos tietää niihin suoran linkin.

header("location: index.php"); rivistä huolimatta ohjelma ajaa ks. rivin jälkeisen koodin.

myöskin kandee session_destroy(); pistää myös tonne logout hommaan. Jaa muistaa se että session_destroy(); ei poista itse session tiedostoa vaan vetää koko tiedoston tyhjäksi.

walkout_ [06.07.2007 13:15:37]

#

Tämä $password = $_POST['passw']; kande olla näin $password = md5($_POST['passw']); ja sitten tallentaa salasanat md5-salattuna.

JayJayKing [12.11.2009 14:51:06]

#

walkout_ kirjoitti:

Tämä $password = $_POST['passw']; kande olla näin $password = md5($_POST['passw']); ja sitten tallentaa salasanat md5-salattuna.

Vaan mitä merkitystä sillä on, jollei käytä SSL-tunnelointia, kun kaiken liikenteen voi sniffailla ilman sitä? Ilman sitä ei mitenkään voi rakentaa nykytekniikoilla turvallista kirjautumista.

Kannattaa myös tuon lisäksi tarkastaa syöte ja käyttää niihin ainakin seuraavia funktioita:
https://www.php.net/manual/en/function.strip-tags.phphttps://www.php.net/manual/en/function.strip-tags.php
https://www.php.net/manual/en/function.mysql-real-escape-string.php


Sivun alkuun

Vastaus

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

Tietoa sivustosta