https://www.ohjelmointiputka.net/koodivinkit/
Hieno skripti. Otin itselleni käyttöön myös muutamien muokkausten jälkeen. Minuakin tosin kiinnostaisi, että miten juuri esim. sen "kuvat.php" tiedoston saa suojaan?
Jos joku laittaa osoitteeksi juuri suoraan tuon "kuvat.php" niin mitään salasanaa ei kysellä.
"No includetat siihen kuvat.php:hen tuon ylaosa.php:n ja alaosa.php:n."
Tämä kuulostaa juuri siltä helpolta tavalta, mutta en vaan saa toimimaan. Siis pelkät includet noista? =) Saan sen toki kyselemään salasanaa, mutta se "kuvat.php" kuitenkin tulostuu suoraan sivuille myös...
"Jos et halua tätä tehdä, niin kopioit tuon ylaosa.php:n koodista ne kohdat sinne kuvat.php:hen, joita tarvitset, eli ainakin tuon tietokantayhteyden avaamisen ja käyttäjän tunnistuksen."
Tämän ymmärrän ja tällä tavalla saisin haluamani jutun toimimaan, mutta tällä tavalla se olisi vaan tosi vaivalloistani kun pitäis kaikki haluamani php-sivut suojata muokkaamalla hirveesti koodia, jotta saisin kaiken tähän väliin oikein:
if($user)
// tähän pasteta oikealla tavalla kaikki salaisten tiedostojeni sisällöt...
Ymmärsittekö mitä haen takaa? Eli helpoin tapa suojata haluamani tiedostot?
EDIT: Kehoitettiin tekemään uusi viestiketju, kun ei kukaan juuri noita koodivinkkejä seuraa.
Laita kirjautumiseen liittyvät funktiot yhteen tiedostoon, tässä kirjautumisfunktiot.php. Funktio kirjautumiseen, sen tarkistamiseen, mihin vain. Joka tiedostossa liitä tuo funktiotiedosto ja hoida tarkistukset sen avulla.
<?php // kirjautumisen_kasittely.php require_once('kirjautumisfunktiot.php'); if (kirjautunut()) { echo "Olet jo sisällä!\n"; exit; } switch (kirjaudu($_POST['nimi'], $_POST['sana'])) { case true: echo "Jee, osasit!\n"; break; case false: echo "Jokin on väärin!\n"; break; } ?>
<?php // salasivu.php require_once('kirjautumisfunktiot.php'); if (kirjautunut() == false) { header("Location: http://palvelin/kirjaudu.php"); // Vaihtoehto: include('kielletty.php'); ja ehkä jotain header-juttuja exit; // Ja sen matka loppui siihen. :) } include('ylaosa.php'); ?> <h1>Salasivu</h1> <p>Tätäpä ei kirjautumatta näe!</p> <?php include('alaosa.php'); ?>
Metabolix kirjoitti:
Laita kirjautumiseen liittyvät funktiot yhteen tiedostoon, tässä kirjautumisfunktiot.php. Funktio kirjautumiseen, sen tarkistamiseen, mihin vain. Joka tiedostossa liitä tuo funktiotiedosto ja hoida tarkistukset sen avulla.
Eli nyt teit 2 sivua minulle valmiiksi "salasivu.php" ja "kirjatumisen_kasittely.php"? Ja nyt minun pitäisi itse tehdä vielä kirjautumisfunktiot.php?
EDIT: nyt taidan itse sekoilla? =) Luenpa viestisi vielä ajatuksella uudestaan.
Ymmärsinkö siis nyt edes oikein. Metabolix teki 2 esimerkkiä mitkä ajaa saman asian? Nyt vain minun pitäisi tehdä itse "kirjautumisfunktiot.php" tiedosto, missä on kaikki "kirjautumisen tarkistukset"? Eli "kirjautunut" funktioon pitää ahtaa jollain tapaa alkuperäisin "ylaosa.php" tarkistuskoodit?
Ihan pihalla, apua kaivataan. =)
<?php # Kirjautumisesta kulkee tieto SESSION -taulussa. Tarkista aina sivun alussa sessio. require_once('MitaNytTarviitkaan.php'); session_start(); if(!$_SESSION['log_key']) { header('location:./VirheSivu.phtml'); } ?>
hmm... ok, mutta juuri tuon "mitanyttarviitkaan.php" tai "kirjautumisfunktiot.php" sisalto on se ongelma, että mitä kaikkea se tarvii ja missä muodossa.
Edelleenkin sille Location headerille absoluuttista URIa, ja pienellä sivujen nimet kiitos, ei jaksa capslockittaa/shiftittää selatessa. Metabolix viittasi koko koodin funktioittamiseen, joutuu vähän muokkaamaan tuota alkuperäistä koodivinkkiä. Eli periaatteessa vastaus kysymykseesi
Antti80 kirjoitti:
Eli "kirjautunut" funktioon pitää ahtaa jollain tapaa alkuperäisin "ylaosa.php" tarkistuskoodit?
on kyllä.
EDIT: Tarttet kirjautumisfunkkarit (kohdat /* SISÄÄNKIRJAUTUMINEN */, /* ULOSKIRJAUTUMINEN */, ja sitten vielä jonkun funkkarin, jolla tarkistat, onko käyttäjä sisällä). Ohjeita löytyy itse koodivinkin kommenteista.
Vasta_alkaja kirjoitti:
<?php # Kirjautumisesta kulkee tieto SESSION -taulussa. Tarkista aina sivun alussa sessio. require_once('MitaNytTarviitkaan.php'); session_start(); if(!$_SESSION['log_key']) { header('location:./VirheSivu.phtml'); } ?>
Tuohon ei kannata luottaa että tuollainen sessio löytyy. Itse koodivinkissä tarkastetaan tuon lisäksi, että myös kannasta löytyy vastaava sessio.
Ja tosiaan tänä päivänä kirjoittaisin tuon koodin ehkä _hieman_ erilailla, mutta tuollaisenaan se on ehkä aloittelijaystävällisempi ja sen toiminta täytyy oikeasti tajuta, ennen kuin sitä voi käyttää. Ei ole tarkoituskaan olla mikään copy-paste-2-mbnet -koodi :)
ajv kirjoitti:
Ja tosiaan tänä päivänä kirjoittaisin tuon koodin ehkä _hieman_ erilailla, mutta tuollaisenaan se on ehkä aloittelijaystävällisempi ja sen toiminta täytyy oikeasti tajuta, ennen kuin sitä voi käyttää. Ei ole tarkoituskaan olla mikään copy-paste-2-mbnet -koodi :)
Jep, liian haastava mulle. Ja tosiaan, itsekin haluan oppia samalla vaikka apuja pyydän.
Meinasin jo alkaa tekemään ihan alusta, mutta sitten iski laiskuus ja googletin tälläisen oppaan:
http://www.phpeasystep.com/workshopview.php?id=6
Copypastesin sen omalle "alustalle" ja heti toimii!
Onko kommentoitavaa tuosta skriptistä?
(Vielä pitää ainakin salasana kryptata)
On kyllä mainio skripti. Kaikki toimii heti ja jopa tajusin miten suojataan haluamat sivut helposti.
Nyt pitäisi vielä kryptata tuo salasana suoraan tietokantaan, miten se onnistuu?
tällä komennolla suoraan tietokannassa (phpmyadmin) saan salasanan sinne normaalisti:
INSERT INTO `members` VALUES (1, 'tunnus', 'salasana');
Miten tuolla käskyllä saan kryptattua salasanan kantaan?
md5(); apuna käyttäen vai?
Sehän ominaisuus löytyi itse phpmyadmin-paneelista.
Nyt toimii kuin unelma! :)
---
Voitte toki itse tätä skriptiä kommentoida, jos siinä mielestänne jotain erikoista/muutettavaa?
http://www.phpeasystep.com/workshopview.php?id=6
ajv kirjoitti:
Vasta_alkaja kirjoitti:
<?php # Kirjautumisesta kulkee tieto SESSION -taulussa. Tarkista aina sivun alussa sessio. require_once('MitaNytTarviitkaan.php'); session_start(); if(!$_SESSION['log_key']) { header('location:./VirheSivu.phtml'); } ?>Tuohon ei kannata luottaa että tuollainen sessio löytyy. Itse koodivinkissä tarkastetaan tuon lisäksi, että myös kannasta löytyy vastaava sessio.
Ja tosiaan tänä päivänä kirjoittaisin tuon koodin ehkä _hieman_ erilailla, mutta tuollaisenaan se on ehkä aloittelijaystävällisempi ja sen toiminta täytyy oikeasti tajuta, ennen kuin sitä voi käyttää. Ei ole tarkoituskaan olla mikään copy-paste-2-mbnet -koodi :)
Onko näin. Jos alussa katsoo, että kannasta löytyy samanlainen sessio. Sitten siirrytään seuraavalle sivulle ja tarkastetaan uudelleen. Sitten siirrytään seuraavalle, jne.. Eikö tämä ole tähän sitten varma toimintatapa.
Lisää infoa tästä asiasta kiitos.
No ainakin tuo copy-pastettuna mahdollistaa SQL-injection. Sessioon tallennetaan salasana sellaisenaan. Muutenkin koodi näyttää siltä, että se olisi koodattu kauniilla 90-luvulla :) Ei tuo omanikaan nyt ehkä mikään helmi ole, mutta saleen parempi kun toi :)
Edit: vasta_alkaja kerkesi väliin. Eli @vasta_alkaja. En suoranaisesti osaa sanoa, miten noita sessioita pääsee sorkkimaan, mutta en jotain kriittisempää tehdessä en luottaisi pelkästään siihen, että löytyy sessio, jonka avain on log_key. Sitäpaitsi kun tuo tarkastetaan kannasta jokaisen sivun alussa, on meillä aina käytössä tuo $user-taulukko, josta löytyy kaikki käyttäjän tiedot.
90-luvun yksinkertaisuus on valttia. ;) lol.
Kryptasin salasanan, vielä pitänee mysql_string jne juttuja lisätä sql-injektioiden estämiseksi.
"Sessioon tallennetaan salasana sellaisenaan."
Kryptasin salasanan niin korjaako se tuon vai onko tuo sessioon tallentaminen eri asia? (Mieluummin kysyn kuin katson skriptistä... kun keskustelemalla oppii enemmän, siksi kyselen välillä tyhmiä :) )
EDIT:
Katoinpa silti skriptiin:
session_register("myusername");
session_register("mypassword");
Eli näköjään on eri asia kantaan vai sessioon tallentaminen.
Mites tuon sessioon tallentamisen voi salata siis kryptata?
ajv kirjoitti:
No ainakin tuo copy-pastettuna mahdollistaa SQL-injection. Sessioon tallennetaan salasana sellaisenaan. Muutenkin koodi näyttää siltä, että se olisi koodattu kauniilla 90-luvulla :) Ei tuo omanikaan nyt ehkä mikään helmi ole, mutta saleen parempi kun toi :)
Edit: vasta_alkaja kerkesi väliin. Eli @vasta_alkaja. En suoranaisesti osaa sanoa, miten noita sessioita pääsee sorkkimaan, mutta en jotain kriittisempää tehdessä en luottaisi pelkästään siihen, että löytyy sessio, jonka avain on log_key. Sitäpaitsi kun tuo tarkastetaan kannasta jokaisen sivun alussa, on meillä aina käytössä tuo $user-taulukko, josta löytyy kaikki käyttäjän tiedot.
Jos sivut ovat ssl-suojattuna ei sessiota pääse kuuntelemaan ja näin ollen tieto on suojattuna. Voit myös kriittiset tiedostot ohjata htacces:silla htdocsin ulkopuolelta, jolloin sinun tulee ensin murtautua palvelimelle, jotta pääset tärkeisiin tiedostoihin käsiksi.
Alla on tämän sivun: http://www.phpeasystep.com/workshopview.php?id=6
checklogin.php sivu. Suomensin kommentit ja tein pari "tietoturva" lisäystä.
Kommenttia?
Laitoin isolla fontilla ne 2 kohtaa, kun ainakin kaipaisin apua.
<?php include("/xxxxxx/config/config.php");?> <?php //originaali skripti: http://www.phpeasystep.com/workshopview.php?id=6 //Suomennokset ja kaikki muutokset: Antti K. // Yhteys tietokantaan mysql_connect("$host", "$username", "$password")or die("Ei saa yhteyttä"); mysql_select_db("$db_name")or die("Ei saa yhteyttä tietokantaan"); // tunnus ja salasana, käsitellään tietoturvallisesti $myusername = get_magic_quotes_gpc() ? $_POST['myusername'] : mysql_real_escape_string($_POST['myusername']); $mypassword = get_magic_quotes_gpc() ? $_POST['mypassword'] : mysql_real_escape_string($_POST['mypassword']); //vanha koodi, ei käytetä enää. Kommentoin pois aluksi. /* $myusername=$_POST['myusername']; $mypassword=$_POST['mypassword']; */ // Kryptaa salasana $encrypted_mypassword=md5($mypassword); // Haetaan tietokannan taulusta tunnus ja kryptatty salasana // ONKO ALLA OLEVA OK VAI PITÄÄKÖ TUOHONKIN LAUSEESEEN TUNKEA MYSQL_REAL_ESCAPE_STRING TAI MUITA TARKISTUKSIA??? $sql="SELECT * FROM $tbl_name WHERE username='$myusername' and password='$encrypted_mypassword'"; $result=mysql_query($sql); // Mysql_num_row laskee taulukon rivit $count=mysql_num_rows($result); // Jos tunnus ja salasana löytyy samalta riviltä niin "tulos" on 1. if($count==1){ // Rekisteröi sessiot: tunnus ja salasana. Ja sitten ohjaa käyttäjä kirjautuminen_ok sivulle, joka kertoo mitä sitten tapahtuu. // SESSIOT PITÄNEE MYÖS JOTENKIN SALATA/KRYPTATA? MITEN SE TEHDÄÄN? session_register("myusername"); session_register("mypassword"); header("location:kirjautuminen_ok.php"); } else { // Mitä tulostetaan sivulle, jos tunnus tai salasana väärin echo "Käyttäjätunnus tai salasana väärin"; } ?>
# Ensimmäinen huomautus <?php include("/xxxxxx/config/config.php");?> <?php # Turhaan ensin aloitat php-koodin, sitten lopetat ja taas aloitat <?php include("/xxxxxx/config/config.php"); # Toinen kommentti : # Vaihtaisin tuon include- komennon require_once- komentoon # Jos oikein muistan include- komento ilmoittaa vain varoituksen, jos ladattavalla sivulla on virhe, mutta require_once -ilmoittaa varaoituksen ja lopettaa sivun suorituksen. ( saa selventää :D ) # Mielestäni sessiota ei tarvitse salata, mutta tämä tieto kannattaa viisaampien varmistaa. Jos teet perussivustoja, joilla ei ole oikeasti mitään kriittistä, niin tästä ei kannata huolehtia. Ja jos teet, jotain tärkeää niin käytä myös ssl-suojattua sivua. Tässä tapauksessa vaikka sessionia kuunneltaisiinkin, ei siitä saataisi mitään selvää. # Lisää sessioista : # http://www.cs.jyu.fi/~kolli/ITK215_05/php/?sivu=sessiot # Lisää ssl-suojauksesta : # http://myy.helia.fi/~vanvu/tietoliikenne/internet/tietoturvaprotokollat.html
Ok, kiitos vinkeistä.
(Tosiaan, on niiiiin perussivut kuin vaan voi olla, missä ei mitään salattavaa. Ei kellään voi edes mielenkiinnon vuoksi olla intoa yrittää murtautua tai kyseisiä sivuja terrorisoida...
...toki perustietoturva asiat kannattaa oottaa huomioon näissä alkeellisissakin projekteissa. Hyvä niinhin oppia, kun 10 vuoden päästä saattaa olla isommat projektit niin sitten helppo niitä tehdä kun on pienessäkin projekteissa ottanut huomioon tietoturva-asiat)
Eli periaatteessa toi olis jo ihan jees, juuri sinun mielestä?
Se on varma, että ei kaikkien mielestä. ;)
Joten muilta otetaan parannusehdotuksia vielä.
Ainiin, pitää nuo antamasi linkit käydä läpi, jos sitä kautta osaan itse vielä parannella tätä skriptiä.
EDIT:
Vasta_alkaja, entäs tämä kohta?
// ONKO ALLA OLEVA OK VAI PITÄÄKÖ TUOHONKIN LAUSEESEEN TUNKEA MYSQL_REAL_ESCAPE_STRING TAI MUITA TARKISTUKSIA??? $sql="SELECT * FROM $tbl_name WHERE username='$myusername' and password='$encrypted_mypassword'"; $result=mysql_query($sql);
Tätä myös vielä pohdin:
session_register("myusername"); session_register("mypassword");
Onko tuo "session_register" ihan ok? Kun monessa paikassa käytetään:
$_SESSION['nimi'] = "jotain";
Ja jos joku osaa vielä opastaa, että voinko tuon session_register("myusername");kohdan jotenkin salata niin antaa tulla.
No tuo session_register on tosiaan tuo vanha tapa (liiotellusti "90-luvun tapa", ei nyt oikeesti noin vanha :)). Nykyään voi ja on suositeltavaa käyttää tuota $_SESSION['nimi'] = "jotain"
-tapaa.
Ok, eli olisko se ihan näin?:
$_SESSION['myusername'] = "$myusername"; $_SESSION['mypassword'] = "$mypassword";
EDIT: Vai voiko noi muuttujat olla samannimisiä, kun aiemmin on määritelty noi tunnus ja salasana olemaan myös: $myusername ja $mypassword?
(sori, aika pihalla =) )
Eihän noilla ole mitään yhteyttä perusmuuttujiin, tunnukseen ja salasanaan?
$myusername = get_magic_quotes_gpc() ? $_POST['myusername'] : mysql_real_escape_string($_POST['myusername']); $mypassword = get_magic_quotes_gpc() ? $_POST['mypassword'] : mysql_real_escape_string($_POST['mypassword']);
eli voi olla vaikka näin?
$_SESSION['jeesus'] = "$jeesus_muuttuja_sessiossa"; $_SESSION['jumala'] = "$jumala_muuttuja_sessiossa";
Jos jonkun avustuksella saan nuo muutettua niin sitten pitää ainakin tämä kohta muuttaa toisessa tiedostossa, joka aina tarkistaa onko kirjauduttu:
<? session_start(); if(!session_is_registered(myusername)){ header("location:main_login.php"); } ?>
Mutta mitenköhän? =)
Toisaalta ajv:n koodissa tälläinen:
$_SESSION['log_key'] = $istuntotunnus;
Mikäs tuo "log_key" on? Joku virallinen koodi vai tuulesta temmattu?
tuulesta temmattu!!
käytä
<? session_start(); if(!$_SESSION['myusername']) { header('location:jne...'); } ?>
Antti80 kirjoitti:
Mikäs tuo "log_key" on? Joku virallinen koodi vai tuulesta temmattu?
Se on voimassa olevan session "avain" sinne tietokantaan. Sen avulla voit hakea kannasta käyttäjän tiedot, asetukset yms. mitä ikinä oletkaan käyttäjästä kantaan tallentanut.
Ok, kiitos molemmille.
(mutta "log_key" tilalla voisi lukea vaikka "jeesus" eli se ei mikään virallinen "avain... :) )
Kiitos Vasta_alkaja. Saas nähä mitä saan sähellettyä.. laitan koodia illalla/vlopun aikana.
Joo, mutta log_key tai login_key, mistä tuo on lyhenne ehkä kuvaa tarkoitusta paremmin kuin jeesus :)
Eikö uskonnollinen koodaus olisi kivempaa? ;D
Keksitte välillä niin hienoja sanoja, että pitää jollain erikoisella esimerkillä varmistaa, että onko kyse jostain virallisesta "muuttujasta" vai voiko mitä vaan käyttää.
sehän on ihan tuulesta temmattu, mutta yleensä käytetään tietty helppolukuisia/helppomuistisia, jottei tarvitse kahlata koodia taaksepäin kattoa, että oliko se jeesus vai enkeli...
log_key on ihan ymmärrettävää ja suotavaa myös laittaa ( kuvastaa haluttua toimintaa), mutta vasta aloittelijaa se voi hämätä. Minua itseänikin tuo asia hämäsi, kun ensimmäisen kerran koodiin tutustuin. Vasta $_SESSION, $_REQUEST asioiden selvittyä sain välähdyksen.. "Ai jaa joo se tarkoittaakin vain sitä".
En oo testannut, mutta pitäisi toimia.
<?php # Tulostuu post taulukko, kun painat nappia echo '<div style="border:1px solid black; background:red; color:white;">', print_r($_POST) ,'<br/></pre>'; # Tulostuu post+get jne.. taulukot, kun painat nappia echo '<div style="border:1px solid black; background:green; color:white;">', print_r($_REQUEST) ,'</pre>'; # Eli idea perustuu siihen, että täytettyäsi kentät, # name="kayttajatunnus" # name="salasana" # Ja painettuasi nappia, tiedot lähetetään action kentässä määräämällesi sivulle # Eli tässä tapauksessa tänne. # Kirjautumisesimerkissä, jota käytät ne lähetetään toiselle sivulle, mutta noilla yllä olevilla esimerkeillä saat ne tiedot pihalle. # Toisin sanoen tuo ihmettelemäsi sana log_key, löytyy tuolta taulukosta, kun se sinne lähetetään ajv:n kirjautumisesimerkissä. # Toivottavasti jotain tajusit. ?> <form name="esimerkki" method="post" action=""> <table> <tr> <td> <input type="text" name="kayttajatunnus" value=""> </td> <td> <input type="text" name="salasana" value=""> </td> </tr> <tr> <td> <input type="submit" value="Lähetä sivu"> </td> </tr> </form>
tarkista_kirjaus.php
<?php include("/xxxx/config/config_kirjautuminen.php");?> <?php //originaali skripti: http://www.phpeasystep.com/workshopview.php?id=6 //Suomennokset ja kaikki muutokset: Antti K. // Yhteys tietokantaan mysql_connect("$host", "$username", "$password")or die("Ei saa yhteyttä"); mysql_select_db("$db_name")or die("Ei saa yhteyttä tietokantaan"); // tunnus ja salasana, käsitellään tietoturvallisesti $myusername = get_magic_quotes_gpc() ? $_POST['myusername'] : mysql_real_escape_string($_POST['myusername']); $mypassword = get_magic_quotes_gpc() ? $_POST['mypassword'] : mysql_real_escape_string($_POST['mypassword']); //vanha koodi, ei käytetä enää /* $myusername=$_POST['myusername']; $mypassword=$_POST['mypassword']; */ // Kryptaa salasana $encrypted_mypassword=md5($mypassword); // Haetaan tietokannan taulusta tunnus ja kryptatty salasana // ONKO ALLA OLEVA OK VAI PITÄÄKÖ TUOHONKIN LAUSEESEEN TUNKEA MYSQL_REAL_ESCAPE_STRING TAI MUITA TARKISTUKSIA??? $sql="SELECT * FROM $tbl_name WHERE username='$myusername' and password='$encrypted_mypassword'"; $result=mysql_query($sql); // Mysql_num_row laskee taulukon rivit $count=mysql_num_rows($result); // Jos tunnus ja salasana löytyy samalta riviltä niin "tulos" on 1. if($count==1){ // Rekisteröi sessiot: tunnus ja salasana. Ja sitten ohjaa käyttäjä kirjautuminen_ok sivulle, joka kertoo mitä sitten tapahtuu. // SESSIOT PITÄNEE MYÖS JOTENKIN SALATA/KRYPTATA? MITEN SE TEHDÄÄN? //Vanha tapa, kommentoidaan pois. /* session_register("myusername"); session_register("mypassword"); */ //Uusi tapa sessioille. $_SESSION['myusername'] = "$myusername"; $_SESSION['mypassword'] = "$mypassword"; header("location:kirjautuminen_ok.php"); } else { // Mitä tulostetaan sivulle, jos tunnus tai salasana väärin echo "Käyttäjätunnus tai salasana väärin"; } ?>
kirjautuminen_ok.php
<? session_start(); if(!$_SESSION['myusername']) { header("location:index.php"); } // Tarkistaako onko "myusername" sessio voimassa, jos ei ei ole niin ohjataan sivulle index.php ?> <html> <body> <?php include("admin_valikko.php") ; ?> </body> </html>
Mutta mitään ei tapahdu kun yrittää kirjautua sisään.
("Muutin siis sessiot 2000-luvulle...")
Ongelma lienee tämä kohta?
//Uusi tapa sessioille. $_SESSION['myusername'] = "$myusername"; $_SESSION['mypassword'] = "$mypassword"; header("location:kirjautuminen_ok.php");
Ajattelin, että noi ei saa olla samannimiset kuin alkuperäist "tunnus" ja "salasana" muuttujat, mutta laittaa tohon mitä vaan niin ei auta?
Eikö tuossa voi olla mitä tahansa, kunhan sama session nimi löytyy tästä:
session_start(); if(!$_SESSION['myusername']) { header("location:index.php"); }
EDIT: ja miksi jokaisen sivun alussa vaan tarkistetaan onko tuo "username" sessio voimassa? Eikö pitäisi myös tarkistaa "password" sessio? Tai muuten tämä on ihan turha?
$_SESSION['mypassword'] = "$mypassword";
Laita tämä sivun alkuun ja katso onko session muuttujassa mitään arvoa. Laita tulostus vaikka sitten tänne.
Seuraavaksi lähdetään ihan eka sivulta. Voi kuulostaa tyhmältä, mutta joskus vikaa on hyvä lähteä etsimään ihan alusta.
<table width="300" border="0" align="center" cellpadding="0" cellspacing="1" bgcolor="#CCCCCC"> <tr> <!-- Oletko vaihtanut action kohtaan tiedon mille menet, kun olet kirjautunut. Eli laittanut tunnuksen, salasanan ja painanut nappia. Jos menet sivulle, tiedot_ok.php pitää sen lukea tuossa action:kentässä. --> <form name="form1" method="post" action="checklogin.php"> <td> <table width="100%" border="0" cellpadding="3" cellspacing="1" bgcolor="#FFFFFF"> <tr> <td colspan="3"><strong>Member Login </strong></td> </tr> <tr> <td width="78">Username</td> <td width="6">:</td> <td width="294"><input name="myusername" type="text" id="myusername"></td> </tr> <tr> <td>Password</td> <td>:</td> <td><input name="mypassword" type="text" id="mypassword"></td> </tr> <tr> <td> </td> <td> </td> <td><input type="submit" name="Submit" value="Login"></td> </tr> </table> </td> </form> </tr> </table>
(Olen muuttanut tiedostonimiä)
Tämä on index.php ja action kohta on oikein.
<table class="eka" width="300" border="0" align="center" cellpadding="0" cellspacing="1"> <tr> <form name="form1" method="post" action="tarkista_kirjaus.php"> <td> <table width="100%" border="0" cellpadding="3" cellspacing="1" bgcolor="#F5f5f5"> <tr> <td colspan="3"><strong>Admin kirjautuminen</strong><br /><br /></td> </tr> <tr> <td width="78">Käyttäjätunnus</td> <td width="6">:</td> <td width="294"><input name="myusername" type="text" id="myusername"></td> </tr> <tr> <td>Salasana</td> <td>:</td> <td><input name="mypassword" type="password" id="mypassword"></td> </tr> <tr> <td> </td> <td> </td> <td><br /><input type="submit" name="Submit" value="Kirjaudu sisään"></td> </tr> </table> </td> </form> </tr> </table>
EDIT:
Ton laitoin ihan sivun "tarkista_kirjaus.php" vikaksi kohdaksi.
Se tulostaa sivulle "1"
Kokeillut vaikka, mutta en saa tuon tyylisellä sessio määrityksellä toimimaan. Apuja taas kaivataan. :)
Vasta_alkaja kirjoitti:
Mitä tulee tällä ?
Laitan tuon ihan vikaksi sivulle "tarkista_kirjaus.php" ja sen kun laitan suoraan selaimeen niin tulostuu:
Käyttäjätunnus tai salasana väärin
Array ( ) 1
ps. sulta puuttuu "<" pre-tagin edestä.
joo ja muutenkin kaksi takia sekaisin. pitäisi olla <pre></pre> eikä <div>pre>
Onko ideoita mikä mättää? Mitä korjata?
Vai palaanko vanhaan "sessio-järjestelmääni"... =)
# Kommentoi väliaikaisesti tämä rivi pois. header("location:kirjautuminen_ok.php"); # Tähän joudut kun yrität kirjautua vai ? else { // Mitä tulostetaan sivulle, jos tunnus tai salasana väärin echo "Käyttäjätunnus tai salasana väärin"; } # $sql="SELECT * FROM $tbl_name WHERE username='$myusername' and password='$encrypted_mypassword'"; # Tähän väliin echo '<pre>', $sql ,'</pre>'; $result=mysql_query($sql);
Mitä tämä tulostaa sinulle ?
Ongelmasi on siinä, ettei salasana ja tunnus täsmää. Oletko kokeillut luoda uusia tietokantaa.
Toinen vaihtoehto on vain, että et hae tietoja oikein. Tarkista kaikki tiedon haut.
Helpointa olisi varmasti palata vanhaan, mutta näin sitä oppii. Joudut syvällisemmin tutustumaan jo valmiiseen koodiin.
Ok, voin tuota kokeilla kun kerkiän.
Mutta tosiaan, skripti aikaisemmin toimi loistavasti. Kun vain ajv:n tyyliin muutin sessiot niin silloin ei toimi. Eli vika vain ja ainoastaan sessioissa, niiden tallentamisessa.
------------
EDIT:
Tuo esimerkkisi tulostaa:
Käyttäjätunnus tai salasana väärin
SELECT * FROM admins WHERE username='' and password='d41d89qeqrqrddfdfffgdgdgs800ssfsf998ecfsgsgsqw8427e'
EDIT2:
En tuosta mitään irti saa?
Ja vika siis ainoastaan sessioissa. Mielestäni aikasemmissa viesteissäni selitin aika hyvin tuon sessio-ongelman, hyvien kysymysten kera. Mutta kukaan ei niihin kommentoinut...
EDIT3:
Jos sulla menee sekaisin mun uudelleen nimetyt ja muokatut php-sivut kun vertaat alkuperäiseen linkkiini niin voin copypasteta minun php-sivut jos se auttaa?
Antti80 kirjoitti:
Ok, voin tuota kokeilla kun kerkiän.
EDIT:
Tuo esimerkkisi tulostaa:
Käyttäjätunnus tai salasana väärin
SELECT * FROM admins WHERE username='' and password='d41d89qeqrqrddfdfffgdgdgs800ssfsf998ecfsgsgsqw8427e'
Tuo tulostaa kayttajatunnuksen, joka on tuon mukaan tyhjä sekä salasanan joka on md5-muunnettuna. Eli et löydä käyttäjätunnustasi.
Meinasin jo alkaa kiroamaan, että ei voi olla mahdollista, koska skripti toiminut aikaisemmin ja nyt olen vasta sessioita muuttanut.
Sitten tajusin, että se ilmoittaa tyhjää, koska mun sessiot on merkattu samanlaisiksi kuin originaalit tunnus ja salasana, mutta ei sekään ollut syy.
Sori, mä laitoin selaimeen suoraan ton osoitteen. :D
En siis mennyt edes index.php jossa pitää lomakkeeseen syöttää tunnus ja salasana, nyt menin niin se tulostaa oikein:
SELECT * FROM admins WHERE username='admin' and password=
EDIT:
Joten nyt voin taas toistaa itseäni:
Ja vika siis ainoastaan sessioissa. Mielestäni aikasemmissa viesteissäni selitin aika hyvin tuon sessio-ongelman, hyvien kysymysten kera. Mutta kukaan ei niihin kommentoinut...
https://www.php.net/manual/en/function.session-register.php
Laitappa koko koodisi tänne niin pääsen illalla/huomenna testaamaan sitä. Tällä hetkellä ei ole mahdollisuutta testata.
index.php
<table class="eka" width="300" border="0" align="center" cellpadding="0" cellspacing="1"> <tr> <form name="form1" method="post" action="tarkista_kirjaus.php"> <td> <table width="100%" border="0" cellpadding="3" cellspacing="1" bgcolor="#F5f5f5"> <tr> <td colspan="3"><strong>Admin kirjautuminen</strong><br /><br /></td> </tr> <tr> <td width="78">Käyttäjätunnus</td> <td width="6">:</td> <td width="294"><input name="myusername" type="text" id="myusername"></td> </tr> <tr> <td>Salasana</td> <td>:</td> <td><input name="mypassword" type="password" id="mypassword"></td> </tr> <tr> <td> </td> <td> </td> <td><br /><input type="submit" name="Submit" value="Kirjaudu sisään"></td> </tr> </table> </td> </form> </tr> </table>
tarkista_kirjaus.php
<?php include("/xxx/config/config_kirjautuminen.php");?> <?php //originaali skripti: http://www.phpeasystep.com/workshopview.php?id=6 //Suomennokset ja kaikki muutokset: Antti K. // Yhteys tietokantaan mysql_connect("$host", "$username", "$password")or die("Ei saa yhteyttä"); mysql_select_db("$db_name")or die("Ei saa yhteyttä tietokantaan"); // tunnus ja salasana, käsitellään tietoturvallisesti $myusername = get_magic_quotes_gpc() ? $_POST['myusername'] : mysql_real_escape_string($_POST['myusername']); $mypassword = get_magic_quotes_gpc() ? $_POST['mypassword'] : mysql_real_escape_string($_POST['mypassword']); //tässä vanha koodi, ei käytetä enää. /* $myusername=$_POST['myusername']; $mypassword=$_POST['mypassword']; */ // Kryptaa salasana $encrypted_mypassword=md5($mypassword); // Haetaan tietokannan taulusta tunnus ja kryptatty salasana // ONKO ALLA OLEVA OK VAI PITÄÄKÖ TUOHONKIN LAUSEESEEN TUNKEA MYSQL_REAL_ESCAPE_STRING TAI MUITA TARKISTUKSIA??? $sql="SELECT * FROM $tbl_name WHERE username='$myusername' and password='$encrypted_mypassword'"; $result=mysql_query($sql); // Mysql_num_row laskee taulukon rivit $count=mysql_num_rows($result); // Jos tunnus ja salasana löytyy samalta riviltä niin "tulos" on 1. if($count==1){ // Rekisteröi sessiot: tunnus ja salasana. Ja sitten ohjaa käyttäjä kirjautuminen_ok sivulle, joka kertoo mitä sitten tapahtuu. // SESSIOT PITÄNEE MYÖS JOTENKIN SALATA/KRYPTATA? MITEN SE TEHDÄÄN? //tässä vanha koodi, ei käytetä enää, mutta tällä toimi ennen!!!!!!!!!!!!! /* session_register("myusername"); session_register("mypassword"); */ //Uusi tapa sessioille. $_SESSION['eka'] = "$eka"; $_SESSION['toka'] = "$toka"; header("location:kirjautuminen_ok.php"); } else { // Mitä tulostetaan sivulle, jos tunnus tai salasana väärin echo "Käyttäjätunnus tai salasana väärin"; } ?>
kirjautuminen_ok.php
<? session_start(); if(!$_SESSION['eka']) { header("location:index.php"); } // Tarkistaako onko "myusername" sessio voimassa, jos ei ei ole niin ohjataan sivulle index.php //TÄSSÄ VIELÄ SE VANHA TAPA MILLÄ PELASI, JOS KÄYTETTIIN SITÄ SESSION_REGISTER /* <?php session_start(); if(!session_is_registered(myusername)){ header("location:index.php"); } ?> */ ?> <html> <body> <? include("admin_valikko.php") ; ?> </body> </html>
admin_valikko.php
<? session_start(); if(!$_SESSION['eka']) { header("location:index.php"); } // Tarkistaako onko "eka" sessio voimassa, jos ei ei ole niin ohjataan sivulle index.php //TÄSSÄ VIELÄ SE VANHA TAPA MILLÄ PELASI, JOS KÄYTETTIIN SITÄ SESSION_REGISTER /* <?php session_start(); if(!session_is_registered(myusername)){ header("location:index.php"); } ?> */ ?> <html> jne..... <a href="admin_harjoitusajat_muokkaus.php">Muokkaa harjoitusajat sivua</a> jne.... </html>
Eli kun laittaa tunnuksen ja salasanan ja yrittää kirjautua sisään niin mitään ei tapahdu, muuta kuin tunnus ja salasana kentät tyhjenee.
Alkuperäisillä "session_register" jutuilla tämä toimi, mutta kun tuo $_session paljon uudempi (parempi?) niin olisi se kiva ottaa käyttöön...
<?php //Uusi tapa sessioille. $_SESSION['eka'] = "$eka"; $_SESSION['toka'] = "$toka"; ?>
Mistä noi $eka ja $toka tulee? Ja ei muuttujia pidä laittaa mihkään lainausmerkkeihin (vaikka se nyt toimisikin niin).
Jep, ongelma on juuri tuossa kohtaa, kun en tuota ollenkaan ymmärrä miksi sessiolle pitää antaa jokin muuttuja tai joku arvo?
Nuo "eka" ja "toka" on ihan tuulesta temmattu. Olen siihen kokeillut myös jeesusta ;) ja "myusername" ja "mypassword". Mutta millään ei onnistu.
EDIT: Oho, lainausmerkit turhaan... mutta tuskin niiden poistaminen ratkaisee ongelmaa?
Antti80 kirjoitti:
Jep, ongelma on juuri tuossa kohtaa, kun en tuota ollenkaan ymmärrä miksi sessiolle pitää antaa jokin muuttuja tai joku arvo?
Onkohan sulla jäänyt nyt yksi ohjelmoinnin perusasia ymmärtämättä, jos et tiedä miksi muuttujalle pitää antaa arvo... :) Ja sinunhan se pitäisi itse koodaajana parhaiten tietää mitä muuttujia käytät ja mitä arvoja niille annat. Tuosta on ehkä vähän vaikee auttaa, kun ei oikeesti tiedä mitä sä haluut tolla tehä ja en jaksa tuhlata tuntia lukemalla näitä 50 viestiä läpi... :)
Heh :)
No toki tavalliselle muuttujalle yksi arvo niin on simppeli homma... Nämä erikoisemmat tapaukset tuottaa hankaluuksia.
Ei sun ois tarvinnut lukea aikaisemmin mun yks viesti ni olisit heti ymmärtänyt mistä kyse. Ja vielä kun kaikki koodit copypastesin ja lukee kommentit niin juuri siitä näkee helposti millä tavalla sain sessiot toimimaan ja millä tavalla en. :)
Vielä kun Vasta_alkaja kertoi tämän tarkistus koodin:
<? session_start(); if(!$_SESSION['eka']) { header("location:index.php"); }
niin mitä ihmettä pitäis erilailla laittaa noi sessio muuttujat? Ei voi mitenkä ymmärtää...
EDIT: Kysyn niin yksinkertaista asiaa :)
EDIT2:
Otin tämän vanhan kohdan käyttöön:
//Vanha tapa, kommentoidaan pois. session_register("myusername"); session_register("mypassword"); header("location:kirjautuminen_ok.php");
Ja jokaiseen salasivuun tämä uusi tarkistus:
<? session_start(); if(!$_SESSION['myusername']) { header("location:index.php"); }
Noin toimii noinkin! :)
Enää pitää ratkaista miten tämän kohdan merkkaan, jos en tuota ajv:n sanomaa 90 luvun koodausta halua käyttää...
$_SESSION['???'] = $???; $_SESSION['???'] = $???;
<?php # Ei näin ei.. //Uusi tapa sessioille. $_SESSION['eka'] = "$eka"; $_SESSION['toka'] = "$toka"; <input name="myusername" type="text" id="myusername"> # Huomaa kohta name="myusername" on arvo mikä lähetetään. Ei eka, eikä toka. # Eli näin $_SESSION['myusername'] = "$myusername"; $_SESSION['mypassword'] = "$mypassword"; #Tämä sinne toiselle sivulle session_start(); if(!$_SESSION['myusername']) { header("location:index.php"); } # Eikä 'eka' session_start(); if(!$_SESSION['eka']) { header("location:index.php"); } ?>
Noi, "eka" ja "toka" oli ihan tuulesta temmattu kun päätin kokeilla käykö mikä vaan. Sori, että tuollaista koodia lähetin.
Esimerkkisi on kaiken järjen mukaan oikein ja niin olen mielestäni monta kertaa testannutkin! :) ...mutta mitään ei tapahdu.
Voin illalla vielä kotona varmistaa, että onhan minulla ollut juuri noin. Mielestäni on ollut, enkös tuollakin tavalla jossain viestissä näyttänytkin, että tuollakaan tavalla ei toimi. No testaan kotona vielä...
$_SESSION['myusername'] = "$myusername"; $_SESSION['mypassword'] = "$mypassword"; # Jätä pois loppu, eli näin $_SESSION['myusername']; $_SESSION['mypassword'];
Ok, toi voisi ehkä toimiakin. Tosin en ymmärrä mitä haittaa olisi tuosta muuttujan tekemisestä...
(AJV:lle tiedoksi, että tää oli just se kohta kun jumitin...)
Kotona illalla pääsen vasta testaa.
Vasta_alkaja vielä kuitenkin toistan yhen kysymyksen:
//Sala-sivujen tarkistuskoodi. session_start(); if(!$_SESSION['myusername']) { header("location:index.php"); }
Miksi tarkistamme vain "myusername-session" olemassaolon?
Pitäisi myös tarkistaa "mypassword-session" olemassaolo?
Tai sitten tämä session määritys on ihan turhaan:
$_SESSION['mypassword'] = "$mypassword";
Vai?
if((!$_SESSION['myusername']) && (!$_SESSION['myusername']))
Voithan sinä senkin tarkistaa.
Juuri tota hain takaa, kiitos. Toisaalta ei se mielestäni mitään lisäturvaa tuo?
Jos joku osaa saada selville voimassa olevan "username-session" niin miksi ei myös "password-sessiota"...
Tuota ei ollut originaalissa koodissakaan, mitä ihmettelin. Oli miten oli niin voihan tuon salasana-session tarkistuksen lisätä...
Hmm...
Vielä rupesin miettimään tuota session tarkoitusta?
Eli jos lomakkeeseen on syötetty oikea tunnus ja salasana niin sitten tehdään tuollainen "sessio" joka on voimassa "selaimessa" kunnes selain menee kiinni tai kirjaudutaan ulos. Mikä hyöty tuosta siis on kun voitaisiin helposti ilman sessiota tarkistaa kannasta tunnus ja salasana ja sitä kautta päästää käyttäjä läpi?
*bling*
Nyt sytytti, että ainakin tuo salasivujen tarkistuskoodi on paljon helpompi/yksinkertaisempi kun ollaan sessio tehty eli tämä:
//Sala-sivujen tarkistuskoodi. session_start(); if(!$_SESSION['myusername']) { header("location:index.php"); }
Onko muuta hyötyä?
Joo, ei tuo lisää turvaa tuo. Noitahan vois arpoo noita sessiomuuttujia vaikka pari sataa tonne ja tarkastaa aina kaikki, mut se on aika lailla ihan turhaa. Kannattaa kuljettaa siellä sessiossa vain sellaista dataa, jota oikeasti tarvitset. Mikäli kärryillä olen, tuo password-sessio on ihan turha ja muutenkin kyseenalaista tallettaa sessioon salasanaa...
Antti80 kirjoitti:
Hmm...
Vielä rupesin miettimään tuota session tarkoitusta?
Eli jos lomakkeeseen on syötetty oikea tunnus ja salasana niin sitten tehdään tuollainen "sessio" joka on voimassa "selaimessa" kunnes selain menee kiinni tai kirjaudutaan ulos. Mikä hyöty tuosta siis on kun voitaisiin helposti ilman sessiota tarkistaa kannasta tunnus ja salasana ja sitä kautta päästää käyttäjä läpi?*bling*
Nyt sytytti, että ainakin tuo salasivujen tarkistuskoodi on paljon helpompi/yksinkertaisempi kun ollaan sessio tehty eli tämä://Sala-sivujen tarkistuskoodi. session_start(); if(!$_SESSION['myusername']) { header("location:index.php"); }Onko muuta hyötyä?
No siis ei tota "kirjautumista" nyt oikein muuten voi tehdä kun sessiolla tai kekseillä. "...ilman sessiota tarkistaa kannasta tunnus ja salasana ja sitä kautta päästää käyttäjä..." Siis miten sä tän tarkistat jos sulla ei oo sessiota?
ajv kirjoitti:
Joo, ei tuo lisää turvaa tuo. Noitahan vois arpoo noita sessiomuuttujia vaikka pari sataa tonne ja tarkastaa aina kaikki, mut se on aika lailla ihan turhaa.
Aivan, ok.
ajv kirjoitti:
Kannattaa kuljettaa siellä sessiossa vain sellaista dataa, jota oikeasti tarvitset. Mikäli kärryillä olen, tuo password-sessio on ihan turha ja muutenkin kyseenalaista tallettaa sessioon salasanaa...
Se tosiaan on turha.
Ah! Kohta ajv repii pelihousunsa. Nyt viimeistään tajusin, että sessiossa kuljetaan tuo "tunnus". Sitä juuri aikaisemmin yritin selvittää että voiko olla mitä vaan niin kuin se "eka". Nyt tää sessio asia alkaa selkenee. :)
ajv kirjoitti:
No siis ei tota "kirjautumista" nyt oikein muuten voi tehdä kun sessiolla tai kekseillä. "...ilman sessiota tarkistaa kannasta tunnus ja salasana ja sitä kautta päästää käyttäjä..." Siis miten sä tän tarkistat jos sulla ei oo sessiota?
Hmm...Onko se tosiaan niin, että ihan puhtaasti tarkistamalla tunnusta ja salasanaa kannasta niin ei voi "kirjautumista" tarkistaa. Niin no, kuulostaakin tyhmältä. Eli on toi sessio aika hyödyllinen sittenkin :D
ajv kirjoitti:
En suoranaisesti osaa sanoa, miten noita sessioita pääsee sorkkimaan, mutta en jotain kriittisempää tehdessä en luottaisi pelkästään siihen, että löytyy sessio, jonka avain on log_key. Sitäpaitsi kun tuo tarkastetaan kannasta jokaisen sivun alussa..
Redundanttia jos sessiot löytyvät valmiiksi kannasta (manuaalin kommenteista löytynyt esimerkki, Developer Tutorialsin tutoriaali). Jos sessiot taasen löytyvät tiedostoina, silloin hyökkääjä on jo päässyt muuttamaan serverin tiedostoja, ja tässä vaiheessa salasanojen urkkiminen yms. on helppoa muokattujen tiedostojen avulla. Näin kuvittelisin, mene ja tiedä sitten..
Ps. Ei niitä muuttujia tartte hukuttaa lainausmerkkeihin (viitaten $var1 = "$var2"; merkintöihin)
Hetkonen, älä ajv menetä hermojasi. :) Vielä jäin jumittamaan tuota kirjautumista. Siis pakkohan se on jollain tapaa onnistua.
lomake.php
kirjoita tunnus ja salasana:
action=salasivu.php
salasivu.php
if kirjoitettu tunnus ja salasana löytyy samasta rivistä kannasta niin päästä sisään tälle salasivulle.
Session käyttäminen paljon tietoturvallisempaa, mutta eikö muka tohon tyyliin onnistu kirjatumisen tarkistus, ilman keksiä tai sessiota?
(Sori karkee esimerkki, mutta varmaan tajusit?)
Kun kirjaudut sisään, luot itsellesi sessio tunnuksen. Ilman tätä sessiotunnusta ei pääse kyseiselle sivulle.
Jos sinulla on index.php sivu josta kirjaudut sivulle tanne.php luot index.php sivulla tunnuksellasi ja salasanallasi session joka hyväksytään. Tämä sessio antaa sinulle oikeuden mennä sivulle tanne.php.
kokeile osoitteesi esim : kansio\index.php <-- Täältä kirjaudut
kokeile osoitteesi esim : kansio\tanne.php <-- Tänne et saa päästä ennen kirjautumista. Jos pääset, hommasi ei toimi.
Eli ilman sivun alussa olevaa tarkistusta, tällä hetkellä sessio. tuonne kansio\tanne.php sivulle pääsee kirjoittamalla sen osoiteriville.
session_start(); if(!$_SESSION['myusername']) { header("location:index.php"); }
Ota tuo pois ja kokeile mennä kansio\tanne.php osoitteeseen kirjoittamalla se osoiteriville. Laita edellämainittu pätkä uudelleen ja kokeile uudestaan niin näet.
Kokeile myös aikaisemmin ilmoittamani esimerkkki :
<?php # Tulostuu post taulukko, kun painat nappia if(!empty($_POST)) echo '<div style="border:1px solid black; background:red; color:white;"><pre>Täältä löydät post taulukon asiat :', print_r($_POST) ,'<br/></pre></div>'; # Tulostuu post+get jne.. taulukot, kun painat nappia if(!empty($_REQUEST)) echo '<div style="border:1px solid black; background:green; color:white;"><pre>Täältä löydät laajemmin asiat :', print_r($_REQUEST) ,'</pre></div>'; # Eli idea perustuu siihen, että täytettyäsi kentät, # name="kayttajatunnus" # name="salasana" # Ja painettuasi nappia, tiedot lähetetään action kentässä määräämällesi sivulle # Eli tässä tapauksessa tänne. # Kirjautumisesimerkissä, jota käytät ne lähetetään toiselle sivulle, mutta noilla yllä olevilla esimerkeillä saat ne tiedot pihalle. # Toisin sanoen tuo ihmettelemäsi sana log_key, löytyy tuolta taulukosta, kun se sinne lähetetään ajv:n kirjautumisesimerkissä. # Toivottavasti jotain tajusit. ?> <form name="esimerkki" method="post" action=""> <table> <tr> <td> <input type="text" name="kayttajatunnus" value=""> </td> <td> <input type="text" name="salasana" value=""> </td> </tr> <tr> <td> <input type="submit" value="Lähetä sivu"> </td> </tr> </form>
Antti80 kirjoitti:
sic eikö muka tohon tyyliin onnistu kirjatumisen tarkistus, ilman keksiä tai sessiota?
Onnistuu. Koodihan sulla onkin jo valmiina, jätät vaan keksit ja sessiot luomatta. Joudut sitten kirjoittamaan salasanan ja tunnuksen aina kun tahdot päästä salasivullesi.
Kiitos vasta_alkaja, mutta juuri noin olen itsekin tehnyt ja ymmärrän miten sessio toimii tuossa tarkistuksena. Kaikki esimerkissäsi on aivan selvää. :)
Kaikkihan toimi sillä session_register jutulla, joten "kaikki" ok.
Mutta kun otettiin tämä uudempi tapa käyntiin:
$_SESSION['myusername'] = "$myusername"; $_SESSION['mypassword'] = "$mypassword";
Niin ei toimi.
Viimeisin vinkkisi oli, että tee näin:
# Jätä pois loppu, eli näin $_SESSION['myusername']; $_SESSION['mypassword'];
Tuon pääsen vasta illalla testaamaan, toivottavasti toimii.
Antti80 kirjoitti:
Hetkonen, älä ajv menetä hermojasi. :) Vielä jäin jumittamaan tuota kirjautumista. Siis pakkohan se on jollain tapaa onnistua.
lomake.php
kirjoita tunnus ja salasana:
action=salasivu.phpsalasivu.php
if kirjoitettu tunnus ja salasana löytyy samasta rivistä kannasta niin päästä sisään tälle salasivulle.Session käyttäminen paljon tietoturvallisempaa, mutta eikö muka tohon tyyliin onnistu kirjatumisen tarkistus, ilman keksiä tai sessiota?
(Sori karkee esimerkki, mutta varmaan tajusit?)
Joo, onnistuu "kirjautumisen" tekeminen toki noinkin, mutta tuolla tavalla joudut joka sivunlatauksella kirjottamaan sen tunnuksen ja salasanan jonnekkin formiin. Ei kovin käyttäjäystävällistä.
Edit: hidas
tsuriga kirjoitti:
Antti80 kirjoitti:
sic eikö muka tohon tyyliin onnistu kirjatumisen tarkistus, ilman keksiä tai sessiota?
Onnistuu. Koodihan sulla onkin jo valmiina, jätät vaan keksit ja sessiot luomatta. Joudut sitten kirjoittamaan salasanan ja tunnuksen aina kun tahdot päästä salasivullesi.
Aivan, sitä minäkin. Tyhmää, mutta mahdollista.
Ehkä ajv ajatteli, että tuo niin älytöntä, että ei katsonut sitä "mahdolliseksi"? =)
EDIT:
AJV kerkes jo kuittaamaan, aivan kuten ajattelin.
No niin, tämäkin selvisi. Kiitos :)
ps. Ainoa ongelma tosiaan on enää toi mitä "vasta_alkajalle" vastasin. Pääsen vasta illalla testaamaan...
Heh, ei tuomi tuollakaan tavalla.
Jos nuo kaksi riviä muuttaa näin:
session_register("myusername"); session_register("mypassword");
Niin toimii :)
Kohta pitää tähän tyytyä? Tähän "90-luvun" koodiin ;)
Ny on Vasta_alkajalla kyllä tullu joku ajatusvirhe... Eihän tollasilla riveillä ole mitään virkaa :) Eli kyllä tuo
$_SESSION['myusername'] = "$myusername"; $_SESSION['mypassword'] = "$mypassword";
on se oikea tapa. Mutta kuten tässäkin keskustelussa muutamaan otteeseen todettu, ei lainausmerkkejä muuttujien ympärille. Eli:
$_SESSION['myusername'] = $myusername; $_SESSION['mypassword'] = $mypassword;
Haa,
Kiitoksia ajv. Tulit päivämme pelastamaan.. Nuo lainausmerkit on käskettu poistamaan jo kauan aikaa sitten ja sitä ei ole tapahtunut. Pitäisi varmaan keskittyä joskus. :D
Olkaa hyvä :) Olis ihan kiva joskus olla väärässäkin, mut se on vaikeeta ku on aina oikeessa ;)
"Kerran olin väärässä, mutta erehdyin" :)
Aijoo, minäkin silmät sokeena copypastettanut tuota koodia noilla lainausmerkeillä. Mutta pitänee silti teidät palauttaa maan pinnalle eli mielestäni olen jo monta kertaa testannut ilman noita lainausmerkkejäkin ja ei ei toimi! :)
(Hitto... eikai vaan muistini pätki, pitää kotona vielä kerran testata ilman lainausmerkkejä ja tuun vasta sitten oikeesti avautumaan) =)
@Antti80: Palautan sinut maan pinnalle kertomalla, että niillä lainausmerkeillä ei ole minkäänlaista merkitystä tuossa tilanteessa :)
Heh, isku iskusta. Niinhän se olikin. :)
Eli varmaan se jo siis kertonee ilman testausta, että tuo skriptini ei toimi on sitten näin:
$_SESSION['myusername'] = "$myusername"; $_SESSION['mypassword'] = "$mypassword";
tai näin:
$_SESSION['myusername'] = $myusername; $_SESSION['mypassword'] = $mypassword;
Ainoa tapa millä siis toimii on:
session_register("myusername"); session_register("mypassword");
Mitäs poijaat nyt sanotte?
(ajv: Miten on mahdollista, että 90-luvun koodi hakkaa 2000-luvun? ;)
Joo, taitanee johtua enemmänkin koodin tekijästä, mutta silti...)
tai näin:
$_SESSION['myusername'] = $myusername; $_SESSION['mypassword'] = $mypassword;
laitappa tuota ennen
echo '$myusername'; echo '$mypassword';
Katotaan mitä arvoja ne sisältävät. ja myös se header pois, niin ei ohjaudu mihinkään vaan jää sivulle.
Ok, pitänee testata. Kotona illalla.
(Ehkä en sit ihan oikein viel tajunnut tota sessiota, että onko se joku ihan erillinen juttu vai kuljettaako se nimen omaa sisällään tuon alkuperäisen tunnukseni ja siksi se pitää olla "nimetty" myusername....)
@Vasta_alkaja: Edelleenkään niitä hipsuja tai lainausmerkkejä ei tarvi laittaa muuttujien ympärille.
@Antti80: Jos sulla on register_globals -asetus php:n konffeissa päällä, sulla on nyt samannimiset muuttujat (esim. $_SESSION['myusername'] ja $myusername), joka varmasti aiheuttaa sekaannusta. Eli pikkuisen muutat jompaa kumpaa, niin ei tule mitään ongelmia sen suhteen.
Vasta_alkaja kirjoitti:
echo '$myusername';
echo '$mypassword';
Tulostus tulee olemaan seuraava
$myusername$mypassword
Sessiosta löytyy, mitä sessioon laittaa. Sulta puuttuu session_start(); sivun alusta, veikkaan ma'.
Olga kirjoitti:
@Vasta_alkaja: Edelleenkään niitä hipsuja tai lainausmerkkejä ei tarvi laittaa muuttujien ympärille.
@Antti80: Jos sulla on register_globals -asetus php:n konffeissa päällä, sulla on nyt samannimiset muuttujat (esim. $_SESSION['myusername'] ja $myusername), joka varmasti aiheuttaa sekaannusta. Eli pikkuisen muutat jompaa kumpaa, niin ei tule mitään ongelmia sen suhteen.
Se on juuri alusta alkaen ollut yksi mun epäilys, ja siksi laitoin sessioiden nimeksi juuri jotain muuta kuten "eka". Mutta ei toiminut niinkään =)
EDIT: Ja ymmärsin muiden viesteistä, että session nimi pitää olla juurikin "myusername".
EDIT2:
"Sessiosta löytyy, mitä sessioon laittaa. Sulta puuttuu session_start(); sivun alusta, veikkaan ma'."
Kaikki salasivut tarkistetaan näin:
session_start(); if(!$_SESSION['myusername']) { header("location:index.php"); }
Joten se ei puutu
tsuriga kirjoitti:
Vasta_alkaja kirjoitti:
echo '$myusername';
echo '$mypassword';Tulostus tulee olemaan seuraava
$myusername$mypasswordSessiosta löytyy, mitä sessioon laittaa. Sulta puuttuu session_start(); sivun alusta, veikkaan ma'.
Sessiosta löytyy mitä sinne laittaa. Kyllä. Mutta sessioon laitetaan muuttuja, jonka täytyy sisältää arvoa.
Eli ennen laittoa olisi syytä katsoa mitä muuttuja sisältää. Eli jos tarkistat muuttujan
$eka = ei sen arvo ole $eka, jos et ole tehnyt muuttujaa $eka = $eka, eikä siinä ole mitään järkeä.
Hmm... ok kai :)
Ainoa tapa millä siis toimii on:
session_register("myusername");
session_register("mypassword");
Tuossahan on sessiolle annettu arvo, mutta ei ole mitään muuttujaa. Eikö? Vai mitenköhän tuo luetaan/tulkitaan?
Heh, en tiedä mitä tällä hain edes takaa. =)
Ehkä parempi unohtaa pilkun viilaukset ja pohtia miksi se sessio ei toimi vaikka tekee mitenpäin vaan sen =) (Tai siis session_register toki ainoana tyylinä toimii)
Tosiaan, kotona testailen sitä echoa ja mitä arvoja saadaan missäkin välissä.
Vasta_alkajalle: single quoted strings
session_register@manual kirjoitti:
If session_start() was not called before this function is called, an implicit call to session_start() with no parameters will be made. $_SESSION does not mimic this behavior and requires session_start() before use.
Millanen se sun koko koodis on tällä hetkellä? Vieläkin veikkaisin, että sulta vaan puuttuu se session_startti (tai sulla on erittäin vanha versio PHP:stä).
tsuriga kirjoitti:
Millanen se sun koko koodis on tällä hetkellä? Vieläkin veikkaisin, että sulta vaan puuttuu se session_startti (tai sulla on erittäin vanha versio PHP:stä).
Katso ekalta sivulta viestini: Antti80 [23.09.2007 11:27:00]
Siinä olen copypastettanut 4 sivua.
Tosin siinä koodissa oli muistaakseni sessiot nimetty vielä väärin ja ties mitä?
Mutta näet, että session startit on oikessa ja tarvittavissa paikoissa?
Kotona illalla voin uudestaan copypasteta koodit kokonaan jos ei "echo testien" jälkeenkään ratkea ongelma....
EDIT: Kotisivutilan tarjoaja kertoo: "PHP:stä on tällä hetkellä asennettuna versio 5.2.3." Jos tätä hait takaa.
(Mahdollisesti mulla vielä PHP4 versio käytössä...)
EDIT2:
ISO HUOM! Toki vika voi olla missä vaan, mutta kuten todettu että tuo skriptini toimii täydellisesti jos sessiot on näin määritelty:
session_register("myusername"); session_register("mypassword");
Ja tällä tavalla kun sessiot määritellään niin koko skripti ei toimi:
$_SESSION['myusername'] = $myusername; $_SESSION['mypassword'] = $mypassword;
(on sitten lainausmerkkejä tai mitä hipsuja miten vaan, tai ilman muuttujia)
Se toki voi olla mahdollista, että jos sessiot noin määritän niin sitä kautta jos koko koodia pitää jossain kohtaa muuttaa... niin se lienee mahdollista?
EDIT3:
Kuten aikaisemmin todettiin niin salasanan sessio määritys on aivan turha ja sitä edes tarkisteta koskaan niin sen otan vielä pois, mutta se ei varmasti ongelmaa ratkaise.
Vasta_alkaja kirjoitti:
tai näin:
$_SESSION['myusername'] = $myusername; $_SESSION['mypassword'] = $mypassword;laitappa tuota ennen
echo '$myusername'; echo '$mypassword';Katotaan mitä arvoja ne sisältävät. ja myös se header pois, niin ei ohjaudu mihinkään vaan jää sivulle.
Tein vieläpä näin:
echo $myusername; echo $mypassword; //Uusi tapa sessioille. Toimiikohan? Ei $_SESSION['myusername'] = $myusername; $_SESSION['mypassword'] = $mypassword; /*header("location:kirjautuminen_ok.php");*/ echo $myusername; echo $mypassword;
Niin se tulostaa sivuille:
admin salasana admin salasana
Tästä mitään hyötyä? Ei varmaan.
EDIT:
Tässä vielä skriptini:
index.php
<table class="eka" width="300" border="0" align="center" cellpadding="0" cellspacing="1"> <tr> <form name="form1" method="post" action="tarkista_kirjaus.php"> <td> <table width="100%" border="0" cellpadding="3" cellspacing="1" bgcolor="#F5f5f5"> <tr> <td colspan="3"><strong>Admin kirjautuminen</strong><br /><br /></td> </tr> <tr> <td width="78">Käyttäjätunnus</td> <td width="6">:</td> <td width="294"><input name="myusername" type="text" id="myusername"></td> </tr> <tr> <td>Salasana</td> <td>:</td> <td><input name="mypassword" type="password" id="mypassword"></td> </tr> <tr> <td> </td> <td> </td> <td><br /><input type="submit" name="Submit" value="Kirjaudu sisään"></td> </tr> </table> </td> </form> </tr> </table>
tarkista_kirjaus.php
<?php include("/home/config/config_kirjautuminen.php");?> <?php //originaali skripti: http://www.phpeasystep.com/workshopview.php?id=6 //Suomennokset ja kaikki muutokset: Antti K. // Yhteys tietokantaan mysql_connect("$host", "$username", "$password")or die("Ei saa yhteyttä"); mysql_select_db("$db_name")or die("Ei saa yhteyttä tietokantaan"); // tunnus ja salasana, käsitellään tietoturvallisesti $myusername = get_magic_quotes_gpc() ? $_POST['myusername'] : mysql_real_escape_string($_POST['myusername']); $mypassword = get_magic_quotes_gpc() ? $_POST['mypassword'] : mysql_real_escape_string($_POST['mypassword']); //vanha koodi, ei käytetä enää /* $myusername=$_POST['myusername']; $mypassword=$_POST['mypassword']; */ // Kryptaa salasana $encrypted_mypassword=md5($mypassword); // Haetaan tietokannan taulusta tunnus ja kryptatty salasana // ONKO ALLA OLEVA OK VAI PITÄÄKÖ TUOHONKIN LAUSEESEEN TUNKEA MYSQL_REAL_ESCAPE_STRING TAI MUITA TARKISTUKSIA??? $sql="SELECT * FROM $tbl_name WHERE username='$myusername' and password='$encrypted_mypassword'"; $result=mysql_query($sql); // Mysql_num_row laskee taulukon rivit $count=mysql_num_rows($result); // Jos tunnus ja salasana löytyy samalta riviltä niin "tulos" on 1. if($count==1){ // Rekisteröi sessiot: tunnus ja salasana. Ja sitten ohjaa käyttäjä kirjautuminen_ok sivulle, joka kertoo mitä sitten tapahtuu. // SESSIOT PITÄNEE MYÖS JOTENKIN SALATA/KRYPTATA? MITEN SE TEHDÄÄN? //Vanha tapa, kommentoidaan pois. MUTTA TÄMÄ TOIMII!!!!!!!!! MIKÄÄN MUU EI!!!!!! /* session_register("myusername"); header("location:kirjautuminen_ok.php"); */ //Uusi tapa sessioille. Toimiikohan? Ei /* $_SESSION['eka'] = $myusername; $_SESSION['toka'] = $mypassword; header("location:kirjautuminen_ok.php"); */ //Uusi tapa sessioille. Toimiikohan? Ei /* $_SESSION['myusername']; $_SESSION['mypassword']; header("location:kirjautuminen_ok.php"); */ //Uusi tapa sessioille. Toimiikohan? Ei $_SESSION['myusername'] = $myusername; header("location:kirjautuminen_ok.php"); } else { // Mitä tulostetaan sivulle, jos tunnus tai salasana väärin echo "Käyttäjätunnus tai salasana väärin"; } ?>
kirjautuminen_ok.php
<? session_start(); if(!$_SESSION['myusername']) { header("location:index.php"); } // Tarkistaako onko "myusername" sessio voimassa, jos ei ei ole niin ohjataan sivulle index.php ?> <html> <body> <?php include("admin_valikko.php") ; ?> </body> </html>
admin_valikko.php
<? session_start(); if(!$_SESSION['myusername']) { header("location:index.php"); } // Tarkistaako onko "myusername" sessio voimassa, jos ei ei ole niin ohjataan sivulle index.php ?> <html> <head> <title>Admin valikko</title> <style type="text/css"> body{font:11px verdana;} table {background-color: #f5f5f5;border: 2px solid #0099CC;font:11px verdana; color:black;padding: 10px;} A{FONT-SIZE: 11px; FONT-WEIGHT: bold; COLOR: #0099CC; FONT-FAMILY: Verdana, Arial, sans-serif; TEXT-DECORATION: none;} A:active {FONT-SIZE: 11px; FONT-WEIGHT: bold; COLOR: #0099CC; FONT-FAMILY: Verdana, Arial, sans-serif; TEXT-DECORATION: none;} A:visited {FONT-SIZE: 11px; FONT-WEIGHT: bold; COLOR: #0099CC; FONT-FAMILY: Verdana, Arial, sans-serif; TEXT-DECORATION: none;} A:hover {FONT-SIZE: 11px; FONT-WEIGHT: bold; COLOR: red; FONT-FAMILY: Verdana, Arial, sans-serif; TEXT-DECORATION: underline;} </style> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> </head> <body bgcolor="#CCCCCC" TEXT="black" ALINK="#074752" LINK="#074752" VLINK="#074752"> <center> <table cellspacing="6" cellpadding="6" width="500"><tr><td> <br /><br /> <a href="admin_harjoitusajat_muokkaus.php">Muokkaa harjoitusajat sivua</a> <br /><br /><br /><br /> <a href="">Muokkaa xxxxxxxxxx sivua</a> (ei valmis) <br /><br /><br /><br /> <a href="">Muokkaa xxxxxxxxxx sivua</a> (ei valmis) <br /><br /><br /><br /> </td></tr></table><br /><br /> <a href="kirjaudu_ulos.php">KIRJAUDU ULOS</a> </center> </body> </html>
Vielä muistutan:
Skripti toimii session_register tyylillä, mutta ei $_session tyylillä.
(kts. tarkista_kirjaus.php)
1. Voiko mun skripti olla sellainen, että tuon $_session ei vaan tohon jostain kumman syystä käy?
2. Jos käytän tuota $_session niin sen takia pitäis muuttaa jossain kohti koodia jotenkin? Esim. tarkistuskoodia joka on jokaisen salatun sivun alussa?
3. Mikä muu?
Melkein pitäis kalja tarjota, joka tämän ratkaisee :)
ps. Nyt tästä uudesta koodista otin myös pois tämän:
$_SESSION['mypassword'] = $mypassword;
Koska se oli ihan turha.
Ensimmäisenä pistää silmään ainakin tuo, että tarkista_kirjaus.php -sivun alusta puuttuu session_start(), niinkuin tuolla aikaisemminkin näköjään veikkailtiin.
Mutta eihän se sivu tarvitse vielä mitään session aloitusta, kun vasta siinä tiedostossa tehdään se itse sessio vai?
Ja jälleen tuonkin ehdotuksen voisi kumota sillä verukkeella, että edelleen se "session_register" versio toimii tuossa ilman, että on mitään session aloitusta tuossa "tarkista_kirjaus.php" sivussa...
EDIT: SANANI SYÖN! TUO TOIMII! :)
Olga, olen kaljan velkaa :D
Lisäsin vain tämän rivin:
<? session_start(); ?>
tarkista_kirjaus.php tiedostoon ekaksi niin nyt toimii.
Nyt en vaan ymmärrä miksi "session_register" toiminto ei vaatinut tuota?? :)
MAHTAVAA, NYT TOIMII! :)
EDIT2: Tai tsurigahan taisi tuota eka ehdottaa, mutta en uskonut =)
Juuri sen takia, että skripti toimi ilman mitään session aloitusta tuolla "session_register" jutulla. Anteeksi ja kiitos! :))
Oi onnistumisen riemua, ohjelmoinnin suola :)
Kuten manuaalia aiemmin lainasin, session_register() kutsuu session_starttia(), mikäli näin ei ole aiemmin tehty. Käytä lyhyen aloitustagin (<?) sijaan modernimpaa aloitustagia (<?php) - joillakin servereillä tuo lyhyt aloitusmerkintä ei ole käytössä, sillä sen kanssa voi tulla päällekkäisyyksiä (esim.?) XML-merkintöjen kanssa. Ja se location-headeri.
Olga: Kyllä!! :)
tsuriga: Ahaa, ok, kai. Kiitos joka tapauksessa.
Ok, lipsahti näköjään ilman tuota "php" sanaa, korjataan.
Mites vielä tälläinen juttu, kun aikaisemmin kerroin:
echo $myusername; echo $mypassword; //Uusi tapa sessioille. Toimiikohan? $_SESSION['myusername'] = $myusername; $_SESSION['mypassword'] = $mypassword; /*header("location:kirjautuminen_ok.php");*/ echo $myusername; echo $mypassword;
Niin se tulostaa sivuille:
admin salasana admin salasana
Oletin, että se tulostaa salasananin siansaksana "4sfsf79sf79sf7s79sf79sf9", mutta se tulostikin sen aivan kuten se kirjoitetaan. Olen sen kuitenkin md5:lla salannut aikaisemmin.
Vai tuolla ei mitään väliä, koska olin TESTImielessä vain kirjoittanut pelkän echo $mypassword? Eli olisi pitänyt TESTImielessä kirjoittaa jotain tyyliin: echo $encrypted_mypassword=md5($mypassword);
Jotta se olisi tulostanut sen salattuna.
Koko pointti oli vaan kysyä/varmistaa, että eihän tuossa koodissa salasani kulje salaamattomana?
(Tuossa aiemmassa viestissäni on koko php-skripti nähtävillä)
echo $encrypted_mypassword;
:)
(Taas se tuli pätemään ;) )
Juu, en jaksanut miettiä oikeeta tapaa.
Mutta vastaapa vielä kysymykseeni :)
Salasana vedetään md5:n läpi vasta palvelimella, joten kyllä, salasana kulkee salaamattomana selaimelta palvelimelle (olettaen ettet käytä salausta tuossa välissä).
Ok, ja se lienee ihan normaalia. Ei voikaan mitenkään paremmin salata?
(Ei kyllä tarvii vaikka ois mahdollista, kuhan pohdin...)
md5 on tiiviste-/summa-algoritmi (tiiviste kuulostaa tässä vähän hassulta ko lopputuote on yleensä pidempi ku lähtöarvo), ei kryptausalgoritmi. Tietoturvan parantamiseksi tuo summa lasketaan usein ei pelkästään salakalasta, vaan siihen ympätään serverillä hämäysdataa, jolloin summasta on vaikeampi laskea sitä oikeaa salasanaa. Manuaalissa näkyy olevan esimerkkejä md5-funktion kommenteissa, hakutermi salt
. Ainahan voit ohjata käyttäjät käyttämään salattua yhteyttä (mikäli serveri tukee SSL:ää).
öö, juu okei :)
Korjataan nyt sen verran vielä omaa viestiä, että summastahan ei varsinaisesti pystytä(?) laskemaan alkuperäistä syötettä, vaan se selvitetään erinäisillä brute force -tekniikoilla ja rainbow tableilla. Tuo edellä mainittu salt (suom. kirjaimellisesti suola) kannattaa sitten olla käyttäjä-, ei sivustokohtainen.
Kettu kuittaa.
Aihe on jo aika vanha, joten et voi enää vastata siihen.