EDIT 23.02.2005: Kirjoitettu koko koodivinkki uusiksi. Koodirivejä tuli roimasti lisää, mutta samalla laatu parani ainakin oman mittapuuni mukaan. Keksit saivat väistyä sessioiden tieltä ja muutama pieni lisä-ominaisuus tuli mukaan.
EDIT 13.03.2005: Lisätty tyhjän merkin ja salasanan rekisteröimisen esto. Minimipituudet ovat oletuksena 1 merkki, eikö henkilökkohtaisen mielipiteen mukaan pituutta kannata sen enempää alkaa rajoittamaan. Sen sijaan suositeltavaa on valistaa käyttäjiä siitä, kuinka helppoa lyhyiden salasanojen murtaminen on.
Edelliseen versioon toivottiin mm. käyttäjien listausta ja käyttäjätietojen muokkausta yms, mutta niitä ei ole tulossa, ellei joku tee itse ja lähetä tänne. Tämän koodivinkinkin tarkoitus on opettaa, joten jätetään jotain kotitehtäväksikin. Sitä paitsi jos ko. toiminnot haluaa fiksusti toteuttaa, niin koodirivien määrä paisuu sen verran paljon, että koko vinkistä menee idea.
Huomioitavaa:
Jos haluat soveltaa koodia, tulee sinun ymmärtää edes jotain php:stä ja sen käytöstä. Koodivinkki on rakennettu periaatteen mukaan, missä ylaosa.php ja alaosa.php sisällytetään jokaiselle sivulle, siten että ulkoasu ikäänkuin lepää em. tiedostoissa ja itse sisältö siinä ladattavassa sivussa.
ylaosa.php sisältää kaikki tarvittavat koodit käyttäjän sisään- ja uloskirjaamiseen sekä tunnistamiseen. Nämä koodit suoritetaan aina sivun alussa siten, että varsinaista sisältöä tulostettaessa voidaan tulostaa käyttäjälle tarkoitettu materiaali.
ylaosa.php luo MySQL-kantaan taulun config.php:ssä määrittemälläsi nimellä, jonka jälkeen ko. koodirivit voi poistaa turhaan hidastamasta. Taulu sisältää myös e-mail-kentän, vaikka sitä ei tässä esimerkissä mitenkään käytetä.
Käyttäjän tunnistaminen perustuu PHP:n omaan sessiojärjestelmään. Sessiomuuttujaan laitetaan kirjautumisen yhteydessä talteen uniikki istuntotunnus, joka tallennetaan myös kantaan käyttäjän tietoihin. Sessiomuuttujassa kulkeva istuntotunnus on ikään kuin avain kantaan. Tämän avaimen avulla haetaan käyttäjän tiedot jokaisella sivunlatauksella kannasta, eli sessiossa ei kulje mitään käyttäjän tietoja. Sessio kestää niin kauan kuin logataan ulos, sessio pääättyy tai selain suljetaan.
config.php
Jos mahdollista, sijoita tämä jonnekkin suojaan, mielummin ulos koko www-hakemistosta.
<?php $db_user = "tunnuksesi"; $db_passwd = "salasanasi"; $db_server = "localhost"; $db_db = "tietokanta"; $tbl_users = "users"; //käyttäjät-taulun nimi. ?>
ylaosa.php
Nämä koodit täytyy löytyä jokaisen sivun alusta, ellei toisin mainita!
<?php session_start(); include("config.php"); //muuta config.php:n polku oikeaksi //avataan yhteys tietokantaan $lnk = mysql_connect($db_server,$db_user,$db_passwd) or die ("Yhteys tietokantaan epäonnistui"); mysql_select_db($db_db,$lnk) or die ("Tietokannan valitseminen epäonnistui"); //käyttäjä on oletuksena false. Älä varsinkaan poista, ellet tiedä mitä teet :) $user = false; /* SISÄÄNKIRJAUTUMINEN */ if(isset($_POST['tunnus']) && isset($_POST['salasana'])){ //muuttujat turvallisesti talteen $tunnus = get_magic_quotes_gpc() ? $_POST['tunnus'] : mysql_real_escape_string($_POST['tunnus']); $salasana = get_magic_quotes_gpc() ? $_POST['salasana'] : mysql_real_escape_string($_POST['salasana']); $salasana = md5($salasana); //luodaan käyttäjäkohtainen uniikki id $istuntotunnus = md5(uniqid("")); //lisätään istunto tietokantaan käyttäjän tietoihin mysql_query("UPDATE {$tbl_users} SET istunto = '{$istuntotunnus}' WHERE tunnus = '{$tunnus}' AND salasana = '{$salasana}'",$lnk) or die (mysql_error()); //jos lisättyjä rivejä on yksi, kirjautuminen onnistui if(mysql_affected_rows($lnk) == 1){ //laitetaan sessioon talteen istuntotunnus $_SESSION['log_key'] = $istuntotunnus; //takaisn edelliselle sivulle. Parempiakin tapoja on header("Location: ".isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : "index.php"); } } /* ULOSKIRJAUTUMINEN */ if(isset($_REQUEST['logout'])){ unset($_SESSION['log_key']); session_destroy(); header("Location: index.php"); } /* KÄYTTÄJÄN TUNNISTUS */ if(isset($_SESSION['log_key'])){ //HAETAAN KÄYTTÄJÄN TIEDOT $sql = "SELECT id, tunnus, DATE_FORMAT(last_load,'%d.%m.%y %h:%i:%s') AS last_load FROM {$tbl_users} WHERE istunto = '".mysql_real_escape_string($_SESSION['log_key'])."'"; $sql = mysql_query($sql,$lnk); if($sql && mysql_num_rows($sql) == 1){ //käyttäjä tunnistettu, kaikki kunnossa $user = mysql_fetch_assoc($sql); //nyt käyttäjän tiedot ovat mukavasti $user[]-taulukossa //esim. käyttäjän id löytyy $user['id'] ja tunnus $user['tunnus'] //lisätään vielä käyttäjän viimeisestä sivunlatauksesta aikaleima mysql_query("UPDATE {$tbl_users} SET last_load = NOW() WHERE id = ".$user['id'], $lnk); } } /* TÄSTÄ ETEENPÄIN VOI SOVELTAA NIIN PALJON KUIN JAKSAA. JOS KÄYTTÄJÄ ON SISÄLLÄ, VOIDAAN SE TODETA YKSINKERTAISESTI TUTKIMALLA $user-TAULUKKOA: if($user){ //tee jotain }else{ //tee jotain muuta } YLLÄ HAETTIIN KANNASTA KÄYTTÄJÄN id, tunnus JA VIIMEISIN SIVUNLATAUS, JOTKA NIINIKÄÄN LÖYTYVÄT $users-taulukosta: $user['id'], $user['tunnus'] ja $user['last_load'], */ // Tekee käyttäjille taulun MySQL:ään. Voi poistaa ekan sivunlatauksen jälkeen. mysql_query("CREATE TABLE IF NOT EXISTS `{$tbl_users}` ( id int(11) NOT NULL auto_increment, tunnus varchar(50) default NULL, salasana varchar(32) default NULL, email varchar(60) default NULL, last_load timestamp(14) NOT NULL, istunto varchar(32) default NULL, PRIMARY KEY (id), UNIQUE KEY istunto (istunto) )",$lnk); echo '<?xml version="1.0" encoding="iso-8859-1"?>'; ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>Kirjautumisesimerkki</title> </head> <body> <?php // IHAN KÄYTTÖESIMERKIKSI VAIN: if($user){ echo "Tervetuloa <b>".$user['tunnus']."</b>! | <a href=\"".$_SERVER['PHP_SELF']."?logout\">Kirjaudu ulos</a><br />"; echo "Viimeisin sivunlatauksesi kello ".$user['last_load']."."; }else{ ?> <form action="<?php echo $_SERVER['PHP_SELF'] ?>" method="post"> <table width="0%" style="border: 1px solid black;"> <tr> <td>Tunnus:</td> <td>Salasana:</td> <td><a href="register.php">Rekisteröidy</a></td> </tr> <tr> <td><input name="tunnus" type="text" /></td> <td><input name="salasana" type="password" /></td> <td><input type="submit" value="Kirjaudu" /></td> </tr> </table> </form> <?php } ?> <hr /> ******************************************************************************** *** alaosa.php ***************************************************************** ******************************************************************************** </body> </html> <?php mysql_close($lnk); ?>
register.php
<?php include("ylaosa.php") ?> <h1>Rekisteröityminen</h1> <?php if(isset($_POST['reg_tunnus']) && isset($_POST['reg_salasana']) && isset($_POST['reg_varmistus'])){ $text = ""; //tiedot turvallisesti talteen $tunnus = get_magic_quotes_gpc() ? $_POST['reg_tunnus'] : mysql_real_escape_string($_POST['reg_tunnus']); $salasana = get_magic_quotes_gpc() ? $_POST['reg_salasana'] : mysql_real_escape_string($_POST['reg_salasana']); $varmistus = get_magic_quotes_gpc() ? $_POST['reg_varmistus'] : mysql_real_escape_string($_POST['reg_varmistus']); //tarkastetaan onko nimimerkki varattu $sql = mysql_query("SELECT COUNT(*) AS yht FROM {$tbl_users} WHERE tunnus = '".$tunnus."'",$lnk); $sql = mysql_fetch_assoc($sql); $yht = $sql['yht']; if($yht != 0) $text .= "Tunnuksesi on jo rekisteröity, valitse uusi tunnus<br />\n"; if(strlen($tunnus) < 1)//minimipituus 1 merkki $text .= "Tunnuksesi on liian lyhyt. Tunnuksen minimipituus on 1 merkki<br />\n"; if(strlen($salasana) < 1)//minimipituus 1 merkki $text .= "Salasanasi on liian lyhyt. Salasanan minimipituus on 1 merkki, mutta tiedäthän, että mitä pidempi salasana, sen mahdottomampi se on murtaa<br />\n"; //testataan täsmäävätkö salasanat if($salasana != $varmistus) $text .= "Salasanat eivät täsmänneet<br />\n"; if($text == ""){ //lisätään käyttäjän tunnus ja salasana $sql = mysql_query("INSERT INTO {$tbl_users} (tunnus,salasana) VALUES ('".$tunnus."','".md5($salasana)."')",$lnk); if(!$sql || mysql_affected_rows($lnk) < 1) $text = "SQL-lauseessa virhe.<br />\n"; else $text = "Rekisteröityminen onnistui<br />"; } echo $text; } ?> <form method="post" action="<?php echo $_SERVER['PHP_SELF'] ?>"> <table width="0%" border="0"> <tr> <td>Käyttäjätunnus:</td> <td><input name="reg_tunnus" type="text" size="15" maxlength="20" value="<?php echo isset($_POST['reg_tunnus']) ? $_POST['reg_tunnus'] : ""; ?>" /></td> </tr> <tr> <td>Salasana:</td> <td><input name="reg_salasana" type="password" size="15" maxlength="20" /></td> </tr> <tr> <td>Uudestaan:</td> <td><input name="reg_varmistus" type="password" size="15" maxlength="20" /></td> </tr> <tr> <td colspan="2"><input type="submit" value="Rekisteröidy" /></td> </tr> </table> </form> <a href="index.php">Etusivulle</a> <?php include("alaosa.php") ?>
index.php
vautsi, pitaapa kokeilla, ma taisin sovelttaa koulun projektityossa sita sun vanhaa vinkkia... kiitos hyvista koodivinkeista =)
Poistinpa vielä nuo MySQL:n omien virheilmoitusten tulostamisen. Unohtui koodin sekaan. Niitähän ei ikinä saa käyttäjälle tulostaa, niin kuin ei mielellään mitään muitakaan php:n omia virheilmoituksia.
ootko kokeillu tollasenaan, et toimiiko? ma testasin lahes tollasenaan, lisasin vaan taulukon ite myadminissa ja poistin ton taulukon lisayksen tuolta, nii kuitenki, ei toiminu, mut en kyl oo viel tarkemmin koodia kattonu, ku en eilen ehtiny...
oon kuitenki vaihtanu config.php:n osoitteen, et ei johdu siita :)
nyt oon kokeillu ihan tollasenaan, mut jostain syysta se ei lisaa eika hae mitaan taulukosta?
No kokeilen pastettaa se tosta suoraan yhelle servulle... A moment, please :)
No olihan tuolla register.php:ssä bugeja vähän enemmänkin. Sitä se tekee, kun silmät ristissä koodaa :)
Suurin vika oli siis siinä, että olin unohtanut muuttaa tuon INSERT INTO {$tbl_users} ko. muotoon. Siellä luki se oman testaus-kantani taulun nimi. Toivottavasti nyt toimii :)
Onko mitään muuta tapaa tsekata onko juuseri kirjautunut sisään kuin includetus? Siis joo, tiedän miten header("Location");:ia käytetään, mutta miten tarkistetaan vaikka itse kuvat.php:ssa, onko hemmot sisällä vai ei...?
No includetat siihen kuvat.php:hen tuon ylaosa.php:n ja alaosa.php:n. 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.
juu hyvin toimii, kiitos. viel yks kysymys, miten sais ton toimii ilman tota submit nappi, sillei et entteria painamalla kirjautuis sisaan?
No tuohan on sitten selaimesta kiinni ja juuri sen takia tuota submit-nappulaa ei kannata poistaa siitä. Kyllä ainakin FF ja IE ja Opera lähettää tuon formin ihan enterillä ja samoin taitaa tehdä valtaosa selaimista.
kyl ne lahettaa ne entterilla jos siin on se nappi, eli laiton vaan sellasen 1 x 1 lapinakyvan gifin siihen napiks ni lahtee entterilla, luulen et kaikilla selaimilla... et siin vinkki jollekki :)
No entäs mobiililaitteet? Kyllä se nappi kannattaa siinä pitää.
No voihan pirulauta. Meikäläinen käytti sun vanhaa pohjaa koulutyössä. Lisäsin siihen käyttäjälistauksen, muokkaamisen/poistamisen sekä rekisteröinnin vahvistuksen by email. (mailissa linkki jota pitää klikata tunnuksen aktivoimiseksi) :)
Täytynee sekin nyt sit päivittää. Kiitti vaan... ;)
Toi näköjään pissii sen verran että pääsee kirjautumaan/rekisteröitymään ilman että on antanut ktunnusta tai passua
lainaus:
Toi näköjään pissii sen verran että pääsee kirjautumaan/rekisteröitymään ilman että on antanut ktunnusta tai passua
Heh, niinpäs tekeekin. Vika ei kuitenkaan ole kirjautumisessa, vaan siinä, että joku on rekisteröinyt tyhjän nimimerkin ja salasanan :) Lisään tuon tyhjän tunnuksen rekkaamisen estämisen ensitilassa :)
Edit: Poistin tyhjän tunnuksen.
lainaus:
joku on rekisteröinyt tyhjän nimimerkin ja salasanan :) Lisään tuon tyhjän tunnuksen rekkaamisen estämisen ensitilassa :)
Edit: Poistin tyhjän tunnuksen.
Tunnustan. Joku oli meikäläinen :) heh..
Heh heh... :) Nyt tyhjää salasanaa/tunnusta ei enää voi rekisteröidä.
Juu eli loistavalta scriptalta ja hyödylliseltä vaikutti ja mallin mukaan järkevältä. Nyt ongelmaksi ilmeni tälle nobille kuitenkin alaosa.php eli mitä tämä pitää sisällään?
Pikku hiljaa edetään... Tein tyhjän alaosa.php tiedoston(väärin?) toimi loistavasti kunnes koitin rekisteröityä.. Painoin "rekisteröidy" näppäintä register.php sivulla ja heitti:
"
Warning: mysql_query(): 4 is not a valid MySQL-Link resource in /home/iy/public_html/kirjautuminen/register.php on line 13
Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in /home/iy/public_html/kirjautuminen/register.php on line 14
Warning: mysql_query(): 4 is not a valid MySQL-Link resource in /home/iy/public_html/kirjautuminen/register.php on line 33
SQL-lauseessa virhe.
"
Vinkkejä?
elmoep, mulla on sama ongelma.
ongelma olisi siis näissä:
$sql = mysql_query("SELECT COUNT(*) AS yht FROM {$tbl_users} WHERE tunnus = '".$tunnus."'",$lnk); $sql = mysql_fetch_assoc($sql);
alaosa.php on kyllä tuolla koodilistauksissa (ylaosa.php:n alareunassa) ja se sisältö on seuraava:
</body> </html> <?php mysql_close($lnk); ?>
Noihin varsinaisiin ongelmiin sitten. Muutama tarkistus:
Tämän enempää en osaa arvailla. Jos nuo kummatkin on kunnossa, niin sitten vika on hieman hämärämpi. Ilmoittakaa jos saatte/ette saa toimimaan.
Juu nyt auttoi jo siis vähän..
Mutta rekisteröidyn/kirjaudun niin valittaa:
"XML-sivua ei voi näyttää"
"XML-asiakirjassa voi olla vain yksi ylätason elementti. Virhe resurssia http://****.com/kirjautuminen/index.php?logout k...
<b>Warning</b>: Cannot modify header information - headers already sent by (output started at /home/iy/public_h..."
Mitäs tähän?
Tuollaisiin erroreihin en ole ikinä törmännyt. Kannattaa melkein kysellä noista keskustelualueella. Tuo '<b>Warning</b>...' johtuu taasen vain noista ylemmistä varoituksista. Kun saat ne pois, ei headereitä lähetetä vielä noin aikaisin.
Apuva.
Olen aika aloittelia näitten PHP koodien kanssa ja
tuo herjaa minulla tällaista: Warning: mysql_connect(): Unknown MySQL Server Host '****' (0) in /home/****/public_html/ylaosa.php on line 7
Yhteys tietokantaan epäonnistui
Missähän bugaa?
Virheilmoitushan on aika selkeä: MySQL-serveri tuntematon, josta johtuen siihen ei saada yhteyttä. Yleensä serverin osoite on "localhost", mutta, jos ei sillä toimi, niin kannattanee kysyä palveluntarjoajalta MySQL-serverin osoite. Serveri osoite määritellään config.php:ssä
Näyttää ihkulta! Voisiko joku "expertti" selostaa minulle tämän rivin merkityksen:
$salasana = get_magic_quotes_gpc() ? $_POST['salasana'] : mysql_real_escape_string($_POST['salasana']);
Mitä tuo kysymysmerkki ja kaksoispiste tekevät?
En oo ihan varma mut mulla taitaa tehdä niin et ku klikkaan toiselle sivulle ni se heittää ton userin falseks, ku siihe tulee taas se kirjautumislomake?
<?php if($user){ echo "Olet kirjautuneena palveluun tunnuksella: <b>".$user['tunnus'].""; } else { echo 'else'; } ?>
Kysymys kuuluu, miten laittaa iffiin ns. "if user = pekka" tee sitä ja tätä, jne jne...?
if($user && $user['tunnus'] == 'pekka'){ //todoo }
Vaikkakin suosittelisin lisäämään käyttäjätauluun sarakkeen 'kayttajataso' ja verrata onko käyttäjällä riittävä käyttäjätaso tekemään sitä jotakin
Eli onnistuuko käyttäjätason tarkistaminen niin, että lisää rivin kayttajataso ja sieltä tarkistaa seuraavalla:
if($user && $user['taso'] == '1'){ //todoo }
Ja toisekseen, mielenkiinnon vuoksi, miksi et tekisi asiaa tyyliin näin:
if($user && $user['tunnus'] == 'pekka'){ //todoo }
uhm, mitenkäs sen tason sais laitettuu? Ja mitenkäs sais hallintakeskuksen?(Admin center)Missä sais laitettuu: ban(ip&user),tason valinta, jäsenten poisto, ja näkis jokaisen käyttäjän tiedot. Voisiko joku laittaa sähköpostia os. dfliers@gmail.com tai laittaa tänne. Kun itse en ole hirmu hyvä php:ssä, osaan vain pari perusjuttua.
Entäs rekisteröintikenttiä jos lisäisi, miten ne tulisi laittaa mySQL tableen? esim. Website.., country. Niin, ja entäs mitenkä saa laitettua monta eri käyttäjää, pitääkö käyttää elseif jne...
-Dflies
dflies:
Et tee mitään kirjautumissystteemillä, jos et osaa käyttää sitä. Tämänkin koodivinkin tarkoitus on opettaa ja juuri siksi siihen on jätetty kotitehtäväksi noiden ominaisuuksien tekeminen. Tämä koodivinkki on pelkkä pohja, josta jokainen käyttäjä räätälöi itsellensä sellaisen kuin haluaa.
Minulla se valittaa tälläistä:
Warning: main(header.php) [function.main]: failed to open stream: No such file or directory in ******/index.php on line 10
Fatal error: main() [function.require]: Failed opening required 'header.php' (include_path='.;********') in *******/index.php on line 10
Osaisko joku neuvoo??
Otat ne tähdet pois siitä alusta niin pitäs toimia :)
tuon listauksen alussa lukee
"Jos mahdollista, sijoita tämä jonnekkin suojaan, mielummin ulos koko www-hakemistosta." niin mites tämä tapahtuu?
niin ja sain tälläisen virheilmoituksen:
Warning: mysql_connect() [function.mysql-connect]: Access denied for user 'ODBC'@'localhost' (using password: NO) in J:\apachefriends\xampp\htdocs\****\****\ylaosa.
Yhteys tietokantaan epäonnistui
Jorgga kirjoitti:
tuon listauksen alussa lukee
"Jos mahdollista, sijoita tämä jonnekkin suojaan, mielummin ulos koko www-hakemistosta." niin mites tämä tapahtuu?
:
:
Oletetaan, että sulla on unix-alusta ja sun www-hakemisto on
/home/Jorgga/public_html
niin tallennat tuon asetus-tiedoston
/home/Jorgga/salasanat/config.php
ja sitten PHP-koodissa kutsut asetuksia
include('/home/Jorgga/salasanat/config.php');
Toinen vaihtoehto on pistää tiedosto .htaccess-suojattuun hakemistoon.
Tämä siksi, että jos palvelimen PHP menee rikki, niin http-serveri voi huonolla tuurilla tulostaa tuon PHP-koodin sellaisenaan käyttäjälle. Jos näin kävisi, osaisi lapsikin kirjoittaa osoiteriville /config.php, ottaa salasanat ylös ja jäädä odottamaan, kun joku ehjää palvelimen. Jos salasanat sijaitsevat ulkona www-hakemistosta, ei käyttäjä voi päästä niihin mitenkään suoraan selaimella käsiksi.
Tämä toki on vain yksi pieni osa PHP-tietoturvaa. Ei tarvita kummoistakaan aukkoa PHP-skriptiin, niin nuo salasanat saa kaivettua myös tuolta www-hakemiston ulkopuolelta.
<td>Sähköpostiosoite:</td> <td><input name="reg_email" type="text" size="15" maxlength="20" value="" /></td>
Miten tuohon valueen saisi niin, että se hakee tietokannasta email kohdan tiedot?
virhe... kun menet tuolla kirjautumis sivulla (index.php) kirjoitat tilalle esim kuvat.php niin se menee sinne vaikka et olisi rekisteröitynyt :D
voisiko joku rakentaa käyttäjälistauksen ja pistää tänne tai e-mailiini: tpo93@pp.inet.fi
CREATE TABLE -queryn voisi sijoittaa jonnekin tiedoston alkuun tms., josta se on helpompi huomata. Md5:lle voisi tarjota mcryptin löytyessä kryptausta, ja jos käytetään tuota md5 niin sille voisi määritellä jonkin suolan ja ehkä jotain muuta pientä kommervinkkiä krakkeroinnin vaikeuttamiseksi. PHP_SELF -> SCRIPT_NAME. Näyttää hyvältä.
<?php $sql=mysql_query("select * from users");while($row=mysql_fetch_array($sql)) {print($row['tunnus']."<br />");}?>
Tuo koodi listaa käyttäjät, muista vaihtaa taulukon nimi ellei se ole tuo users.
Vähäx o cool, ny meen coclaan...
Mielestäni todella hyvä kirjautumis systeemi. Toimi heti (jos ei lasketa omia pieniä virheitä), eli tässä scriptissä ei ole mitään vikaa. Kiitos tästä.
Itse opettelen vasta php:tä ja samalla nyt noiden tietokantojen käyttöä. Nyt on vähän pulmia, kun yritän tehdä että käyttäjä pystyisi itse lisäämään/vaihtamaan tietojaan. Eli laittamaan sähköpostiosoitteen sun muuta.
Olisiko vinkkejä?
http://hostland.dy.fi/teme
Käykää katsomaan, mitä olen rakennellet tuohon skriptaan =) Hallinnat ja Adminpaneelit sun muut.
Toimii kunnes vaifdan sivua.
Homma toimii.
Hei!
voitko katsoa koodiani, kun olen käyttänyt paljolti tätä opasta apunani!
tuhannet kiitokset!
terv. Belthaxor
Hieno skripti. Otin itselleni käyttöön myös muutamien muokkausten jälkeen. Minuakin tosin kiinnostaisi, että miten juuri esim. sen "kuvat.php" tiedoston 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 haluamin 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?
Unohtakaa kysymykseni. Teen uuden viestiketjun jos tarvitsen apua, kiitos.
Warning: mysql_query(): 4 is not a valid MySQL-Link resource in /var/www/mara/sivupohja/register.php on line 13
Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in /var/www/mara/sivupohja/register.php on line 14
Tommosta pukkaa :P
Warning: mysql_query(): 4 is not a valid MySQL-Link resource in /var/www/mara/sivupohja/register.php on line 33
Ja tommonen lisäks :P
En ny koita tuota mutta tuosta selvis mulle session_destroy-komento(sitä ei ollu putkan oppaas vaikka sessioista oliki), jota mä tartten mun sivuille rekisteröitymishommaan.
"Tietokannan valitseminen epäonnistui"
Hmm.. mitäs mun nyt pitäs tehä? oon iha kujal
intelbasse kirjoitti:
"Tietokannan valitseminen epäonnistui"
Hmm.. mitäs mun nyt pitäs tehä? oon iha kujal
Sinulla ei ole tuon nimistä kantaa olemassa.
Hyvä koodi oppimisen kannalta, ja selkeästi kommentoitu.
En koko koodia hyödynnä, muta rivejä sieltä täältä.
Kiitokset koodivinkistä, toimii soveltamalla hienosti moneen tarpeeseen.
Kuinkas saisin Excelistä makropainikkeella kirjautumaan suoraan sisään, ettei tarvitse syöttää tunnusta ja salasanaa?
Olen tehnyt Excel-makropainikkeeseen seuraavanlaisen koodinpätkän VB:tä:
username = "tunnus" password = "Salasana" ActiveWorkbook.FollowHyperlink Address:="http://localhost/koe/index.php", _ NewWindow:=True, ExtraInfo:="tunnus=" + username + "&salasana=" + password, Method:=msoMethodPost
Tämä toimii hienosti, kun testaa johonkin PHP skriptiin, joka printtaa nuo tunnus ja salasana -parametrien arvot ruudulle suoraan, mutta tuohon Kirjautuminen / rekisteröityminen -malliin en ole saanut tuota toimimaan.
Yritin myös sellaista, että lähetän Excelistä edellisen koodin avulla yhden parametrin, joka ohjaisi PHP:ssä if-lauseella parametrin huomattuaan kirjautumaan automaattisesti, mutta sekään ei toimi. Näyttäisi siltä, että se kadottaa parametrin arvon ohjelmaan tultaessa!
Mikä neuvoksi?
Ei toimi minulla. Herjaa jotain 'ei yhteyttä palvelimeen' tms.
* Yhteys tietokantaan epäonnistui. Mikä vikana?
"Yhteys tietokantaan epäonnistui" tarkoittaa, että tietokantaan ei saada yhteyttä.
1) Tarkista, tukeeko palveluntarjoajasi MySQLää.
2) Tarkista, että tiedot on laitettu oikein (tietokannan nimi, käyttäjän nimi, salasana, taulu).
atk-mörkö kirjoitti:
Kiitokset koodivinkistä, toimii soveltamalla hienosti moneen tarpeeseen.
Kuinkas saisin Excelistä makropainikkeella kirjautumaan suoraan sisään, ettei tarvitse syöttää tunnusta ja salasanaa?
Olen tehnyt Excel-makropainikkeeseen seuraavanlaisen koodinpätkän VB:tä:
username = "tunnus" password = "Salasana" ActiveWorkbook.FollowHyperlink Address:="http://localhost/koe/index.php", _ NewWindow:=True, ExtraInfo:="tunnus=" + username + "&salasana=" + password, Method:=msoMethodPostTämä toimii hienosti, kun testaa johonkin PHP skriptiin, joka printtaa nuo tunnus ja salasana -parametrien arvot ruudulle suoraan, mutta tuohon Kirjautuminen / rekisteröityminen -malliin en ole saanut tuota toimimaan.
Yritin myös sellaista, että lähetän Excelistä edellisen koodin avulla yhden parametrin, joka ohjaisi PHP:ssä if-lauseella parametrin huomattuaan kirjautumaan automaattisesti, mutta sekään ei toimi. Näyttäisi siltä, että se kadottaa parametrin arvon ohjelmaan tultaessa!
Mikä neuvoksi?
Luulisin, että arvot täytyy lähettää POST-metodilla, eikä GET-metodilla (jolla nyt taidat ne lähettää). En sitten tiedä, tukeeko Excel tietojen lähettämistä POST-metodilla. Jos ei, skriptiä pitäisi muutella luultavasti aika lailla...
Kekseillä toimiva versio kiinnostaisi myös ;)
Saisi käyttäjä myös valita kirjautuuko sessionilla vai kekseillä. :)
Eikös tuo ole aikamoinen tietoturvaongelma että kirjautuessa salasanan md5 jutusta ei poisteta haitallisia merkkeijä, koska sehän saattaa sisältää jonkun mysql:n ymmärtämän käskyn joka pahimmillaan voi poistaa koko käyttäjä taulun vaikka varsin epätodennäköistä olisikin että tämmöinen tapahtuisi?
Ihan hyvä pointti. Ei siitä ainakaan mitään haittaa olisi siivota myös tiivistettyä salasanaa. Jos kuitenkin luottaa PHP:n manuaaliin, joka kertoo, että md5()-funktio palauttaa hexalukuja, ja tietää, että [a-f0-9] ei sisällä MySQL:n kannalta kriittisiä merkkejä (lähinnä hipsuja), niin tuossa ei ole tietoturvaongelmaa.
Mainio koodivinkki, kiitokset!
Meitsillä heittää tälläista herjaa kun kirjaudun sisään ja avataan kuvat.php.
Warning: Cannot modify header information - headers already sent by (output started at C:\xampplite\htdocs\taksi\sessiot\ylaosa.php:
kuvat.php
<?php include ("ylaosa.php"); echo "Tämä on testi"; ?>
Virheilmoitus osuu tähän riviin:
header("Location: ".isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : "index.php");
EDIT: miltä sivulta muuten mennään ja mille sivulle tässä edellä mainitussa rivissä?
Paulus M kirjoitti:
Meitsillä heittää tälläista herjaa kun kirjaudun sisään ja avataan kuvat.php.
Warning: Cannot modify header information - headers already sent by (output started at C:\xampplite\htdocs\taksi\sessiot\ylaosa.php:
102) in C:\xampplite\htdocs\taksi\sessiot\ylaosa.php on line 34 kuvat.php
<?php include ("ylaosa.php"); echo "Tämä on testi"; ?>Virheilmoitus osuu tähän riviin:
header("Location: ".isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : "index.php");EDIT: miltä sivulta muuten mennään ja mille sivulle tässä edellä mainitussa rivissä?
Eli tuohan meinaa sitä, että ennen headeria on echotettu tekstiä.
Hei, tarviiko jotain tableja luoda siis MYSQL tietokantaan? vai asennanko tämän suoraan sivuille ja pistän configiin MYSQL databasen tiedot (joissa ei ole vielä mitään tableja)
Miksi saan kirjautuessa virheen
Unknown column 'istunto' in 'field list'
Mistä johtuu, että toimii tuliketulla. Mutta muilla selaimilla (ja osalla muilla tätä koodia käyttäneillä), niin kirjautuu ulos heti sivua vaihdettaessa. Mikä koodissa tuhoaa sessionin yhtäkkiä?
Tässä taitaisi olla nykypäivänä aika paljon parannettavaa. :)
Aihe on jo aika vanha, joten et voi enää vastata siihen.