Avatar billede challenge Praktikant
17. januar 2006 - 16:39 Der er 26 kommentarer og
3 løsninger

Brugerscript i php og mysql

hejsa allesammen.

Jeg har iet stykke tid siddet og lavet mit eget forum. Forumet er bygget på et brugerscript fundet hér: http://www.biorust.com/tutorials/detail/115/en/

Men nu vil jeg prøve at lave et brugersystem selv.
Ikke noget fancy, men bare noget registrering og login.

Jeg regner ikke med at registrering er noget problem, det er vel bare en form der sætter noget ind i en database, og self tjekker om de forskellige indtastede oplysninger findes i forvejen. Eller er det mere kompliceret?

Men så til login...
Jeg har set at sessions er meget brugbare, men er det den rigtige vej frem? er der bedere måder?

Og så ville jeg gerne have nogle "hints" til hvordan jeg starter, hvad jeg skal tænke på, og alt det dér...

Da jeg kun har ½ års erfaring i php og mySQL er dette kun en træningsopgave, da jeg syntes det er spændende at komme til at lave noget mere kompliceret end en afstemnings-boks :)

mvh.

Challenge
Avatar billede cpfrande Nybegynder
17. januar 2006 - 17:16 #1
Halløjsa,

Når du skal lave et login, kan du vælge at benytte dig af 3 forskellige ting som standard.

Det er:
- cookie
- session
- bevar login i url

Sidst-nævnte vil jeg slet ikke fortælle om, da den er alt alt for usikker og anvendes praktisk talt ikke i dag.

Hvad angår de to første, så er der nogle forskelle.

Basalt kan jeg fortælle følgende om cookies:
- En lille fil, der gemmes på klienten.

- Den kan leve indtil browseren 'dør' (lukkes ned) eller den kan leve i en periode, som du bestemmer (medmindre brugeren sletter den i mellemtiden).

- Kan bruges til autologin (som f.eks. her på Eksperten.dk) m.v.

Cookies er ikke svært at arbejde med - det er faktisk ganske nemt. Du kan se mere om det i PHP-dokumentation: http://dk2.php.net/manual/da/function.setcookie.php.

Hvad der er værd at bemærke er, at hvis en browser ikke kan forstå cookies eller brugeren har slået muligheden fra - jamen så er det too bad. Så kan man ikke bruge siden/systemet.

Nu til sessions...
Sessions er næsten det samme som cookies - og alligevel ikke. Den benytter sig dog delvist af cookies.

En session kan kun leve sålænge browseren er åben. Lukkes den, så dør den med det samme.

Det smarte med sessions er dog at den bruger et session-id. Det session-id gemmes på klienten vha. en cookie. Hvis klienten ikke kan arbejde med sessions, ja, så kommer der blot et smart ?SESSID=<session_id> efter dine links og så kan den tilgå dataerne på den måde.

Grunden til den kan tilgå dem vha. bare session-id er, at dataerne gemmes på web-serveren og ikke på klienten. Dvs. gemmer du brugernavn, adgangskode m.v. så ligger det på serveren - det eneste der ligger på klienten er selve session-id'et til at få fat i informationerne på.

Derved ved du at det altid vil virke med sessions! :-)

Lidt om sessions i PHPs dokumentation:
http://dk2.php.net/session
http://dk2.php.net/manual/da/function.session-start.php
http://dk2.php.net/manual/da/function.session-register.php
http://dk2.php.net/manual/da/function.session-destroy.php

Det er nok skrevet lidt hurtigt og lidt sjaddent, men har travlt (... og ville alligevel lige hjælpe). Så god fornøjelse! :-)

--
Kristian
Avatar billede challenge Praktikant
17. januar 2006 - 17:32 #2
Hejsa...
Tak for svaret!
Jeg kigger lidt på det - Jeg vælger nok sessions :)

Hvis andre har kommentarer/tips tager jeg self. imod dem!
Avatar billede webstuff Nybegynder
17. januar 2006 - 18:11 #3
Du har ret i den måde du beskriver opret-bruger delen på.. og login delen kan laves så simpelt som det her:

<?
session_start();
$brugernavn = $_POSt[brugernavn];
$kodeord = $_POST[kodeord];

$antal = mysql_query("SELECT brugernavn FROM brugertabel WHERE brugernavn = '$brugernavn' AND kodeord = '$kodeord'") or die(mysql_error());
if(mysql_num_rows($antal) == 1){
$_SESSION[login] == 'true';
} else {
echo "Forkert brugernavn eller kodeord";
}
?>

og så kan du når du skal tjekke om brugeren er logget ind på en side gøre sådan her:

<?
session_start();
if($_SESSION[login] == 'true'){
echo "Velkommen til den beskyttede side";
} else {
echo "Du er ikke logget ind";
}
?>
Avatar billede challenge Praktikant
17. januar 2006 - 20:18 #4
Hmm, ja det var jo utrolig enkelt...!

Men jeg har dog et problem.
Det er som om at min session ikke skriver dadaerne videre til "beskyttet.php"

her er koderne:
Login.php:
<?
session_start();

$brugernavn = $_POST[brugernavn];
$kodeord = md5($_POST[kodeord]);

$db = mysql_connect("xxx", "xxx", "xxx");
mysql_select_db("xxx", $db);

$antal = mysql_query("SELECT brugernavn FROM bruger WHERE brugernavn = '$brugernavn' AND kodeord = '$kodeord'") or die(mysql_error());
if(mysql_num_rows($antal) == 1){
$_SESSION[login] == 'true';
header("Location: beskyttet.php");
} else {
?>
<form method="POST" action="beskyttet.php">
<input name="brugernavn" type="text" value=""><br><input name="kodeord" type="password" value=""><br><input type="submit" id="login" value="login...">
</form>
<?
}
?>

beskyttet.php:
(den du skrev, webstuff.)
<?
session_start();
if($_SESSION[login] == 'true'){
echo "Velkommen til den beskyttede side";
} else {
echo "Du er ikke logget ind";
}
?>

Hvad er der galt?

Tak for svaret forresten!
Avatar billede challenge Praktikant
17. januar 2006 - 22:33 #5
Den kommer med "du er ikke logget ind..." meddelesen...
Avatar billede showsource Seniormester
17. januar 2006 - 23:21 #6
lidt forskellgt, (synes jeg)
I din login.php, så lav et tjek på om POST er sat, og derefter din connect og query og header.
Lige nu, "tror" scriptet at post er sat.

Et andet eks.  (login.php)

<?
session_start();

if(isset($_POST["brugernavn"], $_POST["password"])) {

    $brugernavn = stripslashes($_POST["brugernavn"]);
    $kodeord = md5($_POST["kodeord"]);

    $db = mysql_connect("xxx", "xxx", "xxx");
    mysql_select_db("xxx", $db);

    $antal = mysql_query("SELECT `brugernavn` FROM `bruger` WHERE `brugernavn` = '". mysql_real_escape_string($brugernavn) ."' AND `kodeord` = '". $kodeord ."'") or die(mysql_error());

        if(mysql_num_rows($antal) == 1){
        $_SESSION["login"] = 1;
        $page = "beskyttet.php";
   
        }else{

        $_SESSION["error"] = 1;
        $page = $_SERVER["PHP_SELF"];
        }

    header("Location:". $page");

}
?>


<html><head><title>Login</title></head>
<body>

<?php
if(isset($_SESSION["error"])) {
echo"<p>Fejl i brugernavn og/eller password</p>";
unset($_SESSION["error"]);
}
?>

<form method="POST" action="<?php echo $_SERVER["PHP_SELF"]; ?>">
<input name="brugernavn" type="text" value=""><br>
<input name="kodeord" type="password" value=""><br>
<input type="submit" id="login" value="login...">
</form>
</body></html>

Og beskyttet.php

<?php
session_start();

if(isset($_SESSION[login])) {
echo "Velkommen til den beskyttede side";
} else {
echo "Du er ikke logget ind";
}

?>
Avatar billede showsource Seniormester
17. januar 2006 - 23:23 #7
Og du kan jo altid hente et system her:
http://users.showsource.dk/

Eller kikke koder:
http://users.showsource.dk/install.php
Avatar billede showsource Seniormester
17. januar 2006 - 23:24 #8
Og så lige neb fejl i beskyttet.php!
Manglenede "

if(isset($_SESSION["login"])) {
Avatar billede cpfrande Nybegynder
18. januar 2006 - 08:45 #9
Jeg vil gerne lige bemærke til challenge fordel, at de skrevne koder i disse indlæg udgør et meget simpelt login-system.

Hvis man ønsker at lave et login-system, mener jeg personligt ikke, at det skal gøres sådan. Der skal være noget mere validering ved hver beskyttet hjemmeside, fremfor blot en tjek om login er sat. :-)

Nævnte kode udgør desuden det problem, at du på den beskyttede side ikke kan se, hvem det er, som er logget på den. Du kan kun se, at det er en valid bruger, der er logget på - men ikke hvem.

--
Kristian
Avatar billede challenge Praktikant
18. januar 2006 - 14:45 #10
Hey. Tak for svarene!
Jeg har valgt at prøve selv, da jeg ikke kan få det jeg havde før til at virke.
Så jeg prøver at gå efter det Kristian siger.

Vil dette være godt(?):
(Udkast)

if($_POST["login"]) {
$connect til db;

$brugernavn = $_POST["brugernavn"];
$kodeord = $_POST["kodeord"];

$antal = mysql_query("SELECT * FROM bruger WHERE brugernavn = '$brugernavn' AND kodeord = '$kodeord'") or die(mysql_error());
if(mysql_num_rows($antal) == "1"){
$_SESSION["brugernavn"] == $brugernavn;
$_SESSION["rigtigenavn"] == $rigtigenavn;
$_SESSION["login"] == "true";
header("Location: beskyttet.php");
}

} else {
<formen id="login">
}

Skal jeg have flere sikkerhedselementer? og i så fald hvad?
Avatar billede cpfrande Nybegynder
18. januar 2006 - 14:50 #11
Halløj,

Jeg tænkte nu ikke så meget på ekstra ved login, men mere af tjek for login på de(n) beskyttede side(r).

Her tjekkes der kun for om $_SESSION['login'] er sat.
Her kunne jeg f.eks. godt lide, hvis der også var en session, der holdte styr på hvem, der var logget ind (kunne f.eks. indeholde brugernavnet eller lign.)

Hvis man vil, kan man også vælge at tjekke for leve-tiden for brugerens login (hvis man f.eks. vile have brugeren max var logget på i 3 timer) - evt. tjekke om der er flere logget på af den samme brugere (kan du jo gøre med session-id'et).

Dit udkast ser forresten fint nok ud.

--
Kristian
Avatar billede challenge Praktikant
18. januar 2006 - 14:58 #12
Hey.
Jeg skal se på hvad du har skrevet (hvis jeg har evner til det :))

Kan jeg ikke se hvem der er på når jeg sætter $_SESSION["brugernavn"] == $brugernavn;?
Avatar billede cpfrande Nybegynder
18. januar 2006 - 15:00 #13
Halløjsa,

Jo, det er mig, der så forkert. Der er dog intet behov for at gemme det rigtige navn i en session også - det kan du jo altid trække ud fra databasen senere hen vha. brugernavnet :-)

--
Kristian
Avatar billede challenge Praktikant
18. januar 2006 - 15:09 #14
Okay, tak :)

Jeg har lavet lidt videre, men jeg har svært ved at koncentrere mig hvis ikke det virker...

Hvad er der galt?

kode:
<?
session_start();

$db = mysql_connect("xxx", "xxx", "xxx");
mysql_select_db("brugersystem", $db);

if(isset($_POST['login']))
{

$brugernavn = $_POST["brugernavn"];
$kodeord = md5($_POST["kodeord"]);

$query = mysql_query("SELECT * FROM bruger WHERE brugernavn = '$brugernavn' AND kodeord = '$kodeord' LIMIT 1") or die(mysql_error());

$row = mysql_fetch_array($query);

if(mysql_num_rows($query) > 0)
{

if($row["aktiv"] > 0)
{

$_SESSION["login"] = "true";
$_SESSION["brugernavn"] = $username;
$_SESSION["brugerid"] = $row["id"];

header("Location: beskyttet.php");

} else {
?>
ikke aktiv
<?
}
} else {
?>
fejl
<?
}
} else {
?>
<form method="POST">
<input name="brugernavn" type="text" value=""><br><input name="kodeord" type="password" value=""><br><input type="submit" id="login" value="login...">
</form>
<?
} mysql_close($db);
?>

Det er svært at lave noget hvis det ikke virker :)
Avatar billede cpfrande Nybegynder
18. januar 2006 - 15:10 #15
Hvad siger den af fejl da?
Avatar billede showsource Seniormester
18. januar 2006 - 15:11 #16
Lidt ændringer på dit script synesjeg nu nok skal gøres:

---------------------------------
if($_POST["login"]) {

bør være

if(isset($_POST["login"])) {

--------------------------------

Når du blot bruger
$brugernavn = $_POST["brugernavn"];
$kodeord = $_POST["kodeord"];
er der en risiko for sql injection hvis magic_quotes_gpc er slået fra
Kik her: http://www.eksperten.dk/artikler/190

---------------------------------

Efter
if(mysql_num_rows($antal) == "1"){
skal du lige ha'
$row = mysql_fetch_array[$antal];
så du kan registrere de sessions du vil med f.eks. rigtigt navn o.s.v

$_SESSION["brugernavn"] == $row["brugernavn"];
$_SESSION["rigtigenavn"] == $row["rigtigenavn"];

---------------------------------

Hvis du har et autoincrement i din DB, synes jeg det er en go' ide at registre dette, fordi du på den måde altid kan opdatere/hente fra DB ud fra det felt alene
Avatar billede showsource Seniormester
18. januar 2006 - 15:12 #17
Så ik' lige de to sidste kommentarer
Avatar billede challenge Praktikant
18. januar 2006 - 15:17 #18
Der sker intet... Den opdaterer bare login-siden...

showsource,

tror at jeg har fået dem med ;)
Avatar billede cpfrande Nybegynder
18. januar 2006 - 15:54 #19
<input type="submit" id="login" value="login...">

i stedet for id="login", så prøv lige at skrive name="login".

Det kan være det (har det været før hos mig), men er ikke sikker.

--
Kristian
Avatar billede challenge Praktikant
18. januar 2006 - 16:12 #20
Yay, det virkede, tak!!

Jeg læser lidt mere om emnet og vender tilbage så i kan få jeres point.
Har i mere at tilføje, så er det bare ok hvis i skriver det! :)
Avatar billede challenge Praktikant
18. januar 2006 - 16:34 #21
Jeg tror bare jeg giver point med det samme.
Så cpfrande, webstuff og showsource - skriver i lige et svar?
Avatar billede cpfrande Nybegynder
18. januar 2006 - 16:36 #22
Hermed et svar.

God fornøjelse med det! :-)

--
Kristian
Avatar billede challenge Praktikant
18. januar 2006 - 16:42 #23
Tak for det...

(venter lige, til de to andre også lige svarer, med at give point :) )

Tak for hjælpen allesammen!
Avatar billede challenge Praktikant
18. januar 2006 - 19:28 #24
Lige et sidste spørgsmål: Hvor sikkert er dette? Kan jeg optimere sikkerheden på nogen måde?
Avatar billede webstuff Nybegynder
19. januar 2006 - 01:46 #25
Svar :-)
Avatar billede cpfrande Nybegynder
19. januar 2006 - 08:27 #26
Hej,

Til dit sidste spørgsmål, kan du læse min kommentar skrevet d. 18/01-2006 14:50:33.
Den fortæller lidt om det.

--
Kristian
Avatar billede showsource Seniormester
19. januar 2006 - 11:26 #27
lige et svar
Avatar billede cpfrande Nybegynder
19. januar 2006 - 11:28 #28
Husk at vælge "Svar" ude i siden - ellers bliver det blot en alm. kommentar :-)
Avatar billede showsource Seniormester
19. januar 2006 - 11:30 #29
:!
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