Posts Tagged ‘Programmering’

Kan jag få en offert?

mars 26th, 2008

Fick imorse ett mail med följande fråga : questionmark06.jpg

”Programmerar du åt andra? Kan man skicka en beskrivning till dig på vad man är ute efter och sen få en offert på vad det skulle kosta?”

Självklart! Jag är ju delägare i ett företag som pysslar med PHP programmering, så det går alldeles utmärkt att skicka en offertförfrågan till oss. Vi jobbar alltid två och två i programmeringsprojekt och kan därför leverera script och annat ganska fort. Vårt pris är 450kr/tim exkl.moms, men vi kan även köra ersättningen per script eller mål.. det är upp till er. Vi lämnar all information i offerten ni får.

Ett par saker ni kan göra för att underlätta framtagningen av offerten:

  • Var så detaljerad som möjligt.
  • Lämna inget åt slumpen, beskriv vad ni vill och inte vill att ”koden” ska göra.
  • Bifoga allt material som krävs.
  • Har ni en deadline, skriv ner den.
  • Har ni en strikt budget? Låt oss ta del av den så att vi vet inom vilka ramar vi rör oss.
  • Andra krav… skriv ner dem också.

Detta är bara exempel på vad som kan vara lämpligt att ta med i offertenförfrågan… ni bestämmer själva. Om vi får fiska efter mer information så tar också längre tid att lämna en offert.

Vill ni ha någonting kodat i PHP? Ni kan kontakta oss på info@egkgdata.se eller kristoffer@egkgdata.se

Mitt första riktiga program

mars 25th, 2008

vsvsvs.JPG

Dagen har varit ganska seg och jag har inte haft så mycket att göra…. därför bestämde jag mig för att försöka lära mig någonting vettigt i C# (Lärde mig mer eller mindre bara visual Studio på högskolan). Jag laddade ner Microsoft Visual C# 2008 Express Edition (trial) och tittade på ett par tutorial videos.

Jag kom sedan på att det faktiskt finns ett program jag skulle ha användning för. Jag jobbar väldigt mycket i PHP och behöver ibland generera strängar till md5 och SHA1… vilket är väldigt lätt att göra i PHP, men jag behöver en extern källa för detta (orkar inte köra ett PHP script varje gång jag ska konvertera), tidigare har jag förlitat mig på webbsidor som erbjuder denna funktionen, men inte nu längre!!

Jag byggde ett Super simpelt program och döpte det till HashConverter 1.0 (finns kanske redan??). Den klarar två olika typer av hash-funktioner: MD5 & SHA1. För att generera hashsträngar så skriver man helt enkelt bara in det man vill hasha i fältet ”Konvertera”, trycker på en av knapparna och vipps så får man ut hashen :)

hash.JPGhash2.JPG

Ni som vill får gärna ladda ner programmet.

Nu när jag suttit lite mer med C# är det faktiskt kul! Jag ska försöka skapa ett par ”program” till som jag själv har nytta av, samt försöka bygga ut HashConverter.

Vill du lära dig skapa dynamiska webbsidor? Lär dig PHP!

mars 22nd, 2008

800px-php-n_logo_svg.pngJag har programmerat i många olika språk under flera år, både privat, i jobb och genom utbildningar. De språk jag kommit i kontakt med är C#, JAVA, Assembler, PERL, ASP, ASP.NET och PHP… grundprincipen är den samma i alla språken, men det enda jag riktigt fastnade för var PHP. Det var lätt att förstå, man kom snabbt igång, det är kraftfullt och snabbt.

Nu när jag skriver detta inlägg så inser jag att det kommer bli en hel del sura miner bland programmerarna där ute… det finns en viss rivalitet mellan oss PHP programmerare och speciellt ASP.NET programmerare (dotnettare). Jag inser också att det finns fördelar och nackdelar med alla språk, men här följer i alla fall en lista på 5 skäl att använda/lära sig PHP.

#1 – Det är lätt att komma igång
Det krävs inga jättekunskaper att komma igång med PHP (om man kan de grundläggande kunskaperna i programmering). Hitta en bra tutorial att följa och du kommer lätt snappa upp hur det är strukturerat och fungerar. Många väljer att köpa böcker för flera hundra kronor när det ska lära sig något nytt, och visst… ibland så är det bra att ha böcker i PHP. Men jag tycker du ska börja med att läsa några av de tusentals tutorials som finns ute på nätet först!

Bra sidor som hjälper dig komma igång (Engelska)
W3Schools (Här kan du lära dig grunderna)
PHP.NET (Ett måste för alla PHP programmerare)
Google (Search and you shall find)

#2 – Det är gratis
PHP är helt gratis att använda. Det är open source vilket innebär att du kan göra vilka modifikationer du vill.

#3 - Forum & community
Det finns massor med sidor vars syfte är att hjälpa dig i ditt programmerande. Du kan få massor med hjälp av väldigt duktiga personer på följande sidor:

Webforum
Webmaster Network
Webmaster-Talk
PHPportalen
PHPSIDAN

#4 - PHP är snabbt!
PHP är väldigt effiktivt och snabbt… snabbare än de flesta andra språk. Zend Technologies har gjort vissa benchmarks som visar att PHP är snabbare än många av sina konkurrenter. Detta går naturligtvis att diskutera…. men en sak är säkert och det är att PHP på en hyffsad server kan behandla miljontals besökare varje dag.

#5 – Stödjer flera typer av databaser
PHP stödjer många databaser, bland annat MySQL, MSQL, Oracle, PostgreSQL,  dbm, HyperWave, Indormix, FilePro, Sybase databases, InterBase. Du kan också använda dig av PDO vilket ger dig ett otroligt bra skydd mot SQL-injections.

Dessa 5 skäl är bara en droppe i havet av vad PHP kan erbjuda dig som programmerare. Dock så är trots allt det viktigaste att du hittar ett språk som passar dig (förhoppsningsvis PHP) som du känner dig bekväm i.

Man blir aldrig fullärd i PHP och det kan ta väldigt lång tid att få flyt i sitt kodande. Men har man intresset, motivationen och viljan så kommer det gå snabbare än du tror.

Jag vill avsluta med att säga att säkerhet är någonting man bör ha i åtanke från början! Lär dig programmera säkert från början och håll dig uppdaterad!

Google Summer of Code 2008

mars 21st, 2008

Det hela började 2005 då Google började sponsra utvecklingen av en mängd olika open source projekt. Syftet med Google Summer of Code (GSoC) är följande:

  • Skapa fler open Source lösning som gynnar oss alla.
  • Inspirera unga utvecklare att delta i open source projekt.
  • Hjälpa open source projekt att hitta nya utvecklare och intressanter.
  • Ge studenter en chans att jobba inom sitt utbildningsområde
  • Ge studenter insyn i hur det fungerar i verkligheten hos utvecklingsföretag, med riktiga scenarion.

Antalet studenter som deltar är många:

2005: ca 400 st
2006: ca 600 st
2007: ca 900 st
2008: Inga siffror ännu

Antalet stödjande organisationer:
2005: ca 40 st
2006: ca 100 st
2007: ca 130 st
2008: Inga siffror ännu

Det har fastställts ett par (ganska många) deltagande organisationer till GSoC 2008, och där finns ett par stycken som jag personligen tycker är intressanta att följa:

PHP
WordPress
MySQL
Google
Hela Listan

Detta ”event” är otroligt intressant att följa, samt så är självaste konceptet ”open Source” ett riktigt hett samtalsämne idag. Fler och fler börjar inse vikten av open source och vad det kan ha (och har) för betydelse idag. Många stora företag har sedan en tid tillbaka omfamnat open source konceptet vilket gynnar oss alla!

Ni kan läs mer om GSoC här:
GSoC 2008

En programmerares miljö

mars 4th, 2008

Eftersom programmering är ett av mina intressen, spenderar jag ganska mycket tid framför datorn och knackar kod. Det är därför väldigt att omgivningen är så bekväm och optimal som möjligt. Jag är inte en Jolt slukande, chips ätande power programmerare utan föredrar en annan typ av ”uppsättning” när jag ska sitta länge framför datorn.

Först och främst strukturerar jag upp mitt arbete och bestämmer vad som ska göras och i vilken ordning. Jag programmerar aldig på tom mage då det har en tendens att få hjärnan seg (inte så konstigt). Jag dricker väldigt mycket när jag sitter framför datorn, och då menar jag inte sprit. Det blir vatten eller Pepsi Max, alternativt en lättöl. Sen har jag alltid vissa rutiner innan jag börjar (har bara blivit så).

  1. Jag kontrollerar alltid e-posten och svarar på obesvarade mail.
  2. Avslutar andra påbörjade saker  som t ex påbörjade texter, photoshop saker mm.
  3. Ordnar en skön playlist i winamp (T ex. Daft Punk, No Doubt, Save Ferris, Timbaland, The Ventures… osv).
  4. Ofta så programmerar jag tillsammans med en annan (Erik), så vi brukar delar upp arbetet mellan oss.
  5. Utöver detta så eliminerar jag alla störande moment runt omkring mig.

För den mer teknikintresserade kör jag på följande utrustning och mjukvaror

  • Operativsystem: WinXP Pro och 2003 server. Vi använder 2003 på vår utvecklingsserver som vi ansluter remote till och färdigställer projekt.
  • Hårdvara: AMD 64 X2 Dual Core 3800+, 3GB Ram.
  • Skärm: 20″ LCD
  • Program: Dreamweaver, Notepad++, Notepad.
  • PHP: Version 5.2.4
  • Apache: Version 2.2.4
  • MySQL: Version 5.0.45

Det är väldigt personligt hur man programmerar och i vilken miljö man väljer att befinna sig i… men så här är det för mig och det fungerar perfekt.

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]