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`) );
eikös ton tietokanta luokan pitäisi loppua ?> tagii???
No kyllähän sen pitää... mulla on muutakin tuossa luokassa ja näköjäs oli unohtunut...
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.
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ä.
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...
Siis tarvitseeko tämä MYSQL:n?
Tarvitsee
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?
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.
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.
Tämä $password = $_POST['passw']; kande olla näin $password = md5($_POST['passw']); ja sitten tallentaa salasanat md5-salattuna.
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.
https://www.php.net/manual/en/function.mysql-real-escape-string.php
Aihe on jo aika vanha, joten et voi enää vastata siihen.