Posts Tagged ‘PHP’

install.php

mars 3rd, 2008

För den som är intresserad av att bygga ett lite större script som användare själva ska konfigurera, kan det vara lämpligt med en installationsfil som skapar all databasinformation, filer mm. Tänkte dela med mig av en installationsfil som vi (EGKG Data) har utvecklat till en gästbok som jag även senar kommer publicera i denna blogg.

Som sagt, det är en installationsfil till en gästbok, men går väldigt lätt att modifiera till att installera vad som helst. Nu ingår det även HTML och CSS i denna koden för att få struktur och bättre utseende. Anledningen till att css’en är inbakad i samma fil är för att denna fil, efter installationen, ska raderas och då är det onödigt att ha en massa extra text i css filen som inte används.
[php]
ob_start();
?>
"http://www.w3.org/TR/html4/loose.dtd">



if(isset($_POST['install_do'])){
if(!isset($_GET['done'])){
//Variablar för databasanslutningen
$db_adress = trim($_POST['install_adress']);
$db_name = trim($_POST['install_db']);
$db_user = trim($_POST['install_dbuser']);
$db_pass = trim($_POST['install_dbpass']);

//Variablar för admindelen
$admin_u = trim($_POST['install_admin_u']);
$admin_p = trim($_POST['install_admin_p']);
$admin_r = trim($_POST['install_admin_r']);

//Kontrollerar uppgifter för databasanslutningen
if(empty($db_adress)) {
$error_handle[0] = "Databas: Vänligen ange en korrekt adress”;
$ch[0] = ”0″;
$display_error1 = 1;
}
else{$error_handle[0] = ”Databas: Adress är OK”; $ch[0] = ”1″;}

if(empty($db_name)) {
$error_handle[1] = ”Databas: Vänligen ange ett korrekt databasnamn”;
$ch[1] = ”0″;
$display_error2 = 1;
}
else{$error_handle[1] = ”Databas: Databasnamn är OK”; $ch[1] = ”1″;}

//Kontrollerar användaruppgifterna för administration
if(empty($admin_u)){
$error_handle[2] = ”Användaruppgifter: Vänligen ange ett användarnamn”;
$ch[2] = ”0″;
$display_error3 = 1;
}
else{$error_handle[2] = ”Användaruppgifter: Användaruppgifter: Användarnamn är OK”; $ch[2] = ”1″;}

if(empty($admin_p)){
$error_handle[3] = ”Användaruppgifter: Vänligen ange ett lösenord”;
$ch[3] = ”0″;
$display_error4 = 1;
}
else{$error_handle[3] = ”Användaruppgifter: Lösenord är OK”; $ch[3] = ”1″;}

if(empty($admin_r)){
$error_handle[4] = ”Användaruppgifter: Vänligen upprepa lösenordet”;
$ch[4] = ”0″;
$display_error5 = 1;
}
else{$error_handle[4] = ”Användaruppgifter: Upprepat lösenord är OK”; $ch[4] = ”1″; }

if($admin_r !== $admin_p){
$error_handle[5] = ”Användaruppgifter: Lösenorden matchar inte!”;
$ch[5] = ”0″;
$display_error5 = 1;
$display_error4 = 1;
}
if($admin_r == $admin_p){
$error_handle[5] = ”Användaruppgifter: Lösenorden är OK”;
$ch[5] = ”1″;
}

}
}

?>

if(!isset($_GET['done'])){
?>
Installation – Databasinställningar
Fyll i nedanstående fält med korrekta uppgifter för din databas. Dessa uppgifter är nödvändiga för att vi skall kunna ansluta till databasen och skapa de tabeller som gästboken kommer använda.

/> Adress (ex localhost)

/> Databasnamn

/> Ange önskat användarnamn

/> Ange önskat lösenord (minst 6 tecken)

/> Repetera lösenordet

Se till så att mappen connection har skrivrättigheter

}
?>

//Skriver ut felmeddelanden
if(isset($_POST['install_do'])){
if(!isset($_GET['done'])){

for($i = 0; $i <= 5; $i++){
if($i == 0){echo '

Felmeddelande
‘;}
if($ch[$i] == ”0″){ echo $error_handle[$i]; echo ”
”;}
if($i == 5){ echo ‘

‘;}
}

}
}

if(isset($_POST['install_do'])){
if(!isset($_GET['done'])){
//Om dessa satser stämmer fortsätter installationen
if(!empty($admin_u)){
if(!empty($admin_p)){
if(!empty($admin_r)){
if($admin_r == $admin_p){

//Testar databasanslutningen
$conn = @mysql_connect($db_adress, $db_user, $db_pass) or die(’

Anslutning mysslyckad
Vänligen kontrollera databasuppgifterna

‘);
$try = @mysql_select_db($db_name, $conn) or die(’

Anslutning misslyckad
Vänligen kontrollera databasnamnet

‘);

//Table för gästboken
$table_gast = ”CREATE TABLE `$db_name`.`gast` (
`id` INT( 10 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`namn` VARCHAR( 50 ) NOT NULL ,
`ort` VARCHAR( 50 ) NOT NULL ,
`hemsida` VARCHAR( 50 ) NOT NULL,
`inlagg` VARCHAR( 1000 ) NOT NULL,
`ip` VARCHAR( 20 ) NOT NULL,
`datum` VARCHAR( 30 ) NOT NULL
) ENGINE = MYISAM ”;

//Table för inställningar
$table_settings = ”CREATE TABLE `$db_name`.`settings` (
`id` INT( 10 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`title` VARCHAR( 100 ) NOT NULL ,
`pages` INT( 10 ) NOT NULL ,
`max_page` INT( 10 ) NOT NULL ,
`inlagg` INT( 100 ) NOT NULL
) ENGINE = MYISAM ”;

//Table för ban
$table_ban = ”CREATE TABLE `$db_name`.`ban` (
`id` INT( 10 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`ip` VARCHAR( 50 ) NOT NULL
) ENGINE = MYISAM ”;

//Table för administration
$table_sec = ”CREATE TABLE `$db_name`.`sec` (
`id` INT( 10 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`user` VARCHAR( 100 ) NOT NULL ,
`pass` VARCHAR( 50 ) NOT NULL ,
`salt` VARCHAR( 50 ) NOT NULL,
`x` int( 5 ) NOT NULL
) ENGINE = MYISAM ”;

//Anropar variablarna som skapar tabellerna
@mysql_query($table_gast) or die(’

Table problem
Ett problem uppstod när tablen skulle skapas!1

‘);
@mysql_query($table_settings) or die(’

Table problem
Ett problem uppstod när tablen skulle skapas!1

‘);
@mysql_query($table_sec) or die(’

Table problem
Ett problem uppstod när tablen skulle skapas!3

‘);
@mysql_query($table_ban) or die(’

Table problem
Ett problem uppstod när tablen skulle skapas!4

‘);

//Funktion som hashar lösenordet
function hashGen ($admin_p, $x){
$losenord = md5($admin_p);
for($i = 0; $i <= $x; $i++){
$losenord = sha1($losenord);
}
return $losenord;
}

//Funktion som returnar ett salt
function saltGen ($y, $x){
$salt = md5($y);
for($i = 0; $i <= $x; $i++){
$salt = sha1($salt);
}
return $salt;
}

//Funktion som returnar det slutgiltgliga lösenordet med salt
function passGen ($baked_hash, $baked_salt){
$pass = sha1("$baked_hash"."$baked_salt");
return $pass;
}

//Skickar lösenordet till funktionen, tar emot när det är hashat
$x = mt_rand(10, 99);
$y = mt_rand(1000, 9999999);

//Anropar tre funktioner som genererar och returnar salt och lösenord
$baked_hash = hashGen($admin_p, $x);
$baked_salt = saltGen($y, $x);
$baked_pass = passGen($baked_hash, $baked_salt);

//Skickar användaruppgifter till sec
$insert_sec = "INSERT INTO sec (user, pass, salt, x) VALUES ('$admin_u', '$baked_pass', '$baked_salt', '$x')";
@mysql_query($insert_sec) or die('

Table problem
Det gick inte att skicka uppgifter till databasen!

‘);

//Skickar inställningar till settings
$nmn = ”iGäst”;
$pgs = 10;
$lgt = 1000;
$mxs = 3;
$insert_settings = ”INSERT INTO settings (title, pages, max_page, inlagg) VALUES (’$nmn’, ‘$pgs’, ‘$mxs’, ‘$lgt’)”;
@mysql_query($insert_settings) or die(’

Table problem
Det gick inte att skicka uppgifter till databasen!

‘);

//Skapar connect.php och fyller i databas inställningar
$myFile = ”connection/connect.php”; //sökväg och filnamn
$fh = fopen(”$myFile”, ‘w’) or die(’

Fil problem
Det gick inte att skapa filen!
Kontrollera rättigheter.

‘); //skapar filen och öppnar den för att skriva

//innehåll i filen som skapas
$stringData = ‘ $mysql_server = "'."$db_adress".'";
$mysql_user = "'."$db_user".'";
$mysql_password = "'."$db_pass".'";
$mysql_database = "'."$db_name".'";

$time = date("Y-m-d H:i:s");

$conn = mysql_connect($mysql_server, $mysql_user, $mysql_password);
mysql_select_db($mysql_database, $conn);
?>‘;
fwrite($fh, $stringData); //skriver datan till filen
fclose($fh); //stänger filen

//Byter sida
header(”location:install.php?done”);
}
}
}
}
}
}
if(isset($_GET['done'])){
echo ‘Installationen lyckades

* Radera filen install.php!
* Sätt tillbaka korrekt rättigheter på mappen connection!
* Kontrollpanelen hittas i mappen sec och heter admin.php!

‘;
}
?>



ob_end_flush();
?>
[/php]

Hash+Salt+Multiple Runs

mars 3rd, 2008

Jag har precis skrivit klart ett script i PHP för ett litet projekt jag håller på med och tänkte faktiskt dela med mig av det. Jag vill börja med att säga att jag inte vet om den korrekta benämningen för en loop hash är ”multiple runs”, men jag hade det någonstans i bakhuvudet och det låter bra.

 Syftet med scriptet är alltså att skapa ett säkert lösenord som man sedan sparar undan i databasen (eller fil). Eftersom det inte är rekommenderat att endast hasha ett lösenord så behövs det även ett salt för att utöka säkerheten för brute force attacker mm. Jag kör även en multiple run för att ytterligare utöka säkerheten. Men vad man måste förstår är att detta enbart är vad jag vill kalla, ”ett segt moment” för en hackare som lyckats få åtkomst till lösenorden.

Det ger dig tid att reagera och byta ut alla lösenord…

Scriptet är uppbyggt i funktioner och allting är kommenterat. Jag har även längst ner skrivit hur man ska göra för att kontrollera ett lösenord från inlogging, mot det som finns i databasen eller vart du nu har sparat användaruppgifterna.

[php]
/*
Skapad av Kristoffer Geiser - 2008-02-29
Användare får använda, modifiera detta script så som de själva önskar.
*/

//Funktion som behandlar lösenordet
function password ($password, $runs){
$password = md5($password);
for($i=0; $i <= $runs; $i++){
$password = sha1($password);
}
return $password;
}
//Funktion som 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);
}
//Funktion som fogar ihop löseordet och saltet i en loop med sha1
function fuse ($password, $salt, $runs){
for($i=0; $i <= $runs; $i++){
$fused = sha1("$password @:_:@ $salt");
}
return $fused;
}

//Det lösenord som ska skyddas
$losenord = "lösenordet";

//Detta slumpar fram ett värde som används för multiple runs.
//SPARAS I DATABASEN
$runs = mt_rand(1,99);

//Skickar lösenordet till funktionen password. Får tilbaka det hashat ett antal gånger.
$gen_losen = password($losenord, $runs);

//Anropar funktionen salt som skickar ett hashat salt.
//SPARAS I DATABASEN
$gen_salt = salt();

//Anropar fuse som bakar ihop salt och löseord och hashar det ett antal gånger
//SPARAS I DATABASEN
$gen_fuse = fuse($gen_losen, $gen_salt, $runs);

//########################################################################################
//Exempel vid inmatat lösenord
//########################################################################################
/*
För att förstå denna del så får ni tänka er att användaren redan är registrerad och att följande värden finns sparade i databasen:
$runs
$gen_salt
$gen_fuse
I delen nedan illustrerar vi hur man återanvänder funktionerna för att generera och matcha ett lösenord som en användare skickat
när dem loggat in.
*/

//$inmatat är variablen vars innehåll är det lösenord som användaren försöker logga in med
//Se till att använda mysql_real_escape_string() eller något annat skydd innan du hämtar värden från databasen
$inmatat = "lösenordet";
//$db_salt är variablen vars innehåll är hämtat från databasen, baserat på exempelvis användarnamnet man matade in vid inloggningen
$db_salt = "salt från databasen";
//$db_runs är variablen vars innehåll är hämtat från databasen, baserat på exempelvis användarnamnet man matade in vid inloggningen
$db_runs = "loop värdet från databasen";

//Här anropas funktionerna som behövs och vi får tillbaka ett lösenord som sparas i $check_pass.
//Vi kan sedan matcha detta lösenord mot det lösenord som finns i databasen, baserat på exempelvis användarnamnet
//som matades in vid inloggningen
$check_pass = fuse(password($inmatat, $db_runs), $db_salt, $db_runs);

//Här är ett exempel på hur man kan matcha lösenordet
//$databas_losen innehåller det ihop fogade lösenordet och saltet som lagrats i databasen vid registreringen
if($check_pass == $databas_losen){ echo "Grattis!"; }
else{ echo "Ditt lösenord matchade inte!"; }
?>[/php]

Vem, var, hur och varför?

mars 3rd, 2008

Då har även jag trillat i ”blogg-fällan” som jag svor att jag aldrig skulle göra. Vad kommer jag då blogga om? Precis som alla andra kommer jag mest prata strunt… eller inte. Jag ska faktiskt försöka skapa ett vettigt och relevant innehåll för den som är allmänt intresserad av IT. Eftersom IT är en av mina ”passioner” här i livet så kändes det naturligt att blogga om detta lilla ord som betyder så Otroligt mycket i vardagen.

Jag kommer förutom allmänna IT inlägg, roliga incidenter och nyheter även skriva en hel del om PHP och dela med mig av olika koder och script som andra kanske har nytta av. När det gäller just PHP så har jag (som ni kanske har sett) en avdelning just för PHP högst upp på sidan. Jag kommer under den ”fliken”, ”länken”, ”sidan”… eller hur ni nu vill kalla det, lägga upp alla script som jag kommer prata om.

Jahopp, då var introduktionen klar…. Stay tuned