Gå til innhold

Anbefalte innlegg

Driver å lager et CMS til eget bruk, og har mye ferdig nå. Har fått til et fint login system, men vet ikke hvor trygt det er.

Du skriver inn brukernavn og passord, stemmer det, så opprettes en midlertidig cookie fil med en id som matches med brukeren i databasen.

Det jeg tror, som jeg ikke har fått bekreftet, er at hvis noen bare oppretter en cookie selv, så kan de få tilgang til administrasjonen.

Er rett og slett litt usikker på hvordan jeg skal gjøre dette. Har søkt mye og lest en del. Har faktisk et par bøker også, men de forklarer ikke dette så godt, og i allefall ikke i forhold til å bruke dette til innlogging på en sikker måte.

Tenkte først å bruke sessions, men kom fram til at jeg ikke skjønte noe av det, så prøvde med cookies først.

 

Noen som har forslag hva som bør gjøres? Tenkte å opprette et tilfeldig tall som lagres i cookien, men folk kan jo alltids finne ut det.

Lenke til kommentar
Videoannonse
Annonse

Cookien inneholder bare en id som matcher ide'en i databasen. Kan kanskje opprette et tilfeldig nummer med mange tegn.

 

Jeg prøvde lenge å lære meg CGI::Sessions, men skjønte ikke helt hvordan det fungerte.

Har du link til en god tutorial? Har søkt litt, og lest dokumentasjonen, men klarte ikke å henge med.

Lenke til kommentar

jeg kan vise her:

 

#!/usr/bin/perl

use strict;
use warnings;
use CGI;
use CGI::Session;

my $cgi = new CGI;
my $session = new CGI::Session ( $cgi );

## bruker er nå unikt identifisert via $session,
## alle parametere som settes i $session er kun for denne brukeren

## f.eks:
if( loginforsøk ){
 
 ## $session->param('username', 'truls'); ## el..
 
}

print $session->header;

 

 

EDIT: iik.. glemte strict og warnings

Endret av Torbjørn
Lenke til kommentar

Takk for svar og kode, Torbjørn!

 

Har satt opp det nå, og får kjørt scriptet. Sjekker med databasen min, og godkjenner brukernavn og passord.

 $session->param('username', 'truls');

Dette er altså det som setter inn informasjonen i session'en? Blir dette noe sånt: username:truls? Eller er det to unike variabler? Altså: username,truls?

 

Og jeg har et script som jeg bruker til å sjekke om cookien eksisterer. Hvordan skal jeg få sjekke med sessions om jeg er innlogget?

Lenke til kommentar

Dette ble fryktelig rot, og alt har gått litt på trynet, men skal poste litt kode her.

 

Hele scriptet består av mange filer. Dette er fila som mottar logginn-informasjonen:

 

require "subroutines.pl";
use warnings;
use CGI::Carp qw(fatalsToBrowser);
use CGI;
use CGI::Session;
use DBI;
my $cgi = new CGI;
my $session = new CGI::Session ( $cgi );

my $brukernavn  = $cgi->param('brukernavn');
my $passord = $cgi->param('passord');
my	$db_passord = crypt($passord, "La");

&database;

$sth = $dbh->prepare("SELECT COUNT(*) FROM setra WHERE brukernavn='$brukernavn' and passord = '$db_passord'");
  $sth->execute();
  $exist = $sth->fetchrow();
  if($exist ne 1){
     &ingen_treff; 
     exit;
  }

$session->param('logget_inn',1); 
print $session->header;


...(resten er bare printing av sida)

 

Dette er fila som sjekker om du er innlogget.

 

 

use warnings;
use CGI::Carp qw(fatalsToBrowser);
use CGI::Session;
my $session = new CGI::Session ( $cgi );
use CGI;
my $cgi = new CGI;
use DBI;
&database;


if(!$session->param('logged_in') ){
}
else{
$innlogget = 1;
}

print $session->header;

1;

 

Hetsinga gjøres ikke via denne fila. :)

Lenke til kommentar

hm... setter du use strict; øverst i dine filer, ville du fått svaret...

 

rekkefølgen på dine kodelinjer er ikke helt logisk, se på $cgi objektet f.eks

 

EDIT: en digresjon: ikke bruk &database; men istedet datebase(); det finns sjelden noen grunn til å ta med & i funksjonskall.

Endret av Torbjørn
Lenke til kommentar

kjetil_b: som Manfred er inne på så er det & foran database som er issuet her. Har du prøvd med database()? det vil mest sannsynlig ikke ha noen endring i ren funksjonalitet slik du har implementert det.

 

Forskjellen står beskrevet i perldoc perlsub:

 

       To call subroutines:

          NAME(LIST);    # & is optional with parentheses.
          NAME LIST;     # Parentheses optional if predeclared/imported.
          &NAME(LIST);   # Circumvent prototypes.
          &NAME;         # Makes current @_ visible to called subroutine.

 

den siste er aktuell for deg - den medfører at du blander @_ inn i name space til din funksjon, hvilket du mest sannsynlig ikke trenger?

Lenke til kommentar

Her er altså fila som sjekker om du er pålogget eller ikke:

 

use warnings;
use CGI::Carp qw(fatalsToBrowser);
use CGI::Session;
my $session = new CGI::Session ( $cgi );
use CGI;
my $cgi = new CGI;
use DBI;
use strict;
my($dbh);
$dbh = DBI->connect( "dbi:mysql:database", "username", "password", { RaiseError => 1, AutoCommit => 1}) or feilmelding("Kan ikke koble til:",$dbh->errstr);


if(!$session->param('logged_in') ){
}
else{
my $innlogget = 1;
}

print $session->header;

1;

 

Fjerna informasjonen i database innlogginga. Og jeg bare bytta ut &database; med hele tilkoblinga midlertidig.

Lenke til kommentar

Tror kanskje jeg fikk løst det med my($dbh); Og når jeg ser over det nå, så har jeg rota litt...jaja.

 

Uansett, så blir jeg ikke logget inn. Hvordan kan jeg sjekke at jeg er innlogget med sessions? Det som jeg har prøvd til nå funker tydeligvis ikke.

Lenke til kommentar

Stemte nok det ja. Var en skrivefeil som utgjorde det. Pinlig! :)

Etter litt strev så funker alt som det skal.

 

Takk for hjelpa! Setter virkelig pris på å kunne få hjelp så raskt.

Kommer til å fortsette å spørre hvis det er noe jeg lurer på. Har ikke så mye å bidra med til perl forumet bortsett fra spørsmål, men det er kanskje bra at noen skriver her i hele tatt :)

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...