Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: PHP: Kirjautuminen / rekisteröityminen MySql:llä

Sivun loppuun

ajv [15.04.2004 20:52:40]

#

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

<?php
include("ylaosa.php");

if($user)
   include("kuvat.php");
else{
   ?>
   <h1>Kirjautumis-esimerkki</h1>
   <p>Kun kirjaudut sisään, pääset käsiksi
      huippusalaisiin kuviin :)</p>
   <?php
}

include("alaosa.php") ;
?>

RebebtC [24.02.2005 14:59:36]

#

vautsi, pitaapa kokeilla, ma taisin sovelttaa koulun projektityossa sita sun vanhaa vinkkia... kiitos hyvista koodivinkeista =)

ajv [24.02.2005 16:29:25]

#

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.

RebebtC [25.02.2005 07:28:47]

#

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...

RebebtC [25.02.2005 07:30:19]

#

oon kuitenki vaihtanu config.php:n osoitteen, et ei johdu siita :)

RebebtC [25.02.2005 08:03:22]

#

nyt oon kokeillu ihan tollasenaan, mut jostain syysta se ei lisaa eika hae mitaan taulukosta?

ajv [25.02.2005 16:25:50]

#

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 :)

SysRq868 [26.02.2005 10:22:14]

#

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...?

ajv [26.02.2005 11:42:40]

#

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.

RebebtC [01.03.2005 07:11:31]

#

juu hyvin toimii, kiitos. viel yks kysymys, miten sais ton toimii ilman tota submit nappi, sillei et entteria painamalla kirjautuis sisaan?

ajv [01.03.2005 07:17:10]

#

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.

RebebtC [03.03.2005 11:23:17]

#

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 :)

ajv [03.03.2005 20:14:47]

#

No entäs mobiililaitteet? Kyllä se nappi kannattaa siinä pitää.

lemoon [08.03.2005 10:08:15]

#

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... ;)

lemoon [10.03.2005 13:43:12]

#

Toi näköjään pissii sen verran että pääsee kirjautumaan/rekisteröitymään ilman että on antanut ktunnusta tai passua

ajv [10.03.2005 17:52:25]

#

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.

lemoon [13.03.2005 18:06:36]

#

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..

ajv [13.03.2005 20:07:19]

#

Heh heh... :) Nyt tyhjää salasanaa/tunnusta ei enää voi rekisteröidä.

elmoep [22.03.2005 17:03:40]

#

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?

elmoep [22.03.2005 18:32:17]

#

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ä?

Maxfacus [22.03.2005 20:06:02]

#

elmoep, mulla on sama ongelma.

Maxfacus [22.03.2005 20:09:12]

#

ongelma olisi siis näissä:

$sql = mysql_query("SELECT COUNT(*) AS yht FROM {$tbl_users} WHERE tunnus = '".$tunnus."'",$lnk);
$sql = mysql_fetch_assoc($sql);

ajv [22.03.2005 21:32:42]

#

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:

  1. Onhan register.php:ssä varmasti tuo ensimmäinen rivi '<?php include("ylaosa.php") ?>' Tämä on erittäin oleellista siksi, että tietokantayhteys avataan ylaosa.php:ssä ja virheilmoitukset viittaavat juuri toimimattomaan tietokantalinkkiin.
  2. Kun olette copy-pastettanu ylaosa.php:n, olettehan poistaneet sieltä nuo alaosa.php:n listaukset. Jos ette, tietokantayhteys suljetaan jo ylaosa.php:ssä ja tällöin tulee varmasti ko. virheilmoitukset.

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.

elmoep [23.03.2005 15:43:23]

#

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?

ajv [24.03.2005 17:18:01]

#

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.

HirajukuThief [27.04.2005 16:34:24]

#

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?

ajv [01.05.2005 15:08:45]

#

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ä

erkki_m [09.06.2005 21:49:53]

#

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?

RebebtC [02.07.2005 10:57:56]

#

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?

hobzu [09.07.2005 15:25:48]

#

<?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...?

ajv [10.07.2005 12:28:35]

#

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

hobzu [24.07.2005 14:02:19]

#

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
}

dflies [08.09.2005 19:09:56]

#

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

ajv [09.09.2005 06:53:31]

#

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.

heplo [10.09.2005 13:31:20]

#

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??

Corez [17.11.2005 13:01:08]

#

Otat ne tähdet pois siitä alusta niin pitäs toimia :)

Jorgga [03.01.2006 20:44:18]

#

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.php on line 7
Yhteys tietokantaan epäonnistui

ajv [04.01.2006 10:20:03]

#

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.

Hico-Hatiac [07.04.2006 18:31:19]

#

<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?

tj-tommi [04.09.2006 21:37:11]

#

virhe... kun menet tuolla kirjautumis sivulla (index.php) kirjoitat tilalle esim kuvat.php niin se menee sinne vaikka et olisi rekisteröitynyt :D

tj-tommi [04.09.2006 21:43:39]

#

voisiko joku rakentaa käyttäjälistauksen ja pistää tänne tai e-mailiini: tpo93@pp.inet.fi

tsuriga [03.11.2006 16:57:03]

#

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ä.

Teme1 [22.12.2006 14:03:35]

#

<?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.

Juhko [22.12.2006 20:53:37]

#

Vähäx o cool, ny meen coclaan...

Eilinen [14.03.2007 12:06:21]

#

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ä?

Teme1 [19.03.2007 20:30:43]

#

http://hostland.dy.fi/teme
Käykää katsomaan, mitä olen rakennellet tuohon skriptaan =) Hallinnat ja Adminpaneelit sun muut.

teenix [26.04.2007 18:56:47]

#

Toimii kunnes vaifdan sivua.

http://www.janneweb.com

Joska [08.05.2007 21:31:22]

#

Homma toimii.

JyKKemus [03.08.2007 23:07:37]

#

tosta katot mitä se meinaa

belthaxor [29.08.2007 07:45:21]

#

Hei!

voitko katsoa koodiani, kun olen käyttänyt paljolti tätä opasta apunani!

Keskustelu

tuhannet kiitokset!

terv. Belthaxor

Antti80 [18.09.2007 16:36:20]

#

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?

Antti80 [18.09.2007 17:38:53]

#

Unohtakaa kysymykseni. Teen uuden viestiketjun jos tarvitsen apua, kiitos.

Maratsu [16.01.2008 18:11:55]

#

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

Maratsu [16.01.2008 18:15:15]

#

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

Dude [29.01.2008 20:21:14]

#

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.

intelbasse [10.03.2008 14:39:50]

#

"Tietokannan valitseminen epäonnistui"

Hmm.. mitäs mun nyt pitäs tehä? oon iha kujal

Teuro [01.04.2008 08:14:13]

#

intelbasse kirjoitti:

"Tietokannan valitseminen epäonnistui"

Hmm.. mitäs mun nyt pitäs tehä? oon iha kujal

Sinulla ei ole tuon nimistä kantaa olemassa.

pielinen [10.04.2008 22:20:53]

#

Hyvä koodi oppimisen kannalta, ja selkeästi kommentoitu.
En koko koodia hyödynnä, muta rivejä sieltä täältä.

atk-mörkö [24.06.2008 07:57:01]

#

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?

Clacier [17.08.2008 00:09:40]

#

Ei toimi minulla. Herjaa jotain 'ei yhteyttä palvelimeen' tms.

Clacier [17.08.2008 00:12:04]

#

* Yhteys tietokantaan epäonnistui. Mikä vikana?

Olli [26.02.2009 15:49:26]

#

"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).

Olli [26.02.2009 15:52:01]

#

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:=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?

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...

MIB [17.06.2009 13:24:34]

#

Kekseillä toimiva versio kiinnostaisi myös ;)
Saisi käyttäjä myös valita kirjautuuko sessionilla vai kekseillä. :)

osku91 [27.06.2009 19:46:37]

#

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?

ajv [28.06.2009 12:38:29]

#

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.

Palvy [16.08.2009 14:57:10]

#

Mainio koodivinkki, kiitokset!

Paulus M [14.10.2009 17:44:24]

#

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ä?

pake10 [17.11.2009 14:23:21]

#

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ä.

Hex [12.12.2009 11:45:24]

#

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)

kriminaali [03.01.2010 00:33:54]

#

Miksi saan kirjautuessa virheen

Unknown column 'istunto' in 'field list'

Plakkis [24.10.2010 00:28:38]

#

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ä?

Metabolix [07.12.2011 14:16:49]

#

Tässä taitaisi olla nykypäivänä aika paljon parannettavaa. :)


Sivun alkuun

Vastaus

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

Tietoa sivustosta