Vis Online CV
Lasse Reiersen Gravdal
Kvalitetskoordinator og forumredaktør
(phoenix)

Lasse Reiersen Gravdal studerer til daglig Informasjon og samfunnskontakt (PR) på Handelshøyskolen BI i Oslo, i tillegg til ITpro jobber han også i kunderelasjonsbedriften Jernstraale.
Grad:
TechPoeng:
25655

ProPoeng:
75

Stemmer: 7
 

Lesernes vurdering av innholdet og kvaliteten på artikkelen.

Klikk på terningen du vil gi:

1 2 3 4 5 6

Delphi for PHPDelphi for PHP
PHP-Norge og Alfacode inviterer til foredrag om Delphi for PHP ved Fredrik Haglund fra CodeGear.
Bildeopplastning til nettsiden dinBildeopplastning til nettsiden din
I denne guiden vil jeg ta for meg fem enkle trinn for å få et fullkommet online bildeopplastningssystem i nettsidene dine, for deg selv og brukere, komplett med galleri visning og grensesnitt for opplastning.
Smarte maler i PHPSmarte maler i PHP
Å bruke templates er veldig greit, dersom du ikke trenger å forandre ti sider men bare en. PHP med Smarty gjør det meget enkelt å bruke templates. Med Smarty trenger du ikke å bruke HTML i .php filene eller PHP i HTML. Smarty gjør det også enkelt for deg som er programmerer å sette sammen designet designeren har lagd for deg.
PHP-Sikkerhet del 2PHP-Sikkerhet del 2
CSRF er en alvorlig type angrep som gjør at angriperen kan få andre brukere til å utføre en hvilken som helst handling på en hvilken som helst nettside hvor det ikke er beskyttelse mot CSRF. Lær hvordan du kan sikre dine websider.
PHP-Sikkerhet del 1PHP-Sikkerhet del 1
Cross-site scripting (XSS) er en av de mest vanligste angrep på nettet. Det er svakheter ved en nettside som blir benyttet til å kjøre ondsinnede kode via en enkel link. Offeret blir (i de fleste tilfeller) personen som klikker på linken. Det er ingen trussel for nettstedet direkte, det er også grunnen til at det blir oversett så lett. Lær hvordan du unngår slike feller på dine egne websider.


Mest leste PHP-artikler

Guide: Installasjon av Apache, PHP og MySQL
Guide: En introduksjon til PHP
Guide: php-dag nr. 3: Login-funksjon
Guide: php-dag nr. 1: Variabler
Guide: php-dag nr. 6: MySQL
Guide: PHP e-postskjema
Guide: php-dag nr. 7: php og MySQL
Guide: php-dag nr. 2: Funksjoner
Guide: Gi besøkende ulike websider
Guide: php-dag nr. 9: Manipulering av strenger
Guide: Hvordan lage en virtuell URL
Definisjon: Hva er PHP
Guide: Kom i gang med PHP-GTK
Guide: php-dag nr. 8: Sporing av linker
Guide: php-dag nr. 4: if og switch, to compare
Guide: php-dag nr. 5: Løkker
Norske PHP-Nuke side
PHP-Sikkerhet del 2
PHP-Sikkerhet del 1
php-skolen kommer tilbake



Guide: php-dag nr. 3: Login-funksjon
Denne gangen skal jeg gi de som allerede kan en del php en liten godbit. Vi skal nemlig lage en loginfunksjon, det er en helt enkel kode, med en kraftig kryptering, i tillegg må du ha installert MySQL på serveren. God fornøyelse!

Guide: Utvikling og design: PHP  ·   Av Lasse Reiersen Gravdal  ·  Mandag 24. februar 2003 18:03

Loginfunksjonen vi skal lage beholder informasjonen sin i sessions. Det vil si at brukernavn og passord blir lagret hele tiden mens du er på nettstedet.

Brukernavn og passord lagres kryptert (les: kun passord krypteres) i en mySQL database. Vårt eksempel baserer seg på den kraftige md5-krypteringen i php. I php finnes det i dag ingen metode for å dekryptere md5. Derfor er det bare en måte å finne ut om brukerens passord stemmer. Du må nemlig kryptere det inntastede passordet også, og deretter sjekke det med databasen.

Hvis brukeren glemmer passordet sitt, må serveren, på brukerens kommando, generere et nytt passord. Deretter sendes dette i en mail sammen med en aktiveringskode for det nye passordet. Dersom det ikke var riktig bruker som tastet inn passordet, og den riktige brukeren prøver å logge seg inn, slettes det genererte passordet, samt aktiveringskoden. Men i denne guiden skal jeg kun legge vekt på selve innloggingen.

Det første du gjør, er å lage et innloggingsskjema, eksempel:

Eksempel 1
Brukernavn <INPUT NAME="brukernavn" TYPE="text">
Passord <INPUT NAME="passord" TYPE="password">
<INPUT NAME="login" VALUE="1" TYPE="hidden">
<INPUT NAME="submit" VALUE="Logg inn" TYPE="submit">

Som du ser har jeg lagt inn en variabel som heter login, dersom denne er satt, vil systemet forsøke å logge deg inn.

Deretter begynner mySQL-sjekken. Ved å spørre basen om det finnes en post hvor man finner både det inntastede passordet, og det krypterte passordet, ser man fort om det er brukere i basen. Bruk funksjonen mysql_num_rows til p finne ut hvor mange rader det er. Slik ser funksjonen ut:

Eksempel 2
<?php
function auth($_user, $_password){
    
# her kommer din innlogging til en mySQL-database
    
$crypticPassword = md5($_password);
    
$get_users = mysql_query("SELECT id FROM dinbrukerbase WHERE user='$_user' and pass='$crypticPassword'");
    if(
mysql_num_rows($get_users) == 0){
        return
FALSE;
    }
    else {
        return
TRUE;
    }
}
?>

Som du ser er hele login-prosedyren blitt lagt inn i funksjonen auth. Funksjonen returnerer TRUE dersom det eksisterer rader med den inntastede informasjonen, og returnerer FALSE dersom det ikke gjør det.

Nå må du bare sette opp en if for å finne ut om brukeren har trykket på Logg inn knappen i skjemaet. Du må også sette inn en if for å finne ut om brukernavn og passord er riktig.

Når dette er gjort er du nesten i mål. Det eneste du må gjøre nå er å sette opp sessions. Sessions blir startet opp med session_start(), denne koden setter vi opp øverst i dokumentet, for å gi php beskjed om å initiere session. Sesjons-variabler kan lagres på to måter, enten med variabelen $_SESSION['dinsesjonsvariabel'], eller ved å bruke session_register("dinsesjonsvariabel"). For å slette all sesjonsinformasjon, bruker man session_unset.

Den komplette loginfunksjonen vil da bli slik:

Eksempel 3
<?php
session_start
();
function
auth($_user, $_password){
    
# her kommer din innlogging til en mySQL-database
    
$crypticPassword = md5($_password);
    
$get_users = mysql_query("SELECT id FROM userlist WHERE user='$_user' and pass='$crypticPassword'");
    if(
mysql_num_rows($get_users) == 0){
        return
FALSE;
    }
    else {
        return
TRUE;
    }
}
if(
$loggut == 1){
    
session_unset();
}
if(
$login=="1" || $loggetinn=="1"){
    if(
auth($brukernavn, $passord)){
        
$_SESSION['loggetinn'] = 1;
        
$_SESSION['brukernavn'] = $brukernavn;
        
$_SESSION['passord'] = $passord;
        if(
$login == 1){
            
header("Location: $PHP_SELF");
        }
    }

}
?>

Som du ser av eksempelet over, har jeg benyttet meg av $_SESSION isteden for session_register. Dette er fordi denne funksjonen har visse svakheter, og fordi det blir mer oversiktlig. Du ser også at brukernavnet blir lagret, i tillegg til det ukrypterte passordet, dette vil kun bli lagret på din maskin, eller i en temporær fil på serveren, og det er derfor ingen høy sikkerhetsrisiko. I tillegg lagres det en sesjonsvariabel som heter loggetinn, dette er fordi nettsiden din lett skal kunne se at personen er logget inn, samtidig som passord og brukernavn blir for hver side brukeren er inne på. Hvis variabelen $loggut settes til 1, for eksempel i en link, vil all sesjonsdata slettes. Du ser også at dersom brukeren har benyttet seg av loginskjemaet, vil siden reloade. Dette er fordi sesjonsvariabelene bruker en sidereload på å registrere seg første gangen.



Red. kommentar: Viktig: I denne guiden må register_globals være slått på. Register_globals valget har blitt erklært en sikkerhetsrisiko, og det er derfor viktig at du tenker på det før du bruker et script som dette.

Republisering tillatt
  • Del



 Gi din kommentar
 
Ditt navn: Anonym [ Logg inn | Registrer deg ]

Emne:



Kommentar:

Vennligst hold deg til saken i artikkelen. Alle useriøse og irrelevante kommentarer vil uten videre bli fjernet.

Skriv inn teksten fra bildet:

Tillatt HTML: <p> <b> <i> <em> <br> <strong> <blockquote> <tt> <li> <ol> <ul> <img> <a>
 

Kommentarer (20)

Anonym: Guide: php-dag nr. 3: Login-funksjon · Mandag 24. februar 2003 19:26
I nærmest alle eksemplene dere har, hopper dere mellom register_globals på og av. Ettersom det i utgangspunktet er skrudd av, og erklært en sikkerhetsrisiko, synes jeg det blir feil å kreve at brukerene må ha det skrudd på for at koden skal virke. voidnull

[ Svar på dette | Ny kommentar ]



Anonym: Guide: php-dag nr. 3: Login-funksjon · Mandag 24. februar 2003 19:33
Du krypterer jo ikke annet enn med en MD5-hash... Hva med å heller ha skrevet et eksempel med ekte md5-kryptering(altså, crypt())?

[ Svar på dette | Ny kommentar ]



    CalvinC: Guide: php-dag nr. 3: Login-funksjon · Onsdag 26. februar 2003 01:06
    Send en melding · http://www.digiment.no
    Krypterer ikke annet enn med MD5-hash ?? Det er jo akkurat det MD5 er, en enveis hash-funksjon. Og 128 bit hashen, eller message digest (MD) som det så fint heter, som MD5 hash-funksjonen produserer er svært vanskelig å knekke.

    [ Svar på dette | Ny kommentar ]



magisk: Guide: php-dag nr. 3: Login-funksjon · Mandag 24. februar 2003 20:13
Send en melding
Mente på man måtte ha en form rundt selve innloggings-skjemaet. En annen ting, skal innloggings-skjermaet stå på samme siden som php koden? Eller er det to seperate filer?

[ Svar på dette | Ny kommentar ]



ovehal: Guide: php-dag nr. 3: Login-funksjon · Mandag 24. februar 2003 21:16
Send en melding
Dette er IKKE sikkert i det hele tatt. En kan aldri anta at brukerene taster inn gyldige data.

Brukeren: ' or 1=1 #
kommer glatt inn..... sql setningen blir:
SELECT id FROM userlist WHERE user='' or 1=1 #' and pass='hvasomhelst'
# vil kommentere ut resten av linjen => SQL utrykket som blir kjørt er:
SELECT id FROM userlist WHERE user='' or 1=1

Om en skal bruke data tastet inn av brukere til å bygge en spørring mot MySQL(eller annen db) så en "vaske" data før en bruker de i spørringen, i alle fall fjærne "skumle" tegn som '-#;,:.%&? osv. Om databasen støtter det så bruk lagrede prosedyrer....

Det er slike hull i applikasjoner som lar uvedkommede "rusle" rett inn på serveren uansett om du bruker kryptering, brannmur ol for å sikre deg og dine data.

Ove B-)

[ Svar på dette | Ny kommentar ]



    Anonym: Guide: php-dag nr. 3: Login-funksjon · Tirsdag 25. februar 2003 01:39
    Vel, nå bruker PHP addslashes() på all data automatisk da, så ' ville blitt ' og den ville ikke gått "glatt igjennom" som du kaller det.

    [ Svar på dette | Ny kommentar ]



      Anonym: Guide: php-dag nr. 3: Login-funksjon · Tirsdag 25. februar 2003 01:40
      ' ville blitt BACKSLASH' (itpro fjernet backslashen min)

      [ Svar på dette | Ny kommentar ]



        ovehal: Guide: php-dag nr. 3: Login-funksjon · Tirsdag 4. mars 2003 22:37
        Send en melding
        Ok, men SELECT id FROM userlist WHERE user='BACKSLASH' or 1=1 vil fremdelse kunne kjøres fint mot en del databaser...

        Ove B-)

        [ Svar på dette | Ny kommentar ]



          Anonym: Guide: php-dag nr. 3: Login-funksjon · Søndag 9. mars 2003 13:42
          Nei, den ville returnert en feilmelding fordi du ikke slutter singlequoten.

          [ Svar på dette | Ny kommentar ]



Anonym: Guide: php-dag nr. 3: Login-funksjon · Tirsdag 25. februar 2003 00:31
husk at dersom webserveren kun snakker http, vil brukernavn og passord sendes i klartekst over nettet.

[ Svar på dette | Ny kommentar ]



kjetilkb: Guide: php-dag nr. 3: Login-funksjon · Onsdag 26. februar 2003 14:56
Send en melding · http://www.nettportalen.com
Hvor lenge skal denne guiden fortsette? Denne guiden var veldig bra og håper dere kan fortsettte valdig lenge!

[ Svar på dette | Ny kommentar ]



andei: Guide: php-dag nr. 3: Login-funksjon · Fredag 28. februar 2003 15:40
Send en melding · http://andei.mine.nu
Meget bra artikkel, men jeg lurer på om hvordan jeg effektivt skal kunne bruke session'en videre på andre sider som brukes til brukere som er logget på, og bare for disse.
Hadde vært greit å få svar på dette.

[ Svar på dette | Ny kommentar ]



Anonym: Feil på Login-funksjon · Onsdag 2. april 2003 13:38
Hei...
Merk at jeg er ny på temaet her (php og mysql).

Når jeg lager login.php og fyller inn tabell navnene så de passer mitt system.
Får jeg følgende feilbeskjed:

Warning: Cannot send session cookie - headers already sent by (output started at /var/www/html/php/login.php:16) in /var/www/html/php/login.php on line 17

Warning: Cannot send session cache limiter - headers already sent (output started at /var/www/html/php/login.php:16) in /var/www/html/php/login.php on line 17

Linje 17 er da "session_start()". Det står ingen ting føretter denne komandoen.

Mvh
Marius Falkevik

[ Svar på dette | Ny kommentar ]



V3gard: Guide: php-dag nr. 3: Login-funksjon · Mandag 2. juni 2003 22:50
Send en melding · http://www.v3gard.net
Hva med og lage en tabell vi kan følge? sånn vi kan teste scriptet og forstå det litt bedre?

[ Svar på dette | Ny kommentar ]



Anonym: Guide: php-dag nr. 3: Login-funksjon · Fredag 18. juli 2003 00:43
Hva med å ta med et script for å opprette databasen.

[ Svar på dette | Ny kommentar ]



Anonym: Guide: php-dag nr. 3: Login-funksjon · Tirsdag 14. oktober 2003 12:21
hva med å svare?

[ Svar på dette | Ny kommentar ]



    hal9000: Guide: php-dag nr. 3: Login-funksjon · Onsdag 12. november 2003 01:11
    Send en melding
    Hvorfor ikke stille spørsmål vedrørende dett eemnet her, og ikke i supportforumet. Så slipper man å hoppe hit og dit for å finne svar..


    frustrato

    [ Svar på dette | Ny kommentar ]



webskater: Guide: php-dag nr. 3: Login-funksjon · Torsdag 16. juni 2005 17:15
Send en melding · http://rsf.no-ip.com/~user073
Burde hatt med mysql_escape_string();
Hvis ikke er det bare å skrive slik:
brukernavn' --
hackepeiling

Da trenger du ikke vite passord... :(

[ Svar på dette | Ny kommentar ]


På forsiden nå

Les mer...
Lærdom fra amerikanske filmer
Vranglære?
Les mer...
Rimelig topp-GPS fra TomTom
Nylansering i dag
Les mer...
Treig teknologi gjør oss forbanna
Kanskje ikke så overraskende?
Les mer...
Hjelp! PC’en snakker til meg!
10 indikasjoner på at du er infisert
Les mer...
Falsk TweetDeck-oppdatering i omløp
Twitter tvinger frem passordskifte
Les mer...
Ny, flat designmus fra Microsoft
Arc Touch Mouse