Avatar billede specto Nybegynder
22. marts 2005 - 20:17 Der er 14 kommentarer

Loginsystem - Sikkerhed

Jeg er ved at lave et lille cms til en hjemmeside. Derfor er jeg vad at lave et lille login system, til administrationen. Jeg har ikke så stor erfaring med php, så jeg har brug for at få vurderet sikkerheden. Det er måske ikke det jeg prioriterer højest, men jeg er sikker på at der ikke skal så meget til for at det bliver en del mere sikkert.

Spm 1. Efter at jeg har tjekket om der eksisterer en admin med angivet username og password udfører jeg følgende kode:

if(mysql_num_rows($result) == 1){
$query_data = mysql_fetch_array($result);
$adminId = $query_data["adminId"];
$_SESSION['adminId'] = $adminId;

Dereftefter sender jeg brugeren videre med:

<script>
location.href = 'main.php';
</script>

I main.php (og alle kommende sider) står der følgende linie øverst:

require('validation.php');

Og i validation.php  står der:

<?php

if (!isset($_SESSION['adminId'])) {
header("Location: index.php");
}

?>

Hvor sikkert er det at gøre det på denne måde? Jeg har testet dette, og det virker. Så det ser ud som om almindelige mennesker bliver lukket ude.

Spm2. Hvordan gør jeg så at den session udløber? Går ud fra at den udløber når clienten lukkes ned, men hvad nu hvis man vil at den skal udløbe efter ½ time? Synes mange systemer er på den måde, men det er måske noget pjat?

På forhånd tak!
Avatar billede jaw Nybegynder
22. marts 2005 - 20:43 #1
Skal den udløbe efter 30 mins, så brug cookies: http://dk.php.net/manual/da/function.setcookie.php

Og det andet er sådan set rimelig sikkert sålænge vi snakker om PHP-kodning. Der er flere måder at lave login-systemet på, men din løsning er for mig at se ligeså god som mange andre. Det eneste jeg måske ville påpege var at dit redirect-script vil være pænere ved at bruge header("Location: en_side.php"); - men giver jo sådan set samme resultat igen...
Avatar billede jaw Nybegynder
22. marts 2005 - 20:45 #2
De her to linier kunne du lave til en:

$adminId = $query_data["adminId"];
$_SESSION['adminId'] = $adminId;

$_SESSION['adminId'] = $query_data['adminId'];

Jo flere variabler der sættes, jo flere ressourcer bruger serveren. I et så lille script vil det næppe være mærkbart, men alligvel en god ting at tænke over...
Avatar billede specto Nybegynder
22. marts 2005 - 20:48 #3
Okay, så det er cookies man skal bruge. Hvad sker der med dem som har slået dette fra?

God pointe med ressourcer. Var dog klar over at den linie kunne undværes. Synes generellt php giver noget grimt kode (har arbejdet med cfml før), så man bliver ikke så motiveret til at rydde op.
Avatar billede jaw Nybegynder
22. marts 2005 - 20:57 #4
Tjah, ved ikke helt. Tror de færreste slår cookies fra, og så må de jo slå dem til :)

Om PHP er grim kode kan vel diskuteres, men det synes jeg da ikke nødvendigvis det er...
Avatar billede specto Nybegynder
22. marts 2005 - 21:02 #5
Alt er relativt. Har du nogensinde set noget cfml kode? Det er pænt. Men sikkert en vanesag!

Fik en fejl da jeg brugte header-funktionen. "Warning: Cannot modify header information - headers already sent by..."
Avatar billede plx Nybegynder
22. marts 2005 - 21:02 #6
Du bør sætte exit på, når du redirecter hvis admin ikke er logget ind

if (!isset($_SESSION['adminId'])) {
  header("Location: index.php");
  exit();
}
Avatar billede rednex Nybegynder
22. marts 2005 - 22:43 #7
Husk også at køre en mysql_real_escape_string() på både brugernavn og password inden du laver database kaldet. Ellers er der ingen ben i at smutte udenom din login funktion. Og som en ekstra sikkerhed kan du checke at det indtastede brugernavn og password er det samme som det databasen returnerer. Så skulle du være sikret mod SQL injection.
Avatar billede rasmus-madsen Nybegynder
22. marts 2005 - 22:54 #8
Hvis det er en linux server det kører på kan du lave en mappe til administrator delen og kigge lidt på htaccess. Det meget sikkert.
Avatar billede jaw Nybegynder
22. marts 2005 - 23:04 #9
Din fejl: "Warning: Cannot modify header information - headers already sent by..." skyldes, at du får udskrevet kode inden burgeren bliver redirectet. Det ligger enten i samme .php-fil som udskriver noget til skærmen før den kører selve login-scriptet, der er et <mellemrum> før <?PHP eller lign. Det kan løses med at bruge din egen løsning, eller du kan kigge på ob_start(); - men lige meget hvad, så er den pæneste løsning at få header() til at virke, ved at lave en separat fil til scriptet, eller i hvert fald sikre at der ikke bliver udskrevet noget til skærmen inden.

Forståeligt? :)
Avatar billede sukos Juniormester
23. marts 2005 - 06:59 #10
hvis du vil ha' en session til at "dø", efter f.eks. 10 min, kan du bruge

ini_set('session.cookie_lifetime', 10);

inden du bruger

session_start();

Pr. default, vil der med session_start() også blive sat en cookie, så hvis man slår cookies fra kan man ikke logge ind.

Hvis du vil være helt sikker på alle kan logge ind, kan du bruge:

<?php
ini_set('session.use_trans_sid', 1);
ini_set('session.use_cookies', 0);

session_start();

?>

Dog har det så den ulempe, at hvis en bruger sender et link med session_id'et, vil andre kunne "gøre brug" af session'en.
Det kan man så nogenlunde fixe ved at registrere ip'en og lave tjek på den ved hver request
Avatar billede specto Nybegynder
23. marts 2005 - 23:16 #11
Så, nu har jeg nået at indhendte!!! :-)

plx - God pointe! Er tilføjet!!!

rednex - Bruger mysql_real_escape_string($_POST['user']). Er det godt nok?

jaw - Har fået header() til at virke, og der var et mellemrum! ;-)

sukos - jeg indleder mit login script med de to liner:

ini_set('session.cookie_lifetime', 10);
session_start();

Dette får desværre ikke session'en til at dø efter ti minutter! Ved ikke om jeg har misforstået noget.
Avatar billede rednex Nybegynder
23. marts 2005 - 23:39 #12
Ja, det er fint. Husk at gøre det samme på alle inputs fra brugeren som du bruger i databasequeries.
Avatar billede sukos Juniormester
24. marts 2005 - 07:47 #13
Jahh, havde ikke brugt det selv, fandt kun ud af at der blev lavet en ny session-fil!
Men det lader til at browseren "gememr" session, og putter satte variabler ind i den nye fil. (og så er det sekunder, og ikke minutter!)

<?php
$dir = $_SERVER["DOCUMENT_ROOT"] . dirname($_SERVER["PHP_SELF"]);
ini_set('session.save_path', $dir);
ini_set('session.cookie_lifetime', 5);
session_start();

    if(isset($_GET["var"])) {
    $_SESSION["iniset"] = "Session er sat!";
    }


if(isset($_SESSION["iniset"])) {
echo $_SESSION["iniset"];
}else{
echo"<a href='". $_SERVER["PHP_SELF"] ."?var=ini'>sæt session</a>";
}
echo"<p>";
echo session_id();
?>

har lige rodet med det, og kan sgutte finde ud af det lige nu!

Men en anden måde, (som jeg selv bruger :O]), kunne jo være at registrere tidspunkt, og på den måde "disable" en bruger
Avatar billede specto Nybegynder
24. marts 2005 - 15:37 #14
Jeg er ikke helt med, sukod?! Kunne du ikke få ovenstående script til at fungere?
Når du siger registrere tidspunkt, mener du så at gemme dette i sessionen? Vil du så opdatere dette for hvert sidekald?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester