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ä.
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.
Aihe on jo aika vanha, joten et voi enää vastata siihen.