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”;
}
?>
[/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”; }
}
?>
[/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]