Admin Login System

Direc 06.10.04 21:17

Muunneltu ja jatkettu "Session Login" -koodipätkästä (http://mureakuha.com/koodikirjasto/176)

 Tekstiversio  Arvo: 16 (40 ääntä)  Äänestä: +  -
<?php

/////
// Admin Login System 1.4
// Alkiperäinen koodi:
// http://mureakuha.com/koodikirjasto/176
// Muokannut ja laajentanut:
// Matti Viljanen, e-mail mattiviljanen@luukku.com
/////

session_start();

// Sivun muodostamisajan laskurin aloitus
$timer_start = explode(" ", microtime());     
$timer_start = $timer_start[0] + $timer_start[1];

// Käyttäjän omat funktiot tähän
function usernamereplaces($text)
{
  $text = trim($text);
  $text = str_replace(".","",$text);
  $text = str_replace("/","",$text);
  $text = str_replace("\\","",$text);
  return ($text);
}

// Käyttäjänimen ja oikeuksien haku ja käsittely
$username = "user.null";
$superuser = FALSE;
$accountfile = NULL;
$accountdata = NULL;

if(!empty($_SESSION['username']))
{
  $username = usernamereplaces($_SESSION['username']);
  $accountfile = file("accounts/$username");
  $accountdata = explode("<>", $accountfile[0]);
 
  if(file_exists("accounts/super.user/$username"))
    $superuser = TRUE;
}

// HTML-headerit
// HUOM! Älä käytä PRINT tai ECHO-funktioita,
// käytä $output .= 'blahblah';
$output = '<html><head>
<STYLE type="text/css">
.v11 { font-family: "Verdana"; font-size: 11px; }
</STYLE></head><body class="v11"><hr>'
;

/////
// Login-tarkistus
/////
if(($_SESSION['id'] == $accountdata[1]) && !empty($accountdata[1]))
{

/////
// Sivunvalinta-IF-lauseet
/////
  if($_GET['sivu'] == "ulos")
  { // Uloskirjautuminen
    $account_fopen = fopen("accounts/$username","w");
    flock($account_fopen, 2);
   
    if(fwrite($account_fopen, "$accountdata[0]<>") == TRUE)
    { // Poistetaan istuntotunnus joka puolelta
      session_unset();
      session_destroy();
      header('Location: admin.php');
      exit;
    }
    else
      $output .= "Istuntotietoja ei voitu pyyhiä";

      fclose($account_fopen);
  }
  elseif($_GET['sivu'] == "vaihdasalasana")
  { // Salasanan vaihtaminen
    $error_desc = "";
   
    if($_POST['vaihda'])
    { // Jos salasanaa ollaan jo vaihtamassa...
     
      // Virheentarkistusta
      if(empty($_POST['oldpassword'])
      || empty($_POST['newpassword'])
      || empty($_POST['confirmpassword']))
        $error_desc = "Et täyttänyt kaikkia kenttiä!";
      elseif(md5($_POST['oldpassword']) !== $accountdata[0])
        $error_desc = "Vanha salasana väärin!";
      elseif($_POST['newpassword'] !== $_POST['confirmpassword'])
        $error_desc = "Kirjoitusvirhe uudessa salasanassa!";
      elseif(usernamereplaces($_POST['newpassword'])
      !== $_POST['newpassword'])
        $error_desc = "Virheellisiä merkkejä uudessa salasanassa";
       
      else
      { // Jos tarkistukset läpäistiin, aletaan muokata tiedostoa
        $oldpassword = md5($_POST['oldpassword']);
        $newpassword = md5($_POST['newpassword']);
       
        // Sama syntaksi kuin sisäänkirjautumissivulla pakollinen!!
        $id=md5("$username"."$newpassword".rand());
       
        $fopenpassword = @fopen("accounts/$username","w");
        flock($fopenpassword, 2);
        if(fwrite($fopenpassword, "$newpassword<>$id") == TRUE)
        {
          $_SESSION['id'] = $id;
          $error_desc = "Tiedot päivitetty onnistuneesti!";
        }   
        else
        {
          $error_desc = "Tietojen päivittäminen epäonnistui!";
        }
        fclose($fopenpassword);
      }
    }
   
    // Nappia painettu tai ei, näytetään tekstilaatikot
    $output .= '<b>Vaihda salasana</b><p>
    <b>'
.$error_desc.'</b>
    <form action="admin.php?sivu=vaihdasalasana" method="post">
    <table width="400px" cellpadding="2" border="0" class="v11">
    <tr>
    <td>Vanha salasana:</td>
    <td><input class="v11" type="password" name="oldpassword"></td>
    </tr><tr>
    <td>Uusi salasana:</td>
    <td><input class="v11" type="password" name="newpassword"></td>
    </tr><tr>
    <td>Uusi salasana uudestaan:</td>
    <td><input class="v11" type="password" name="confirmpassword"></td>
    </tr><tr>
    <td></td>
    <td><input class="v11" name="vaihda" type="submit" value="Vaihda"></td>
    </tr></table></form>'
;
  }
  elseif($_GET['sivu'] == "uusitili" && $superuser)
  { // Uuden käyttäjätilin luominen
    $output .= '<b>Käyttäjätilin luominen</b><p>';
    // Jos luo-nappia on painettu...
    if($_POST['create'])
    {
      $error_desc = "";
      $newusername = $_POST['newusername'];
      $add_to_superusers = $_POST['superuser'];
      $nameinuse = @fopen("accounts/$newusername","r");
     
      // Virheentarkistusta
      if(empty($newusername))
        $error_desc = "Ei käyttäjänimeä!";
      elseif($newusername !== usernamereplaces($newusername))
        $error_desc = "Virheellisiä merkkejä käyttäjänimessä!";
      elseif($_POST['password'] !== $_POST['password2'])
        $error_desc = "Kirjoitusvirhe uudessa salasanassa!";
      elseif(empty($_POST['password']))
        $error_desc = "Ei salasanaa!";
      elseif(usernamereplaces($_POST['password']) !== $_POST['password'])
        $error_desc = "Virheellisiä merkkejä uudessa salasanassa!";
      elseif(file_exists("accounts/$newusername"))
        $error_desc = "Käyttäjätili on jo olemassa!";
     
      else
      { // Jos virheentarkistus läpäistiin, luodaan uusi tiedosto
        $password = md5($_POST['password']);
        if(fwrite(fopen("accounts/$newusername","x+"),"$password<>"))
        { 
          $error_desc = "Käyttäjätili \"$newusername\" luotu";
          if($add_to_superusers)
          {
            $superuserfile = "accounts/super.user/$newusername";
            if(fwrite(fopen($superuserfile,"x+")," "))
              $error_desc .= " ja lisätty tehokäyttäjälistaan";
            else
              $error_desc .= ", mutta tehokäyttäksi lisääminen epäonnistui";
          }
        }
        else
          $error_desc = "Käyttäjätilin luominen epäonnistui!";
      }
    }
    $output .= '<form action="admin.php?sivu=uusitili" method="post">
    <table width="400px" cellpadding="2" border="0" class="v11">
    <b>'
.$error_desc.'</b>
    <tr><td>Tehokäyttäjä:</td>
    <td><input class="v11" type="checkbox" name="superuser"></td>
    </tr><tr><td>Käyttäjänimi:</td>
    <td><input class="v11" type="text" name="newusername"></td>
    </tr><tr>
    <td>Salasana:</td>
    <td><input class="v11" type="password" name="password"></td>
    </tr><tr>
    <td>Salasana uudestaan:</td>
    <td><input class="v11" type="password" name="password2"></td>
    </tr><tr>
    <td></td>
    <td><input class="v11" name="create" type="submit" value="Luo">
    </td></tr></table></form>'
;
  }
  elseif($_GET['sivu'] == "poistatili" && $superuser)
  { // Käyttäjätilin poistaminen
    $output .= '<b>Käyttäjätilin poistaminen</b><p>';
    if($_POST['varmista'])
    { // Jos poisto on varmistettu...
      $loginname = $_POST['tunnus'];
      flock(fopen("accounts/$loginname","w"),2);
      if(unlink("accounts/$loginname"))
      {
        $output .= "Käyttäjän $loginname tiedot poistettu";
        flock(fopen("accounts/super.user/$loginname","w"),2);
        if(file_exists("accounts/super.user/$loginname")
        && unlink("accounts/super.user/$loginname"))
          $output .= " ja tehokäyttäjälista on päivitetty";
        elseif(file_exists("accounts/super.user/$loginname"))
          $output .= ", mutta käyttäjää ei voitu poistaa tehokäyttäjistä";
      }
      else
        $output .= "Käyttäjän tietoja ei voitu poistaa.";
      fclose(fopen("accounts/$loginname","w"));
    }
    elseif($_POST['poista'])
    { // Kysytään varmistusta...
      $loginname = $_POST['tunnus'];
      $output .= 'Haluatko varmasti poistaa käyttäjätilin "'.$loginname.'"?
      <p><form action="admin.php?sivu=poistatili" method="post">
      <input class="v11" type="hidden" name="tunnus" value="'
.$loginname.'">
      <input class="v11" type="submit" name="varmista" value="Kyllä">
      <input class="v11" type="submit" name="sivuuta" value="Ei">
      </form></p>'
;
      $dont_print_links = TRUE;
    }
    else
    {
      $accounts = opendir("./accounts/");
      if($accounts)
      {
        $output .= '<p><form action="admin.php?sivu=poistatili" method="post">
        <table width="400px" cellpadding="2" border="0" class="v11">
        <tr><td>Valitse:</td><td><select class="v11" name="tunnus">'
;
        while (($filename = readdir($accounts)) !== FALSE)
        {
          if ($filename !== "." && $filename != ".."
          && $filename !== "super.user"
          && $filename !== $username
          && $filename !== "user.null"
          && $filename !== "index.php")
            $output .= "<option value=\"$filename\">$filename</option>\n";
        }
        closedir($accounts);
        $output .= '</select></td></tr>
        <tr><td></td><td><input class="v11" type="submit"
        name="poista" value="Poista"></td></tr></form></table></p>'
;
      }
      else
        $output .= 'Hakemiston avaaminen epäonnistui. Ota yhteys ylläpitoon.';
    }
  }

  /////
  // Jos haluat lisätä oman toiminnon eri tiedostossa,
  // lisää tähän kohtaan:
  // elseif($_GET['sivu'] == "uusitoiminto")
  //   { require("sivu.php"); }
  // Jotta uutta sivua ei voi käyttää yksinään
  // suoraan WWW-selaimelta, lisää alkuun vaikkapa:
  // if($_GET['sivu'] == "uusitoiminto") { (oma sisältö }
  //
  // Tietysti myös riville 290 tai 298 täytyy
  // lisätä vastaava linkki, jossa sivun saa auki!
  /////

  else
    $output .= '<b>Tervetuloa hallintapaneeliin!</b>';
   
 
  if(!$dont_print_links)
  {
    $output .= '<blockquote>';
   
    if($superuser) // Tehokäyttäjän lisälinkit
        $output .= '· <a href="admin.php?sivu=uusitili">Luo uusi käyttäjätili</a>
        <br>· <a href="admin.php?sivu=poistatili">Poista käyttäjätili</a><br>'
;
     
    // Kaikkien käyttäjine linkit
    $output .= '· <a href="admin.php?sivu=vaihdasalasana">Vaihda salasana</a>
    <br>· <a href="admin.php?sivu=ulos">Kirjaudu ulos</a>'
;
   
    $output .= '</blockquote>';
  }
}

/////
// Siihen loppui kirjautuneille näytettävät asiat
/////
// Login-sivu vain ei-kirjautuneille!
/////
else
{
  // Tarkistetaan käyttäjätietohakemiston olemassaolo
  if(file_exists("./accounts") == FALSE)
    $error_desc = "Hakemistoa ei löydy! Ota yhteys järjestelmänvalvojaan!";

  if($_POST['kirjaudu'])
  {//Jos login-painiketta on painettu
    $error_desc = "";
    $loginname = $_POST['username'];
    $accountfile = @file("accounts/".$loginname);
    $password = md5($_POST['password']);
    $accountdata = explode("<>", $accountfile[0]);
   
    // Virheentarkistusta
    if(usernamereplaces($loginname) !== $loginname)
      $error_desc = "Virheellisiä merkkejä käyttäjänimessä!";
    elseif(empty($loginname))
      $error_desc = "Ei käyttäjänimeä!";
    elseif($accountfile == FALSE)
      $error_desc = "Käyttäjänimi tai salasana väärin!";
    elseif($password !== $accountdata[0])
      $error_desc = "Käyttäjänimi tai salasana väärin!";
    else
    {
      // Sama syntaksi kuin salananmuutossivulla pakollinen!!
      $id=md5("$loginname"."$password".rand());
     
      $_SESSION['username']=$loginname;
      $_SESSION['id']=$id;
     
      $account_fopen = fopen("accounts/"."$loginname","w+");
      flock($account_fopen, 2);
     
      if(fwrite($account_fopen, "$accountdata[0]<>$id") == TRUE)
      {
        fclose($account_fopen);
        header('Location: admin.php');
        exit;
      }
      else
      {
        fclose($account_fopen);
        $error_desc = "Sisäänkirjautuminen epäonnistui!";
      }
    }
  }
  if($dont_print_login !== 1) $output .= '<b>Hallintapaneeli</b><p>
  <b>'
.$error_desc.'</b>
  <form action="admin.php" method="post">
  <table width="400px" cellpadding="2" border="0" class="v11">
  <tr><td>Käyttäjänimi:</td>
  <td><input class="v11" type="text" name="username"></td>
  </tr><tr><td>Salasana:</td>
  <td><input class="v11" type="password" name="password"></td>
  </tr><tr><td></td>
  <td><input class="v11" name="kirjaudu" type="submit" value="Sisään">
  </td></tr></table></form>'
;
}

/////
// Sivun muodostuslaskurin lopetus. Näytetään aina.
/////
$timer_end=explode(" ", microtime());
$timer_end=$timer_end[0] + $timer_end[1];
$timer_final=$timer_end - $timer_start;
$timer_final=round($timer_final,5);

$output .= '<hr>Sivun käsittely kesti '.$timer_final.'s.
<!-- Alkuperäiskoodi: Lauri Wikström, e-mail late@paladen.net, ICQ: 75428287 -->
<!-- Muokannut ja laajentanut Matti Viljanen, mattiviljanen@luukku.com -->
</body></html>'
;

// Tulostetaan sivu
print($output);
?> 

editoitu: 13:26 27.8.05
Direc 21:31 6.10.04 
Kirjautumissysteemi, johon on upotettu yksinkertainen käyttäjänhallinta.
Testattu: Windows XP, Debian Linux, Ubuntu Linux (Apache2, PHP5)

Koodi on pääasiallisesti järkevästi etenevää ja pääkohdat on kommentoitu.
Editorina käytän itse Notepad++ -ohjelmaa, ja Mureakuhaa varten olen
asettanut TAB-kooksi kaksi välilyöntiä.

Ohjeet:
1. Luo admin.php jonnekin serverikansioon ja kopioi sisältä ylläolevaksi.
2. Luo kansio "accounts" sekä "accounts/super.user"
3. Aseta kansioiden oikeuksiksi 644 ja omistajaksi www-data
4. Luo kansioon "accounts" tiedosto [käyttäjänimi], jonka sisältö on "[md5-hash salasanasta]<>" (md5.php)
5. Luo kansioon "accounts" tiedosto "user.null"
6. Luo kansioon "accounts/super.user" tyhjä tiedosto nimeltä [käyttäjänimi] (sama kuin edellä, jotta olisit tehokäyttäjä)
7. Aseta em. tiedostojen oikeuksiksi 644 ja omistajiksi www-data

Changelog:

Versio 1.4
- $output-muuttujan käyttö tulostuksessa, jolloin...
- ...headereita voi käyttää ja käytetään
- EI ENÄÄ HUUDETTUJA KOMMENTTEJA
- ulkoasua hiottu
- koodia ja kommentointia hiottu ja siistitty
- tehokäyttäjäsivujen tarkistusta siistitty

Versio 1.3
- itseään ei voi poistaa
- tiedostofunktiot pitäisi olla kunnossa...
- valvojakäyttäjä on nyt tehokäyttäjä
- voi luoda tehokäyttäjän
- funktiota usernamereplaces on sievennetty
- kommenttiin lisätty ohje oman tiedoston lisäämiseksi

Versio 1.2
- käyttäjän poisto (vain superit)
- koodi 80 merkkiä leveää ;)

Versio 1.1
- kieli vaihdettu suomeksi
- poistettu muutama turha virhetarkistus
- ryhmitelty virheentarkastukset uudelleen
- kirjautumissivulle marginaalinen tietoturvaparannus
(ei paljasta käyttäjätilin olemassaoloa, jos salasana väärin)
- muutamaa riviä lyhennetty hieman
keith 07:26 7.10.04 
// If me made it this far through every check... ?
makeuu 08:21 7.10.04 
olisit tehny suomenkieliset tekstit?
Direc 11:36 7.10.04 
Typot korjattu. Voisin kyllä kääntää tekstit suomeksi... Mutta eipä alkuperäiskoodinkaan kielestä valitettu..?
Direc 12:50 7.10.04 
Versio 1.1

Muokkasin koodia seuraavasti:
- kieli vaihdettu suomeksi
- poistettu muutama turha virhetarkistus
- ryhmitelty virheentarkastukset uudelleen
- kirjautumissivulle marginaalinen tietoturvaparannus
(ei paljasta käyttäjätilin olemassaoloa, jos salasana väärin)
- muutamaa riviä lyhennetty hieman
makeuu 17:46 7.10.04 
taidan antaa plussan jo pelkästä vaivan-näöstä :D
Jarkkis 16:09 8.10.04 
jees, kiitoksia tästä!
helpompi olis ollu ehkä itse integroida nämä sivuille, jos olisivat olleet eri tiedostoissa, mut tää on kyl silti mahtava :D
editoitu: 16:09 11.10.04
Direc 16:08 11.10.04 
Versio 1.2

Lisää muokkaamista takanapäin:
- superkäyttäjät
(vaatii accounts/super.user/ -kansion, jossa tyhjä tiedosto, joka
on nimeltään superkäyttäjän login-nimi)
- käyttäjän poisto (vain superit)
- koodi 80 merkkiä leveää ;)

Seuraavaan versioon ajattelin koodata "salasanan pelastuksen", eli superkäyttäjä voi vaihtaa normaalikäyttäjien salasanoja. Muita ideoita?
sllz 09:16 12.10.04 
Mikä on tän salasana ja käyttäjätunnus? Kokeilin kaikkea ja koitin kattoo koodista mut en löytäny.
sllz 09:19 12.10.04 
Oon tehny kansion accounts ja sinne super.user sit tein sinne tiedoston (enkerro) missä vika? ei päästä sisää? toi enkerro ei oo se minkä sinne tein.
editoitu: 09:23 12.10.04
sllz 09:22 12.10.04 
ja ne on chmodattu 777
Jarkkis 19:15 12.10.04 
Direc kirjoitti:
Seuraavaan versioon ajattelin koodata "salasanan pelastuksen", eli superkäyttäjä voi vaihtaa normaalikäyttäjien salasanoja. Muita ideoita?


oisko mitää et käyttäjät pystyy muuttamaan omia tietojaan (kuten nimi, email), jotka siis tallentuisivat tuohon samaan tiedostoon salasanan kanssa. en saanut oikeen mitää aikaan kun yritin jotai.... vaikka tietoja vaihdetaa, salasana ei vaihdu, muutakun sitte tuosta vaihdasalasana -komennuksella.
editoitu: 21:02 14.10.04
Direc 20:57 14.10.04 
sllz: Tee PHP-tiedosto jonka sisältö on vaikkapa: <?php print(md5("telkkari")); ?> Tallennat ja suoritat sen, saat md5-hashin sanasta telkkari. Kopioi merkkijono ja tallenna se accounts-kansioon vaikkapa nimellä videot. Nyt käytössäsi on käyttäjänimi videot jonka salasana on telkkari. Lisää myös tyhjä tiedosto nimeltä videot super.user -kansioon, jolloin käyttäjällä on superoikeudet.

Jarkkis: Pistetään listaan. Koodin hyödyntäjien osalle jää tietysti se, mihin noita tietoja sitten käytetään ;)...

Niin, ja huomasin kun olin tehnyt jo tuon salasanan muutosominaisuuden, että sama onnistuu poistamalla käyttäjätili ja tekemällä se uudestaan halutulla salanimellä :/... No, tulipahan harjoitusta ;). Saa nähdä lisäänkö sen, tai täytyy yrittää jotenkin lyhentää sitä ainakin... Nyt on tässä viikonloppuna vähän kiireitä mutta täytyy ensi viikon aikana koittaa tehdä yksi versio eteenpäin.
netman87 12:38 19.10.04 
Saako tuon kopsata ja poistaa kommentit.... tai no eihän niitä tarvis poistaa kun php:tä? Mut kumminki....
Direc 17:43 24.10.04 
Kaikin mokomin, jopa suositeltavaa! Niin kauan kuin alkuperäiskoodin tekijällä ei ole mitään sitä vastaan..
editoitu: 18:05 9.11.04
sysrq868 18:04 9.11.04 
[niponip]
"pyyhiä", mikäs sana se semmoinen on?

print("Istuntotietoja ei voitu pyyhiä");

[/niponip]

Oikeampi olisi "pyyhkiä". En nukkunut äidinkielen tunnilla [/kukkashomppeli]
lahtis 02:23 20.11.04 
siis tehdään kansiot accounts/super.user/
ja tiedoston nimeksi valitaan käyttäjänimi ja md5 hashi tallennetaan tiedostoon. Jos tarkoitit tätä niin ei toimi vaikka olis chmodattu 777. (apache, linux) valittaa että käyttäjänimi tai salasana on väärin.
Direc 21:28 23.11.04 
Ei, vaan käyttäjänimi-tiedosto, sisällöltään md5-hash salasanasta, lisätään accounts-kansioon. Käyttäjänimi-tiedosto, sisällöltään tyhjä, lisätään super.user-kansioon, jos halutaan sennimisellä käyttäjällä olevan superkäyttäjän oikeudet. Itse olen käytellyt koodia vain Windows-alustalla, mutta kokeilen sitä paraikaa Linux-alustalla.
Direc 18:39 30.11.04 
Päänvaivaa siitä sain aluksi, mutta kun käyttäjätilitiedostojen omistajaksi määrittää apachen (chmod apache:apache * (siis kansiossa accounts)) niin homma lähti toimimaan. Linuxilla homma toimii siinä missä windows-alustallakin, mutta vielä pitäisi saada ääkköset toimimaan paikallisestikin ;)...
kleetus 21:09 6.12.04 
pitääkö tuo koodi tallentaa tiedostoon admin.php vai mitä ? kertokaa kun en osaa enkä ymmärrä mutta pitäis olla huomiseks yks kouluprojekti valmis ;)
editoitu: 15:57 15.12.04
lahtis 17:55 9.12.04 
miten tästä voi jatkaa jos haluaa että jotain lisäosia(scriptejä) olisi eri tiedostossa.
Scriptit sijaitsisi eri tiedostossa vaikkapa teksti.php kuinka tähän saadaan käyttäjä/superuser tunnistus? vai onnistuuko se. mitenkään.
eli aina index.php tiedoston kautta pitäsi loggautua sisään, jos haluaa jotain muuttaa.

eli kuinka tarkistetaan onko logguduttu oikella nimellä ja salasanalla sisään. Kuinka saman tarkistuksen voisi tehdä esimerkiksi eritiedosto.php scriptissä?

editoitu: 00:19 27.12.04
prz 21:07 26.12.04 
editoitu: 00:19 27.12.04
prz 21:09 26.12.04 
prz 21:17 26.12.04 
Hei Direc,

En saanut toimimaan tota ku en tajua miten saan uuden tilin lisättyä ja niitä super.user hommia miten pääsen sinne sivulle kun esim ei toimi http://www.przz.net/admin.php?sivu=uusitili ? Voisitko neuvoa?

Kiitos.

IRC Name: prz
prz 21:17 26.12.04 
voi vittu sori toi floodi tää opera vähä kälynen ku lagaa sori vain kaikki käyttäjät
prz 21:33 27.12.04 
Katotaanko näitä viestejä koskaan ? :)
lahtis 09:01 28.12.04 
ei kai. piti käyttää parempaa admin systeemiä.
prz 01:40 31.12.04 
...
sllz 05:02 8.1.05 
Saisko tota zippinä mistää?
Pizza 19:51 23.1.05 
No jou:

Warning: flock(): supplied argument is not a valid stream resource in /home/kaffir/public_html/login/admin.php on line 313

Warning: fwrite(): supplied argument is not a valid stream resource in /home/kaffir/public_html/login/admin.php on line 315

Warning: fclose(): supplied argument is not a valid stream resource in /home/kaffir/public_html/login/admin.php on line 322

Tulee kun kirjaudun.
Juujuu, chmodattu on 777.
editoitu: 13:08 24.2.07
Rainervirtanen 12:45 7.3.05 
Arochian 12:23 24.3.05 
Miku: Kannattaa varmaan poistaa tyhjät rivit PHP-tagien ennen/jälkeen. Ainakin virhe viitaisi tähän ongelmaan.
fgeek 15:02 3.5.05 
Hyvin toimiva. Hyvin tehty. Paljon vaivaa varmaankin, mutta toimii erinomaisesti. Kiitän.
temu92 17:59 16.5.05 
ei toimi
Jufa 13:52 27.5.05 
ööh... miten saan tehtyä itelleni accountin?
Sen verran ymmärsin että pitää tehä account-niminen kansio ja sinne pitäis tehä joku tiedosto mis on tunnukset.
Valaiskaapas vähäsen.
tsuriga 16:02 9.7.05 
Älkää kommentoiko vain "ei toimi", vaan kertokaa myös hieman taustatietoa, käyttis, versiot, mikä virheilmoitus, etc. Tällä hetkellä skripti ei kuulemani mukaan toimi PHP 5.0 aikaisemmilla versioilla ilman output bufferointia, eli sijoittakaa koodin alkuun ob_start(); ja loppuun ob_end_flush(); niin ei tule "Cannot modify header information". Direc voisi lisätä skriptiinsä oman output bufferoinnin, eli tallentaisi tulostukset muuttujaan ja tulostaisi vasta headereiden lähetyksen jälkeen, eli viimeisen elsen lopetussulun jälkeen. Lisäksi skriptiin voisi lisätä virheenkäsittelyä, nyt suoritus loppuu default-virheilmoitukseen jos esimerkiksi flock epäonnistuu.
roomer 21:36 12.8.05 
Voisko kertoo, että mitkä tiedostot pitää chmodata ja millä luvuilla? chmodasin ne user tiedostot 777:llä.. mutta kun painaa sisään nappia tietojen kanssa.. ei pääse sisään, tulee vain hostin error sivu.
Direc 21:01 19.8.05 
On vähän jäänyt armeijan takia vähiin tämän palsan silmäily, mutta koitan tässä viikonlopun aikana koota "selitykset" kasaantuneista kysymyksistä...
editoitu: 15:31 20.8.05
jarkko 15:30 20.8.05 
Voin antaa vähän helppiä et miten laitat tän Login Systemin pelaamaan. Elikä Ensiks:
1. Tee Admin.php tiedosto.
2. Liitä sinne ylläoleva scripti.
3. Luo kansio nimeltä: accounts samaiseen kansioon jossa admin.php
4. Luo kansio nimeltä: super.user Juuriluomaasi accounts kansioon.
5. Chmodaa molemmat kansiot 777
6. Luo tiedosto jonka nimeksi tulee (oma nickisi) esim: MunNicki.php
7. Aja esim.: MunNicki.php selaimessa: http://www.hostipalvelu/~Munsivut/MunNicki.php
8. Kopioi koodi sivulta ja liitä se MunNicki.php sisään ellei siellä koodi jo valmiiksi lue.
9. Poista pääte: .php niin että tiedoston nimeksi jää vain esim.: MunNicki
10. Nyt kun esim.: MunNicki on valmis accounts kansiossa, laita saman niminen päätteetön tiedosto (tyhjänä) super.user kansioon.
11. http://www.hostipalvelu/~Munsivut/admin.php

Tän jälkeen kenenkään ei pitäs valittaa virheistä. PS mulla ainakin toimii.
editoitu: 13:55 27.8.05
Direc 20:57 21.8.05 
Kaikille: Nyt on ohjeetkin tehty, ja tiedostopaketti löytyy kahdessa formaatissa:
http://direc.ath.cx/admin.zip
http://direc.ath.cx/admin.tar

Triga: Huomasin saman itsekin, huomasin vasta nyt että olit kommentoinut tuon (mutta kukas minua uskoo :)...

fgeek: Ole hyvä.

Miku: Headerit toimii nyt.

Lahtis: PHP hoitaa asiaa session cookiella. Katso myös rivi 54.

rusinax 09:23 11.10.05 
Warning: fopen(accounts/rusinax): failed to open stream: Permission denied in /mbnet/s/sllz/admin.php on line 395

Warning: flock(): supplied argument is not a valid stream resource in /mbnet/s/sllz/admin.php on line 396

Warning: fwrite(): supplied argument is not a valid stream resource in /mbnet/s/sllz/admin.php on line 398

Warning: fclose(): supplied argument is not a valid stream resource in /mbnet/s/sllz/admin.php on line 406




Miksi tommoinen virheilmotus kun koitan mennä sisään?
http://koti.mbnet.fi/sllz/admin.php
Direc 10:40 23.10.05 
Ilmeisesti MBNet käyttää Apachen tai PHP:n käyttäjänimenä jotain muuta nimeä. Ota yhteys MBNetin ylläpitoon ja kysy mikä pitää olla tiedoston omistaja, jotta PHP:lla olisi tiedoston lukuun ja kirjoitukseen tarvittavat oikeudet.
rusinax 16:48 3.11.05 
Tiedän että tää on varmaankin ns. "rauhoitettu" mut kumminski.
Oon tehny kaikki ohjeitten mukaa ja ku koitan kirjautua ni tulee "Käyttäjänimi tai salasana väärin!" Vaikka tiedän et ne ei oo väärin, käytin tätä systeemiä:

<?php print(md5("salasanani")); ?>

Ja se mitä siitä sain irti nettiselaimella tein tiedoston: confs ja pistin sen md5 jutun siihen tiedostoo. ja sit tein sinne super.user kansioo sen confs tiedoston (tyhjä oli)..

Käytän MBNettiä.
-----------------------
http://koti.mbnet.fi/sllz/EditHx/admin.php
-----------------------
ares01 20:00 12.11.05 
Tein kaiken ohjeiden mukaan ja laitan asettamani tunnukset ja salikset, mutta kone väittää että salis olis väärin???

Direc 09:26 14.11.05 
rusinax: Tee salasanatiedosto esimerkiksi Notepad++ -ohjelmalla. Muista laittaa <> paikoilleen!

ares01: Anna lisätietoja järjestelmästä, jossa yrität saada tuota toimimaan.
rusinax 15:20 19.11.05 
"Tein kaiken ohjeiden mukaan ja laitan asettamani tunnukset ja salikset, mutta kone väittää että salis olis väärin???"

Mulla ihan sama juttu, käsitit jotenki ja annoit eri ohjeet?..


xxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Direc 09:26 14.11.05 Lainaa
rusinax: Tee salasanatiedosto esimerkiksi Notepad++ -ohjelmalla. Muista laittaa <> paikoilleen!

ares01: Anna lisätietoja järjestelmästä, jossa yrität saada tuota toimimaan.
xxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Direc 12:09 12.12.05 
rusinax: Tarkoitin, että luo salasana-hash md5.php -tiedoston avulla ja copypasteta se vaikkapa kyseisellä editorilla uuteen tiedostoon, lisää perään <> ja tallenna nimellä haluamaasi kansioon. Mikäli kirjautuminen epäonnistuu, tarkista, että saamasi MD5-hash ja käyttäjänimitiedostossa oleva MD5-hash ovat identtiset.
nakkisormi 18:48 13.12.05 
Warning: file(): Unable to access accounts/usernull in /mbnet/m/makiweb/uusi/Admin/admin.php on line 36

Warning: file(accounts/usernull): failed to open stream: Permission denied in /mbnet/m/makiweb/uusi/Admin/admin.php on line 36

Joo väänsin tän kaa 2 tuntii ja saan vaa tälläst. Teenkö jotain vääri?
H.P.Anders 19:50 25.1.06 
Menen admin.php tiedostoon herjaa heti ensimmäiseksi tälläistä:

Warning: file(accounts/usernull): failed to open stream: No such file or directory in /home/kuplakyl/public_html/club_2/admin.php on line 36


Ja kun kirjaudun tunnuksellani herjaapi tuon äskeisen lisäksi tälläistä:

Warning: Cannot modify header information - headers already sent by (output started at /home/kuplakyl/public_html/club_2/admin.php:36) in /home/kuplakyl/public_html/club_2/admin.php on line 335

Mistäköhän nyt kiikastaa. :/
editoitu: 21:42 29.1.06
Direc 21:38 29.1.06 
nakkisormi: tiedoston pitäisi olla "user.null", koodista löytyi ainakin vain pisteellisiä nimiä, joten tarkistapa koodiasi ja tiedostojasi...

H.P.Anders: Sama. Headers-ongelmaan auttaa kun käytät sivulta löytyvää koodia.

EDIT: H.P.Anders: Käytät ilmeisesti koodia omilla sivuillasi? Jos näin, tarkista, että mahdollisesti ennen tätä koodia ei ole _yhtään_ print tai echo -funktioita; tämä rikkoo header-toiminnon. Kerää tulosteet $output-muuttujaan ja lisää piste koodiini html-headerit kohtaan ennen =-merkkiä (katso mikä tahansa muu $output-esiintymä).
Veikko91 13:00 4.2.06 
Eli siis, kopion ton koodin, teen tiedoston "adminlogin.php" ja liitän vaan ton koodin sinne eikä muuta??
ananas 20:51 6.2.06 
tollasta tulee kun yritän kirjautua

Warning: file(): Unable to access accounts/usernull in /mbnet/h/huhkajat/admin.php on line 36

Warning: file(accounts/usernull): failed to open stream: No such file or directory in /mbnet/h/huhkajat/admin.php on line 36

Warning: fopen(accounts/ananas): failed to open stream: Permission denied in /mbnet/h/huhkajat/admin.php on line 329

Warning: flock(): supplied argument is not a valid stream resource in /mbnet/h/huhkajat/admin.php on line 330

Warning: fwrite(): supplied argument is not a valid stream resource in /mbnet/h/huhkajat/admin.php on line 332

Warning: fclose(): supplied argument is not a valid stream resource in /mbnet/h/huhkajat/admin.php on line 340

ja sitten vielä

sisään kirjautuminen epä onnistui missä on vika
alussa 07:20 9.2.06 
Moi,
Olen tässä nyt pähkäillyt jonkin aikaa kohdan
Lahtis: PHP hoitaa asiaa session cookiella. Katso myös rivi 54.

kanssa.
Miten saan erillisen sivun toimimaan siten että tällä systeemillä on ensin pitänyt kirjautua sisään(eli sivu ei näy jos laittaa sivun suoraan selaimesta)? Olen näet luonut valikkoon linkkejä eri sivuille jotka toimivat hyvin mutta tosiaan tuo kirjautumistarkistus pitäisi jotenkin saada myös noille sivuille toimimaan.
Tämä ei oikein aukea minulle:
/////
// Jos haluat lisätä oman toiminnon eri tiedostossa,
// lisää tähän kohtaan:
// elseif($_GET['sivu'] == "uusitoiminto")
// { require("sivu.php"); }
// Jotta uutta sivua ei voi käyttää yksinään
// suoraan WWW-selaimelta, lisää alkuun vaikkapa:
// if($_GET['sivu'] == "uusitoiminto") { (oma sisältö }
//
// Tietysti myös riville 290 tai 298 täytyy
// lisätä vastaava linkki, jossa sivun saa auki!
/////

Voisiko joku ystävällisesti auttaa aloittelijaa tässä ongelmassa, kiitos.
lahtis 23:48 12.2.06 
Voisihan tota kokeilla miten tää toimii nyt. Kun on php:kin tullut aikapaljon enemmän tutummaksi.
Direc 20:22 19.3.06 
Veikko91: Ohjeet on siellä ylhäällä.

ananas: Tiedostonimestä on jossain kohtaa kadonnut piste. Se on siinä ihan tarkoituksella. Tarkista kopioitu koodi ja tiedostonimi.

alussa: Tuota en itse olekaan kovin syvällisesti tullut ajatelleeksi... Yhden keinon tässä äkkiseltään kyllä keksin: pistä ennen require("sivu.php") riviä vaikkapa $does_this_variable_exist = "yes it does exist";. Sitten oman tiedostosi ensimmäiseksi riviksi teet if($does_this_variable_exist !== "yes it does exist") {die;} eli jos tuota muuttujaa ei ole, eli sivu on ladattu yksinään, suoritus tyssää siihen, eikä kukaan tiedä miksi, joten takaoven kautta sorkkiminen ei onnistu. PS. Saman voi kyllä tehdä jo sivun alkuun, jolloin voit käyttää samaa kaavaa kaikilla sivuilla.
shipper 14:15 2.4.06 
Mulla kävi silleen, et sain ton sivun toimii aluksi oikein, mutta sitten muutamia päiviä myöhemmin kävin jotain sorkkimassa accounts-kansiossa.
Sen jälkeen on valittanut seuraavaa:
- - - -
Warning: file(): Unable to access accounts/usernull in /mbnet/s/skannerz/admin.php on line 95

Warning: file(accounts/usernull): failed to open stream: No such file or directory in /mbnet/s/skannerz/admin.php on line 95
- - - -
tarkistin vielä, että toi "user.null" tiedosto on muotoa "user.null" ja se sisältää ainoastaan koodin "<>"
ja sitten kun kirjaudun omilla tunnuksillani sivuille, jotka ei aukea tuon ylläolevan virheen takia, niin accounts-kansion oman tunnuksen sisältöön tapahtuu pieni muutos.
aluksi se md5-passu on muotoa:
xxxxxxxxxxxxxxx<>
mutta sen kirjautumisyrityksen jälkeen:
xxxxxxxxxxxxxxx<>yyyyyyyyyyyyyy

Mitähän pitäis tehdä, että sais taas toimii?

shipper 21:16 30.4.06 
oisko kellää tietoo, miten sais ton toimiii? oon antanu jopa tiedostolle accounts oikat 777 ja sen sisältämille tiedostoille myös, mutta samaa vieläkin valittaa
eikö joku pystys opastaa?
eis 20:51 7.5.06 
shipper kirjoitti:
Warning: file(): Unable to access accounts/usernull in /mbnet/s/skannerz/admin.php on line 95
tarkistin vielä, että toi "user.null" tiedosto on muotoa "user.null" ja se sisältää ainoastaan koodin "<>"


Öh. usernull vai user.null? Kumpiko? :P
blocking 12:00 19.6.06 
"Warning: file(): Unable to access accounts/usernull in /mbnet/s/sllz/boxi/login/admin.php on line 36

Warning: file(accounts/usernull): failed to open stream: No such file or directory in /mbnet/s/sllz/boxi/login/admin.php on line 36"


Missä vika?? kaikki on 777
devil 21:05 7.9.06 
miten tol suojataan tiedosto??
mamba 13:43 19.9.06 
Nyt on tapeltu tämän kanssa jo hetki, alkoi pelittämään jotenkin kun vaihdoin user.null filun usernulliksi!?.
Harmi ettei noita ohjeita enää tuolla palvelimella ole. Eli chmodasin myös login filut 777 jolloin pääsen loggaamaan sisään ilman virheitä, mutta sama ruutu pamahtaa uudestaan eteen, eli ei avaa mitään hallintasivua, missäköhän mahtaa olla vika? :)
editoitu: 18:01 14.10.06
sq 17:57 14.10.06 
Oon käyttäny tätä omalla koneellani ja hienosti on toiminut ja toimii vieläkin hienosti omalla koneella. Mutta kun siirrän koodin nettiin nii eipäs vaan toimikaa?!? Valittaa tota "Warning: file(accounts/usernull): failed to open stream" eikä avaa sitä hallintasivua lainkaa. Kuitenkin koodi on kirjottanut käyttäjän filuun sen "$accountdata[0]<>$id" mutta mitään ei tapahdu... Mitä tehdä? Ei oo mitn hajua, koska samanlaisena koodi toimii koneella xamppin kanssa mut sit ku siirrän sen nettii nii sitpä ei toimikkaa... :S

"Warning: file(accounts/usernull): failed to open stream" <--- ja toi siis todellakin on tiedosto(user.null), mutta eikös tuo functio usernamereplaces(); muuta siitä sen pisteen pois? Jotenki tulin siihen tulokseen että sen ei pitäs muuttaa tota user.null muotoon usernull?!? Ja siis voisko ongelma olla tässä kohdassa:

if(($_SESSION['username'] != FALSE) && (!empty($_SESSION['username'])))
{
  $username = usernamereplaces($_SESSION['username']);
  $accountfile = file("accounts/$username");
  $accountdata = explode("<>", $accountfile[0]);
 
  if(file_exists("accounts/super.user/$username"))
    $superuser = TRUE;
}

shipper 18:12 9.11.06 
eis kirjoitti:
shipper kirjoitti:
Warning: file(): Unable to access accounts/usernull in /mbnet/s/skannerz/admin.php on line 95
tarkistin vielä, että toi "user.null" tiedosto on muotoa "user.null" ja se sisältää ainoastaan koodin "<>"


Öh. usernull vai user.null? Kumpiko? :P

user.null
ja jokaisella tiedostolla on chmod 777
Juhowee 19:19 11.11.06 
Sis mä en tajua, valittaa vaan että:

Warning: file(accounts/usernull): failed to open stream: No such file or directory in /home/int2000/27484/html/kirjautumis/admin.php on line 36

Mulla on tällainen tiedostorakenne:

Palvelin

/kirjautumis
- admin.php - sisältää ylläolevan koodin

/accounts
- juho - minun käyttis, sisältää md5 passun jonka perässä <>
- user.null - sisältää <>

/super.user
- juho - tyhjä

Yritin kaikkea, jopa vaihtaa user.null tiedoston nimeä (vaihdoin sitä myös admin.php:ssa). Oikeuksia kaikilla on 777. En tajua missä vikaa. Pliis auttakaa ;)
editoitu: 15:11 18.11.06
Direc 15:10 18.11.06 
Opiskelut ovat vieneet ajastani 50% ja v*ttuileva Escorttini 65%, mutta taas ollaan ainaskin auttelemassa!

Kaikille "usernull vai user.null?!?" ongelmaisille kehoitan syventymään ekan postauksen kohtaan 5.

5. Luo kansioon "accounts" tiedosto "user.null"

Suomeksi: Luo tyhjä tiedosto. Piste. Ei mitään <> eikä mitään muutakaan, koko on nolla. Jos tiedosto ei ole tyhjä. Ensimmäinen ongelma tullee rivillä 54, jossa if-tarkistuksessa koodi "!empty($accountdata[1])". Toisaalta, voisihan sitä parannella login-tarkastusta, mutta tällä hetkellä aika on melko lailla kortilla... Ehkä joulun korvilla?

Yksi asia, mitä aina täytyy pelätä, on PHP:n uudet ominaisuudet ja vanhojen rikkoutumiset. Voi olla, että koodi ei enää ole uusimman kanssa yhteensopiva, mutta tähänkään ei ole juuri nyt aikaa paneutua.

Ja jokaiselle, jonka postauksessa esiintyy numeroyhdistelmä "777": Lukekaa ne ohjeet! Ne tiedostot, joiden sisältö muuttuu, omistaja on www-data (tarkistakaa oman ympäristönne palvelinohjelman käyttämä nimi) ja oikeudet 644. 7 tarjoaa suorituksen, mitä ei yksikään tiedosto tarvitse.

Niin ja tuosta serveriasiasta... Palvelin oli/on omani, yritän saada senkin jälleen pystyyn, toivottavasti joululomalla.
editoitu: 19:02 4.1.07
Jonzku 18:25 10.12.06 
Voisko joku selventää tätä kohtaa: 4. Luo kansioon "accounts" tiedosto [käyttäjänimi], jonka sisältö on "[md5-hash salasanasta]<>" (md5.php)

En tajua tuota md5 juttua..

Niin ja kuinka saan omistajaksi www-data SmartFTP Client 2.0 -ohjelmalla?

Ja JuhoWee: /super.user kansiossa "juho" -tiedosto pitää sisältää md5 passun jonka perässä <>
editoitu: 22:59 24.12.06
sittura 22:57 24.12.06 
mitä tarkoittaa että asetetaan tiedoston omistajaksi www-data? anteeksi, olen hieman pihalla
(ja miulla ilmottaa kans että käyttäjätunnus tai salasana on väärin, vaikka oikein pitäs olla)
Direc 10:35 19.1.07 
Jonzku: MD5 on tarkistesumma; sen takia salasanaa ei näe tekstitiedostosta suoraan, vaan tarkistussummien pitää täsmätä. SmartFTP-ongelmaan neuvon käyttämään hiiren oikeaa painiketta ja tutkimaan kaikki valikot läpi. Ja super.user-kansiossa olevien tiedostojen on oltava tyhjiä! Tai siis, ei niiden tarvitse olla tyhjiä, mutta vain tiedoston olemassaolo ratkaisee.

if(file_exists("accounts/super.user/$username"))
    $superuser = TRUE;


Eli luot kansioon "accounts" tiedoston, jonka nimi on identtinen haluamasi käyttäjätunnuksen kanssa, esim "direc". Sen sisältö sisältää salasanasi MD5-summan, jonka voit generoida esim. md5.php -tiedoston avulla (avaa se selaimeen) ja merkit "<>". Eli jotain tällaista:

siejtoiu38so582h5a<>

sittura: Se tehdään siksi, että Apachella (joka ilmenee järjestelmälle käyttäjän www-data kautta) olisi olikeudet tiedostojen kanssa leikkimiseen.
pedro 13:02 19.2.07 
no mites nyt kun muutin ftp ohjelmalla noita chmod asetuksia niin sitä kansiota ei enää näy? eikä koko kansiota voi edes poistaa? miten ne voi poistaa.. ja miten noita chmod asetuksia voisi laittaa esim xamppia käytettäessä ettei tarvitsisi siirtää johonkin palvelimelle noita juttuja?
Marbo 18:12 29.3.07 
Hyvinhän tuo toimii mutta muokata piti itselleen sopivaksi.
basari 15:32 18.5.07 
Hmm... Onko kenelläkään noita kaikkia pakattuna kun multa taas ei luonnistu tämän asentaminen / noiden teko :D eli jos jollain olis pakattuna niin <3 ja vois tietenkin antaa :D
JLA 11:26 19.6.07 
Jostain syystä userilla pääsee kirjautumaan sitään, mutta super.userilla ei. Vaikka siirrän toimivan userin super.user -kansioon, sen jälkeen sillä kopiodulla userilla ei pysty enää kirjautumaan, osaako joku kertoa missä vika?
editoitu: 07:19 18.9.07
Patre 16:34 17.9.07 
Joo minäkään en oikeen ymmärtänyt tuota salasana asiaa.
Urgo 00:16 14.10.08 
Sain toimii, mut mihinkäs tätä vois sit käyttää? :(
mazel 12:35 26.1.09 
Saisikohan tätä mistään pakattuna valmiiksi? Iskee kokoajan "Käyttäjänimi tai salasana väärin!".
Direc 22:12 13.2.09 
pedro: Oma palvelin? Sudo. Palveluntarjoaja? Ylläpidon kautta.

Marbo: Hyvä kuulla että vieläkin kelpaa jollekin :)

basari / mazel: Yritän heittää .tar.gz-pakettia johonkin suuntaan tulevalla viikolla.

Patre: $newpassword = md5($_POST['newpassword']); // Salasanasta tallennetaan MD5-hash. Itse salasanaa ei tallenneta.

Urgo: Tämä on kirjautumisjärjestelmä, eli kirjautumiseen. Jos haluat tekevän sen muutakin, koodaa lisää toimintoja.

Koodi on vanhaa, ja jotkut toiminnot on tehty aika helkatin hankalasti, näin myöhemmin asiaa tarkastellen. Jos aikaa löytyy, päivittelen tämän ns. uuteen uskoon, tuleepa samalla tarkastettua toimivuus tuoreemmalla PHP:llä.

Cheers, buddies!
editoitu: 04:15 3.8.09
clacier 13:09 26.7.09 
Nää, ei toimi.

Heittää uutta erroria allthetime kun vanhan saa pois edestä..


Viittiskö joku, jolla toimii niin tehdä esim. pakettia tästä? O.o
UCn 17:18 24.9.09 
Toimii mahtavasti,

MUISTAKAAHAN KAIKKI CHMODATA TIEDOSTOT/KANSIOT 777:LLA EIKÄ TOLLA 644:LLÄ NIINKU OHJEISSA LUKEE :P

sry caps mut luulis ton kiinnitävän huomioo jos joku ees jaksaa näin alas selata, kiitoksia paljon koodinpätkästä