Hej udviklinger
http://www.udvikleren.dk/PHP/Thread.aspx/6/23631/Jeg har ud fra jeres hjælp sammensat et loginsystem.
Jeg vil gerne have jer til at rette de eventuelle fejl/mangler i koden før jeg begynder at sammensætte en artikel om det.
index.php
<html>
<head>
<title>Sikret side</title>
</head>
<body>
<h1>Super sikkert loginsystem</h1>
<h2>af Sam S. Olesen</h2>
<a href="register.php">Registrer ny bruger</a><br><br>
<a href="login.php">Login</a><br><br>
<a href="file.php">Sikret side</a><br><br>
<?php
if ($_GET["msg"]==reg) {
echo '<p style="color:green;">Brugernavn og password var ledigt og er godkendt</p><br>';
}
?>
<p>Copyleft: Sam Sepstrup Olesen 2008
</body>
</html>
register.php
<html>
<head>
<title>Registrer</title>
</head>
<body>
<h1>Indtastning af nye brugere</h1>
<h2>Indtast brugernavn og password</h2>
<?php
if ($_GET["error"]=="empty") {
echo '<p style="color:red;">Du skal udfylde begge felterne</p>';
} elseif ($_GET["error"]=="notfree") {
echo '<p style="color:red;">Brugernavnet er ikke ledigt</p>';
} elseif ($_GET["error"]=="notlong") {
echo '<p style="color:red;">Adgangskoden skal være på mindst 8 tegn</p>';
} elseif ($_GET["error"]=="indic") {
echo '<p style="color:red;">Adgangskoden blev fundet i en liste over svage koder, skriv en sikrere adganskode</p>';
} elseif ($_GET["error"]=="equal") {
echo '<p style="color:red;">Brugernavnet og adgangskoden må ikke være ens</p>';
}
?>
<form action='create.php' method='post'>
<p>Brugernavn: </p>
<input type='text' name='username' />
<br><br>
<p>Password: </p>
<input type='password' name='password' />
<br><br>
<input id='opret' type='submit' name='opret' value='Opret' />
<input type='reset' name='slet' value='Reset' />
<br><br><a href="index.php">Tilbage</a><br><br>
<p>Copyleft: Sam Sepstrup Olesen 2008
</form>
</body>
</html>
create.php
<?php
// Gør en variabel sikker
function quote_smart($value)
{
if (get_magic_quotes_gpc()) {
$value = stripslashes($value);
}
if (!is_numeric($value)) {
$value = "'" . mysql_real_escape_string($value) . "'";
}
return $value;
}
// HUSK AT ÆNDRE DEN EFTER FØLGENDE LINJE TIL DIN EGEN DATABASE FORBINDELSE!!
mysql_connect("localhost", "databasebrugernavn", "databasepassword"); mysql_select_db("database");
//Tjek om felterne er udfyldt
if ($_POST['username']==""||$_POST['password']=="") {
header('Location: '.rtrim(dirname($_SERVER['PHP_SELF']), '/\\\\').'/register.php?error=empty');
exit;
}
// Sikre username mod farlige tegn
$match=array("&","<",">");
$replace=array("& # 3 8 ;","& # 6 0 ;","& # 6 2 ;"); // FJERN MELLEMRUMMENE I DENNE LINJE!! (udvikleren.dk laver koden om til tegn)
$username=str_replace($match,$replace,$_POST['username']);
// Tjek om brugernavnet er ledigt
$usernamecheck=mysql_query("SELECT NULL FROM userlogin WHERE username=".quote_smart($username)) or die(mysql_error());
if (mysql_num_rows($usernamecheck)>0){
header('Location: '.rtrim(dirname($_SERVER['PHP_SELF']), '/\\\\').'/register.php?error=notfree');
exit;
}
//Tjek om længde af password er over 8
if (strlen($_POST['password'])<8) {
header('Location: '.rtrim(dirname($_SERVER['PHP_SELF']), '/\\\\').'/register.php?error=notlong');
exit;
}
// Tjek om brugernavn og password er ens
if ($_POST[username] == $_POST['password']) {
header('Location: '.rtrim(dirname($_SERVER['PHP_SELF']), '/\\\\').'/register.php?error=equal');
exit;
}
// Tjek om password er i dictionary.txt
if (strstr(file_get_contents("dictionary.txt"), $_POST['password']) != FALSE) {
header('Location: '.rtrim(dirname($_SERVER['PHP_SELF']), '/\\\\').'/register.php?error=indic');
exit;
}
// Forbered data
if($_POST['username'] && $_POST['password']){
$pass=$_POST['password'];
$salt=substr(sha1(uniqid(mt_rand(),true)),0,8);
$cryppass=sha1(sha1($salt).$pass);
//Indsæt data
mysql_query("INSERT INTO userlogin (username, salt, password) VALUES(".quote_smart($username).", ".quote_smart($salt).", ".quote_smart($cryppass).")") or
die(mysql_error());
header('Location: '.rtrim(dirname($_SERVER['PHP_SELF']), '/\\\\').'/index.php?msg=reg');
exit;
}
else{
header('Location: '.rtrim(dirname($_SERVER['PHP_SELF']), '/\\\\').'/register.php');
}
?>
login.php
<html>
<head>
<title>Login</title>
</head>
<body>
<h1>Login</h1>
<h2>Indtast brugernavn og password</h2>
<?php
if ($_GET["error"]=="wrong") {
echo '<p style="color:red;">Forkert indtastet brugernavn og/eller password</p>';
} elseif ($_GET["error"]=="notloggedin") {
echo '<p style="color:red;">Den side du forsøgte at komme ind på kræver login</p>';
}
?>
<form method="post" action="check.php">
<p>Brugernavn: </p>
<input type='text' name='username' />
<br><br>
<p>Password: </p>
<input type='password' name='password' />
<br><br>
<input type="submit" value="Log in" />
<br><br><a href="index.php">Tilbage</a><br><br>
<p>Copyleft: Sam Sepstrup Olesen 2008
</form>
</body>
</html>
check.php
<?php
// Gør en variabel sikker
function quote_smart($value)
{
if (get_magic_quotes_gpc()) {
$value = stripslashes($value);
}
if (!is_numeric($value)) {
$value = "'" . mysql_real_escape_string($value) . "'";
}
return $value;
}
// Sikre username mod farlige tegn
$match=array("&","<",">");
$replace=array("& # 3 8 ;","& # 6 0 ;","& # 6 2 ;"); // FJERN MELLEMRUMMENE I DENNE LINJE!! (udvikleren.dk laver koden om til tegn)
$username=str_replace($match,$replace,$_POST['username']);
// HUSK AT ÆNDRE DEN EFTER FØLGENDE LINJE TIL DIN EGEN DATABASE FORBINDELSE!!!
mysql_connect("localhost", "databasebrugernavn", "databasepassword"); mysql_select_db("database");
// Hent salt
$salt=mysql_query("SELECT salt FROM userlogin WHERE username=".quote_smart($username)) or die(mysql_error());
// Forberedelse af data
$pass=$_POST['password'];
$salt2=mysql_fetch_array($salt);
$cryppass=sha1(sha1($salt2['salt']).$pass);
// Sammenligning af password
$result=mysql_query("SELECT NULL FROM userlogin WHERE username=".quote_smart($username)." AND password=".quote_smart($cryppass)) or die(mysql_error());
if (mysql_num_rows($result)>0){
session_start();
$_SESSION['username']=$username;
$_SESSION['password']=$cryppass;
header('Location: '.rtrim(dirname($_SERVER['PHP_SELF']), '/\\\\').'/file.php');
exit;
}
else
{
header('Location: '.rtrim(dirname($_SERVER['PHP_SELF']), '/\\\\').'/login.php?error=wrong');
}
?>
file.php
<?php
function quote_smart($value)
{
if (get_magic_quotes_gpc()) {
$value = stripslashes($value);
}
if (!is_numeric($value)) {
$value = "'" . mysql_real_escape_string($value) . "'";
}
return $value;
}
session_start();
// HUSK AT ÆNDRE DEN EFTER FØLGENDE LINJE TIL DIN EGEN DATABASE FORBINDELSE!!!
mysql_connect("localhost", "databasebrugernavn", "databasepassword"); mysql_select_db("database");
// Tjekker i session om man er logget ind
$result=mysql_query("SELECT NULL FROM userlogin WHERE username=".quote_smart($_SESSION['username'])." AND password=".quote_smart($_SESSION['password'])) or die(mysql_error());
if (mysql_num_rows($result)>0) {
echo '<html>
<head>
<title>Sikret side</title>
</head>
<body>
<h2>Du er logget ind, '.$_SESSION['username'].'.</h2>
<p>Denne sikrede side kan kun ses af registrerede brugere</p>
<a href="index.php">Hovedmenu</a><br><br>
<a href="logout.php">Log ud</a><br><br>
<p>Copyleft: Sam Sepstrup Olesen 2008
</body>
</html>';
}
else
{
header('Location: '.rtrim(dirname($_SERVER['PHP_SELF']), '/\\\\').'/login.php?error=notloggedin');
}
?>
logout.php
<?php
session_start();
session_destroy();
header('Location: '.rtrim(dirname($_SERVER['PHP_SELF']), '/\\\\').'/index.php');
?>
Eksempel på dictionary.txt (lav din egen eller hent
http://sam.wep.dk/moduler/Login-System/dictionary.txt )
password
1234567890
qwertyuiopåasdfghjklæøzxcvbnm
fcmidtjylland
eksempel
dårligkode
jegvedhvordubor
udvikleren
administrator
Kode til oprettelse af SQL tabelen (du skal selv lave en database inden):
CREATE TABLE userlogin (
id MEDIUMINT NOT NULL AUTO_INCREMENT,
username CHAR(16) CHARACTER SET latin1 COLLATE latin1_general_cs NOT NULL,
salt CHAR(8) CHARACTER SET latin1 COLLATE latin1_general_cs NOT NULL,
password CHAR(40) CHARACTER SET latin1 COLLATE latin1_general_cs NOT NULL,
PRIMARY KEY (id)
);
CREATE UNIQUE INDEX username
ON userlogin (username);
Se systemet i funktion på
http://sam.wep.dk/?s=Moduler&u=Login-System
Indlæg senest redigeret d. 19.08.2009 20:42 af Bruger #10584