Registrering+inlogg

mars 6th, 2008 av admin Leave a reply »

Nästa PHP script jag vill dela med mig av är ett registrerin+login system i PHP som jobbar mot en MySQL databas. Innan ni testar scriptet måste ni kontrollera om ni har PDO aktiverat i php.ini…. om ni inte har det kan ni läsa här.

Värt att nämna är att jag sparar alla uppgifter tillsammans i databasen för att lättare illustrera. För att utöka säkerheten bör man spara saltet och möjligtvis x på andra ställen.

Hela scriptet finns att ladda ner under fliken PHP högst uppe.

register.php
[php]
//Kontrollerar om du försöker registrera dig
if(isset($_POST['skicka'])){
include 'inc/connect.php';
include 'inc/functions.php';

$in_user = $_POST['user'];
$in_pass = $_POST['pass'];
$in_check = $_POST['check'];

//Anropar tre funktioner som kontrollerar de inmatade värdena
$check1 = langd($in_user, $in_pass);
$check2 = same($in_pass, $in_check);
$check3 = exists($in_user);

//Om allt är ok
if($check1 == "ok"){
if($check2 == "ok"){
if($check3 == "ok"){

//Genererar ett slumpat tal
$x = mt_rand(strlen($in_user), 101);
//Anropar frunktioner för att generera hash+salt+multiple runs
$p_hash = password($in_pass, $x);
$salt = salt();
$fused = fuse($p_hash, $salt, $x);

//Skickar in värdena i databasen
$count = $conn->exec(”INSERT INTO Uregister(user, password, salt, x)VALUES(’$in_user’, ‘$fused’, ‘$salt’, ‘$x’)”);
$conn = null;

header (”location: register.php?done”);
}
}
}
//Skriver ut eventuella felmeddelanden
if($check1 !== ”ok”){ echo ”$check1
”;}
if($check2 !== ”ok”){ echo ”$check2
”;}
if($check3 !== ”ok”){ echo ”$check3
”;}
}
if(isset($_GET['done'])){
echo ”Registrering lyckad”;
}
?>

Användarnamn:

Minst 4 tecken
Lösenord:

Minst 4 tecken
Upprepa Lösenord:

[/php]

login.php
[php]
//If-sats som kontrollerar om man försöker logga in
if(isset($_POST['login'])){
include 'inc/connect.php';
include 'inc/functions.php';

$in_user = $_POST['user'];
$in_pass = $_POST['pass'];

//Hämtar värden från databasen, baserat på användarnamnet
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$do = $conn->prepare(”SELECT password, salt, x FROM Uregister WHERE user = :user LIMIT 1″);
$do->bindParam(’:user’, $in_user, PDO::PARAM_STR);
$do->execute();
$obj = $do->fetch(PDO::FETCH_OBJ);

$db_pass = $obj->password;
$db_salt = $obj->salt;
$db_x = $obj->x;

//Anropar funktionerna som behövs föra tt återskapa lösenordet
$gen_pass = password($in_pass, $db_x);
$gen_fuse = fuse($gen_pass, $db_salt, $db_x);
$conn = null;

//Kontrollerar om lösenorden matchar
if($gen_fuse == $db_pass){
//Skapar en session med alla uppgifter
session_start();
$_SESSION['user'] = $in_user;
$_SESSION['pass'] = $db_pass;
$_SESSION['ip'] = $_SERVER['REMOTE_ADDR'];

echo ”Du är nu inloggad som {$_SESSION['user']}”;
}
else{ echo ”Fel användarnamn eller lösenord”; }
}
?>

Användarnamn:

Minst 4 tecken
Lösenord:

Minst 4 tecken

[/php]

functions.php
[php]
//Kontrollerar längden på användarnamn och lösenord
function langd ($var1, $var2){
if(strlen($var1)< 4 || strlen($var2) < 4){
$error = "*Användarnamnet eller lösenordet är för kort";
}
else {$error = "ok"; }
return $error;
}

//Kontrollerar om lösenordet matchar det upprepade lösenordet
function same($var1, $var2){
if($var1 !== $var2){ $error = "*Lösenorden matchar inte"; }
else { $error = "ok"; }
return $error;
}

//Kontrollerar om användarnamnet redan existerar
function exists ($var1){
include 'connect.php';

$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$do= $conn->prepare (”SELECT COUNT(id) as antal FROM Uregister WHERE user = :user ”);
$do->bindParam(’:user’, $var1, PDO::PARAM_INT);
$do->execute();
$obj = $do->fetch(PDO::FETCH_OBJ);
$db_count = $obj->antal;

if($db_count < 1){ $error = "ok"; }
else { $error = "*Det angivna användarnamnet finns redan"; }
$conn = null;
return $error;
}

//Hashar lösenordet
function password ($password, $x){
$password = md5($password);
for($i=0; $i <= $runs; $i++){
$password = sha1($password);
}
return $password;
}

//Skapar ett salt
function salt (){
$chars = "8!b9yea@of,g5ic¤j2d3k4_l7mhrn%#ps&t6uqvx-.1";
$length = strlen($chars);

for($i=0; $i <= $length; $i++){
$runs = mt_rand(0,$length);
$salt .= substr($chars, $runs, 1);
}
return sha1($salt);
}
//Bakar ihop lösenordet och saltet i en loop
function fuse ($password, $salt, $x){
for($i=0; $i <= $runs; $i++){
$fused = sha1("$password @:_:@ $salt");
}
return $fused;
}
?>
[/php]

connect.php
[php]
$hostname = 'localhost';
$username = 'root';
$password = '';
$database = 'users';

try {
$conn = new PDO("mysql:host=$hostname;dbname=users", $username, $password);
}

catch(PDOException $e)
{
echo $e->getMessage();
}
?>
[/php]

Tabellen för databasen
[php]
CREATE TABLE `users`.`uregister` (
`id` INT( 100 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`user` VARCHAR( 50 ) NOT NULL ,
`password` VARCHAR( 50 ) NOT NULL ,
`salt` VARCHAR( 50 ) NOT NULL ,
`x` INT( 10 ) NOT NULL
) ENGINE = MYISAM
[/php]

Advertisement

Lämna ett svar