Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Sivujen salaaminen

Nemo.T [10.12.2004 00:34:19]

#

Mielestäni erittäin käyttökelpoinen sivujen salaus systeemi.
Tietokannasta luetaan username ja password.
Salausta tarvitseville sivuile ei tarvitse muuta kuin lisätä <?php require_once('./protect.php'); ?>

Ongelmana tässä on se, että (protect.php) on hieman keskeneräinen. Nyt se vain tarkastaa onko syötetty username ja password ylipäätään tietokannassa --> pientä toiminnallisuutta siis puuttuu..


loginform.php

<p>Please, insert login name and password</p>
<form action="<?php echo $_SERVER[SCRIPT_NAME]; ?>" method="post">
<input type="text" name="login_username" />
<input type="password" name="login_password" />
<input type="submit" value="Login" />
</form>

login.php

<?php

  include_once("mysql.php");
  $select = "SELECT id FROM user_auth".
            " WHERE username='".
            addslashes($_REQUEST['login_username']).
            "' AND password=PASSWORD('".
            addslashes($_REQUEST['login_password']).
            "')";
  $stmt = mysql_query($select);
  if (!$stmt) {
    echo "<pre>\n$select\n".mysql_error()."\n</pre>";
  }
  $row = mysql_fetch_assoc($stmt);
  // if first column of the first row is set,
  // show the page which was originally requested
  if ($row['id']) {
    // set the session variable
    $_SESSION['userid'] = $row['id'];

    // $goto is the complete address of the page that the user requested
    $goto = "http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
    $goto_enc = htmlentities($goto);

    // Location: header will direct the browser to another URL
    header("HTTP/1.1 303 See Other");
    header("Location: $goto");
    // META tag is for browsers that don't understand Location: header
    echo "<meta http-equiv=\"Refresh\" content=\"0;URL=$goto_enc\">\n";
    // And a normal link for browsers that don't support META Refresh
    echo "<a href=\"$goto_enc\">$goto_enc</a>\n";
    exit();
  }

?>

logout.php

<?php
  session_start();
  session_unset();
  session_destroy();
?>
<p>Thanks for visiting us.  You have now logged out successfully.</p>
<p><a href="<?php echo $_SERVER['HTTP_REFERER'] ?>">Try to go back...</a></p>

protect.php

<?php

  session_start();

  if (isset($_REQUEST['login_username']) &&
      isset($_REQUEST['login_password'])) {
    // if variables are set, user is trying to log in
    include_once('login.php');
    if (!$_SESSION['userid']) {
      // username and password didn't match
      echo "<p>Authentication failed</p>";
      include('loginform.php');
      exit();
    }
  }


  if (!$_SESSION['userid']) {
    // if $_SESSION['userid'] is not set,
    // user hasn't logged in succesfully
    // view log in form instead of requested content
    include('loginform.php');
    exit();
  }
?>

secret.php

<?php require_once('./protect.php'); ?>
<h1>Secret Page</h1>
<p>Your user id is <?php echo htmlentities($_SESSION['userid']); ?>!</p>
<?php
  require_once('./mysql.php');
  $select = "SELECT username FROM user_auth WHERE id='".
            addslashes($_SESSION[userid])."'";
  $stmt = mysql_query($select);
  $row = mysql_fetch_assoc($stmt);
  $username = $row['username'];
?>
<p>Your user name is <?php echo htmlentities($username); ?>!</p>
<p><a href="logout.php">Log out</a></p>

Mikään muu filu ei mielestäni siis tarvitse lisää koodia kuin (protect.php)
Nämä koodinpätkät ovat muuten alkujaan tkk:n php-ohjelmoinnin kurssilta. Kotitehtävä...

Tämän kun joku osaa koodata toimimaan niin saadaan koodivinkkeihin yksi salaus-systeemi lisää..

ps. filuista jätetty tahallaan pois mysql.php jossa tietokantayhteydet ym. config sälä.

ajv [10.12.2004 20:13:00]

#

Hyvän näköistä koodia kieltämättä. Koodista näkee kyllä samantien, että se ei ole kenenkään itseoppineen harrastelijan (kuten allekirjoittanut) kirjoittamaa. Omassa kirjautumissysteemissä tuota protect.php:tä vastaava tiedosto hakee kannasta käyttäjän tiedot ja pistää ne assosiatiiviseen taulukkoon. Eli tähän tyyliin:

<?php
$user = false;
$stmt = mysql_query("SELECT * FROM user_auth WHERE id='".addslashes($_SESSION[userid])."'";
if(mysql_num_rows($stmt) == 1){
    $user = mysql_fetch_assoc($stmt);
}

//Nyt käyttäjän tunnistus myöhemmissä koodeissa toimii ihan näin
if($user) echo "Tervetuloa ".$user['username'];
if($user && $user['level'] == 10) echo "Wohow!! Sinulla on superadminin oikeudet";

?>

Tuo on systeemi on aivan omien aivojen tuotosta, jos jollain parempi tyyli, niin saa toki kertoa.
Niin ja lisäksi en talleta sessioon käyttäjän id:tä, vaan istuntotunnuksen. Ei ole kyllä hajuakaan miten joku kräkkeri noita session arvoja pääsisi sörkkimään, mutta jos hän pääsee, niin id:n arvoa (joka siis yleensä on ihan normaali kokonaisluku ja vieläpä järjestyksessä kasvava) on helppo muokata. Sen sijaan md5()-sössöä saa aika kovasti muokkailla ja kokeilla ennen kuin löytää kannasta vastaavan arvon.

Vastaus

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

Tietoa sivustosta