Avatar billede weblance Nybegynder
15. september 2007 - 09:00 Der er 20 kommentarer og
1 løsning

Hvordan laver jeg bedst login til flere brugere?

Jeg skal til at lave en login side til et site hvor der er flere undermapper. Login oplysningerne skal dirigere brugeren til den rette undermappe. Men hvordan gør jeg det bedst?

Havde forestillet mig noget i retning af en sql der indeholder login, adgangskode og mappe. Passer login og adgangskoden skal brugeren omdirigeres til mappen.

Er det en brugbar løsning - også sikkerhedsmæssigt?

/Carl
Avatar billede nielle Nybegynder
15. september 2007 - 09:08 #1
Ja det er det.

MEN du skal også lige sikre dig at folk ikke selv kan hoppe til mapperne uden at logge sig ind. Dvs. at alt der foregår i mapperne skal tjekkes for om personen er logget ind (og har adgang til den specifikke mappe).
Avatar billede weblance Nybegynder
15. september 2007 - 09:16 #2
kan man ikke gøre det hva. en session?
Avatar billede nielle Nybegynder
15. september 2007 - 09:23 #3
ja :^)
Avatar billede weblance Nybegynder
16. september 2007 - 10:00 #4
Ok, login script er lavet og jeg havde tænkt mig at bruge cookies for at checke authorisation. De forskellige brugere skal som sagt videresendes til en specifik mappe. Er der noget med at jeg i cookien kan begrænse brugerens authorisation?

Fx.: setcookie("auth", "værdi", 0, "/", "mitdomæne.dk", 0);

Hvis jeg så sætter "/" til "/bruger" vil det ikke være nok?
Avatar billede weblance Nybegynder
16. september 2007 - 10:10 #5
... ja og selvfølgelig ligger en index fil i hver mappe der checker for cookie:

<?php
if ($_COOKIE[auth] == "1") {
    echo "Du er autoriseret.";
} else {
    echo "Du har ikke adgang til denne mappe";
    exit;
}
?>

cookien sættes således:

setcookie("auth", "1", 0, "/bruger", "mitdomæne.dk", 0);
Avatar billede nielle Nybegynder
16. september 2007 - 11:07 #6
Husk lige på at dine users har fri adgang til at ændre teksten i en cookie, og at en hacker derfor potentielt ville kunne modifiserer en cookie til at se ud som om han er logget ind.

Cookies er gode til at lave auto-login. Men man bør kun gemme username op password i dem - man slipper ikke for at tjekke disse på serveren.
Avatar billede weblance Nybegynder
16. september 2007 - 13:49 #7
Hvordan sikrer jeg så mapperne? Skal heg bruge .htaccess?
Avatar billede weblance Nybegynder
16. september 2007 - 14:42 #8
Hvad nu hvis cookien ser således ud:

setcookie("auth", "brugernavn:adgangskode", 0, "/bruger", "mitdomæne.dk", 0);

Så skal der virkelig et klogt hoved til at gætte brugernavn og adgangskoden...
Avatar billede nielle Nybegynder
16. september 2007 - 17:42 #9
Du skal da bare bruge SESSION i stedet for COOKIE.

I øvrigt er .htaccess en anden måde at håndtere problemet på. Der har du så bare problemet at du ikke kan styre det via en database.
Avatar billede nielle Nybegynder
16. september 2007 - 17:45 #10
16/09-2007 14:42:35> Næ, ikke specielt. Hvis du alligevel kun tjekker på værdien af auth for at finde ud af om folk er lokket på så er det nok at ændre denne værdi og ignorere username og password.

Denne type hacker-angreb kaldes for "cookie poisoning" (småkage forgiftning):

http://www.google.dk/search?hl=da&q=cookie+poisoning&btnG=Google-s%C3%B8gning&meta=
Avatar billede nielle Nybegynder
16. september 2007 - 17:46 #11
lokket => logget
Avatar billede weblance Nybegynder
17. september 2007 - 09:51 #12
Ok...

Vil dette scenario fungere?

1. Der laves en session_register("adgang")

2. I login hentes mappenavn fra databasen ud fra brugernavn/password. $adgang = "/brugermappe"

3. I hver mappe checkes der i index filen om $adgang == den mappe man nu er i, hvis ja kan man fortsætte og hvis nej bliver man smidt tilbage til login
Avatar billede nielle Nybegynder
17. september 2007 - 18:47 #13
Ad 1 - Jeg ville nok bruge session_start() og $_SESSION i stedet for session_register().

Ad 2 - Ja, gem endeligt alle de relevante oplysninger for et login på samme sted. F.eks. i din database.

Ad 3 - Kan ikke lige helt gennemskue hvad du mener, men det er sikkert meget fornuftigt det du har i tankerne. Gem også mappenavnet i din session.
Avatar billede weblance Nybegynder
17. september 2007 - 19:06 #14
I nr. 3 mener jeg:

I hver index.php i undermapperne kører jeg en (i simplificeret udgave):

if($_SESSION["mappe"] == "/bruger1") {
echo "Du er godkendt";
}else{
echo "Du er ikke godkendt";
}
Avatar billede weblance Nybegynder
17. september 2007 - 20:10 #15
Nu har jeg lavet noget der ser ud til at fungere:

Login:

<form method="post" action="login_check.php">
<p><strong>Brugernavn:</strong><br />
<input type="text" name="username" /></p>
<p><strong>Adgangskode:</strong><br />
<input type="password" name="password" /></p>
<p><input type="submit" name="submit" value="Login" /></p>
</form>

login_check.php:

<?php
// check formularens felter for indhold
if ((!$_POST[username]) || (!$_POST[password])) {
    header("Location: login.php");
    exit;
}

// skab forbindelse til server, og vælg database
$conn=mysql_connect ("localhost", "n344951_admin", "...") or die ('I cannot connect to the database because: ' . mysql_error());
mysql_select_db ("n344951_auth");

// opbyg og udsted forespørgsel
$sql = "SELECT TilladtMappe FROM auth_users WHERE
    Brugernavn = '$_POST[username]' AND Adgangskode =
    password('$_POST[password]')";
$result = mysql_query($sql,$conn) or die(mysql_error());

// hent antal poster fra forespørgslen; bør være lig 1
if (mysql_num_rows($result) == 1) {

    // hvis autoriseret, hent indhold af TilladtMappe
    $mappe = mysql_result($result, 0, 'TilladtMappe');
   
   
    session_start();
    $_SESSION['mappe'] = $mappe;
       
} else {

    // tilbage til login-forumlar, hvis ikke autoriseret
    header("Location: login.php");
    exit;
}

header("Location: $mappe");
exit;

?>

Og index.php i mappen ser sådan ud:

<?php
session_start();

if($_SESSION['mappe'] == "/dennemappe") {
    echo "Du er godkendt";
}else{
    echo "Du er ikke godkendt";
}
?>

Det ser ud til at fungere fint . . . er det også godt nok sikkerhedsmæssigt??
Avatar billede nielle Nybegynder
17. september 2007 - 20:18 #16
Ret denne linje:

sql = "SELECT TilladtMappe FROM auth_users WHERE
    Brugernavn = '$_POST[username]' AND Adgangskode =
    password('$_POST[password]')";

til:

$username = mysql_real_escape_string($_POST["username"]);
$password = mysql_real_escape_string($_POST["password"]);
sql = "SELECT TilladtMappe FROM auth_users WHERE Brugernavn = '$username' AND Adgangskode = password('$password')";
Avatar billede nielle Nybegynder
17. september 2007 - 20:18 #17
Hov der smuttede et $-tegn i starten.
Avatar billede weblance Nybegynder
17. september 2007 - 20:36 #18
Hvad er forskellen?
Avatar billede nielle Nybegynder
17. september 2007 - 20:49 #19
mysql_real_escape_string() beskytter i mod den type hacker-angreb som kaldes for SQL-injection.

Du kan selv afprøve hvad der sker med din originale kode hvis du skriver et '-tegn i dit username-felt...
Avatar billede weblance Nybegynder
17. september 2007 - 20:54 #20
ok

tusind tak for hjælpen! giv et svar så du kan få point!
Avatar billede nielle Nybegynder
17. september 2007 - 20:55 #21
Svar :^)
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