[PHP] Login script koppijn

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • D-Raven
  • Registratie: November 2001
  • Laatst online: 10-09 20:32
Ik heb een login script geschreven. De basic werking van het script is dat hij kijkt naar een sessie variabele of er iemand is ingelogd. Zo niet dan geeft hij een form weer waarmee je kan inloggen.
Daarna voert de gebruiker zn gegevens in en drukt op de knop "login". Het script verwijst naar zichzelf, en zal controleren of er op "login" gedrukt is, zo ja dan gaat ie de gegevens van de gebruiker controleren enzo.
Klinkt allemaal erg standaard en ik zal zo ook deels van de code neerzetten.

Mijn probleem is nu dat als er niemand is ingelogd, het script nog steeds niks doet, terwijl hij dan dus met het inlog Form moet komen.
Ik weet dat ik ergens overheen aan het kijken ben, ik weet alleen niet wat!!
opmerkingen
session.auto_start = Off
session.use_cookies = On
session.use_only_cookies = Off

En dan nu de code
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
<?php
if ($_SESSION['logged_in'] == NULL) //Dus als mn sessie niet bestaat
{
    if ($_POST['Login'] != NULL) //Als het formulier is ingevuld en op Login is geramd
    {
       include ('dbconnect.php');
       $sql = "SELECT username, password, Alliance, Account_type, Activated FROM 
user_login WHERE username = '$_POST['Username']"; // afgekapt om de layout te sparen
       $result = mysql_query($sql);
       if (mysql_num_rows($result) > 0)
        {
        $rij = mysql_fetch_array($result);
        $username = $rij["username"];
        $password = $rij["password"];
        $usertype = $rij["Account_type"];
        $Activated = $rij["Activated"];
        $Alliance = $rij["Alliance"];
        }
        // simpele if statements om de ingevoerde waardes te vergelijken met de waardes uit de database
        if($_POST['Username'] != $username)
        {
         $_SESSION['logged_in'] = false;
         echo "<b>Your loginname was incorrect</b>";
        }
        else if($_POST['Password'] != $password)
        {
         $_SESSION['logged_in'] = false;
         echo "<b>Your password was incorrect</b>";
        }
        else if($Activated == false)
        {
         $_SESSION['logged_in'] = false;
         echo "<b>Your account has not yet been activated.  bla bla</b>";
         echo "<b>If u already posted an request bla bla</b>";
        }
        else
          $_SESSION['logged_in'] = true;
          $_SESSION['usertype'] = $Inlog_Type;
          $_SESSION['username'] = $username;
          $_SESSION['alliance'] = $Alliance;
         }
    } Else 
    {
       Echo "<form method=\"post\" action=\"$PHP_SELF\">";
       Echo "<table><tr><td>InlogName:</td></tr>";
       Echo "<tr><td><input name=\"Username\" type=\"text\" value=\"\" maxlength=\"15\"></td></tr>";
       Echo "<tr><td>Password:</td></tr>";
       Echo "<td><input name=\"Password\" type=\"Password\" value=\"\" maxlength=\"15\"></td></tr>";
       Echo "<tr><td><input type=\"submit\" name=\"Login\" value=\"Login\"></td></tr></table>";
       Echo "</form>";
    }
}
?>


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
session_start();
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
    <title>Main</title>
</head>
<body>
<?php
include('Login.php')
//Normal navigation code
Blaaat
?>
</body>
</html>

[ Voor 18% gewijzigd door D-Raven op 02-06-2004 10:24 ]


Acties:
  • 0 Henk 'm!

  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Je zet false in $_SESSION['logged_in'] als het mis gaat en het begin check je deze op NULL :?

Who is John Galt?


Acties:
  • 0 Henk 'm!

Verwijderd

Is die check sowieso niet makkelijker te doen met een 'isset'?!?!

Acties:
  • 0 Henk 'm!

  • Kippenijzer
  • Registratie: Juni 2001
  • Laatst online: 26-08 09:08

Kippenijzer

McFallafel, nu met paardevlees

Regel 7 : mist een '

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Verander je eerste 2 checks eens in dit:
PHP:
1
2
3
4
if (!isset($_SESSION['logged_in'])) //Dus als mn sessie niet bestaat
{
    if (isset($_POST['Login'])) //Als het formulier is ingevuld en op Login is geramd
    {

edit:
Excuus Emiletje! 7(8)7

[ Voor 25% gewijzigd door NMe op 02-06-2004 10:29 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • MaxxRide
  • Registratie: April 2000
  • Laatst online: 22-06 16:52

MaxxRide

Surf's up

Is je $Session['logged_in'] niet gewoon null (daar heb je geen else voor staan nl).

If you are not wiping out you are nog pushing enough...


Acties:
  • 0 Henk 'm!

Verwijderd

NMe84 schreef op 02 juni 2004 @ 10:22:
Verander je eerste 2 checks eens in dit:
PHP:
1
2
3
4
if (isset($_SESSION['logged_in'])) //Dus als mn sessie niet bestaat
{
    if (isset($_POST['Login'])) //Als het formulier is ingevuld en op Login is geramd
    {
Ik denk ik geef een hint in de goeie richting.. op deze manier maak je 't 'm wel erug makkelijk!! 8)7 8)7

Acties:
  • 0 Henk 'm!

  • robertpNL
  • Registratie: Augustus 2003
  • Niet online
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
<?php
if (!isset($_SESSION['logged_in']) //edit
{
    if (isset($_POST['Login'] )) //edit
    {
       include ('dbconnect.php');
       $sql = "SELECT username, password, Alliance, Account_type, Activated FROM user_login WHERE username = '$_POST['Username']";
       $result = mysql_query($sql);
       if (mysql_num_rows($result) > 0)
           {
           $rij = mysql_fetch_array($result);
           $username = $rij["username"];
           $password = $rij["password"];
           $usertype = $rij["Account_type"];
           $Activated = $rij["Activated"];
           $Alliance = $rij["Alliance"];
           }
        // simpele if statements om de ingevoerde waardes te vergelijken met de waardes uit de database
        if($_POST['Username'] != $username)
        {
         unset($_SESSION['logged_in'] ; // edit
         echo "<b>Your loginname was incorrect</b>";
        }
        else if($_POST['Password'] != $password)
        {
         unset($_SESSION['logged_in']); // edit
         echo "<b>Your password was incorrect</b>";
        }
        else if($Activated == false)
        {
         unset($_SESSION['logged_in']);
         echo "<b>Your account has not yet been activated. Post an activation request in the Alliance forum</b>";
         echo "<b>If u already posted an request please keep in mind that processing your activation usually takes up to 1 day</b>";
        }
        else
          $_SESSION['logged_in'] = true;
          $_SESSION['usertype'] = $Inlog_Type;
          $_SESSION['username'] = $username;
          $_SESSION['alliance'] = $Alliance;
         }
    } Else 
    {
       // Arrghh. De form zelf even ineen aparte PHP zetten en daar naar
       // verwijzen.
       include("form.php");
    }
}
?>


Zo, ik heb je code enigzins aangepast. Let op de commentaar als //edit. Op die regel heb ik het aangepast.

Leer verder isset en unset kennen.

Succes.

Acties:
  • 0 Henk 'm!

  • D-Raven
  • Registratie: November 2001
  • Laatst online: 10-09 20:32
justmental schreef op 02 juni 2004 @ 10:19:
Je zet false in $_SESSION['logged_in'] als het mis gaat en het begin check je deze op NULL :?
Ja dat is nog een soort leftover van een vorige versie. niet op letten :P
Zou kunnen, eens naar kijken...
NMe84 schreef op 02 juni 2004 @ 10:22:
Verander je eerste 2 checks eens in dit:
PHP:
1
2
3
4
if (isset($_SESSION['logged_in'])) //Dus als mn sessie niet bestaat
{
    if (isset($_POST['Login'])) //Als het formulier is ingevuld en op Login is geramd
    {
Ik heb t al met isset geprobeerd. En die eerste isset van jou is trouwens fout, want hij moet dit alles juist doen als isset($_POST['Login']) False is.

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

D-Raven schreef op 02 juni 2004 @ 10:28:
Ja dat is nog een soort leftover van een vorige versie. niet op letten :P
Wel op letten, dat kan je probleem wel es zijn. :P
D-Raven schreef op 02 juni 2004 @ 10:28:
Ik heb t al met isset geprobeerd. En die eerste isset van jou is trouwens fout, want hij moet dit alles juist doen als isset($_POST['Login']) False is.
I know, was een foutje, was het al aant verbeteren toen jij je bericht aant tikken was. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • D-Raven
  • Registratie: November 2001
  • Laatst online: 10-09 20:32
Damn wat zijn jullie snel, had ik niet verwacht.
robertpnl bedankt voor de moeite. Ik ken isset en unset al maar ben zelf nog niet zo heel lang bezig met php en kende deze toepassing nog niet.
Zodra ik thuis ben zal dit eens uitproberen.

(zou wel beetje lullig zijn als dit de enigste fout was maar ok 8)7 :+ )

Bedankt voor de reply's mensen, Ik post laters nog wel even of het nu gelukt is of niet.

Acties:
  • 0 Henk 'm!

Verwijderd

Er valt trouwens nog wel wat meer op te merken aan je code...

Allereerst heb je geen enkele beveiliging op je wachtwoord zitten. Je zet dus gewoon letterlijk het wachtwoord zo in de db.

verander regel 25 in:
code:
1
else if( md5( $_POST['Password'] ) != $password)
en sla de wachtwoorden op mbv dezelfde md5 functie daar waar de gebruiker het gewenste wachtwoord opgaf.

Dat slaapt al een beetje rustiger :D

ten tweede ben ik een voorstander van objecten gebruiken, zeker voor het DB gebeuren. Zie http://pear.php.net/

Je kunt dan databasefuncties vergemakkelijken tot zoiets als dit:
(gebruikt een zelf aangepast object voor db afhandeling dat in de global.php gedeclareerd wordt. Dit maakt je code makkelijker leesbaar en beter onderhoudbaar. Ik kan moeiteloos overstappen van mySQL naar iedere andere database, alles wat ik hoef te veranderen is het DB object. Jij moet je code herschrijven)
code:
1
2
3
4
5
6
7
8
9
10
$DB->query( 'SELECT * FROM users WHERE active = 1' );
if ( $DB->has_rows() )
{
    while ( $DB->next_record() )
    {
        echo 'Gebruiker: ' . $DB->f( 'naam' );
    }
}
else
    echo 'Geen actieve gebruikers';

Dit was maar een willekeurig voorbeeld....

Zelf gebruik ik dan nog eens templates (www.tinybutstrong.com (beter dan Smarty)) maar daar moet je je pas aan wagen als je wat verder bent met PHP

[ Voor 73% gewijzigd door Verwijderd op 02-06-2004 15:09 ]


Acties:
  • 0 Henk 'm!

  • Morax
  • Registratie: Mei 2002
  • Laatst online: 20:32
Ligt het nu aan mij, of is mijn programmeerstijl nu zodanig anders dat ik het als een fout zie:
PHP:
1
$sql = "SELECT username, password, Alliance, Account_type, Activated FROM user_login WHERE username = '$_POST['Username']";


Moet dat niet
PHP:
1
WHERE username = '". $_POST['Username'] ."';


zijn?

What do you mean I have no life? I am a gamer, I got millions!


Acties:
  • 0 Henk 'm!

Verwijderd

Je hebt gelijk, dat mag niet, dit mag echter wel:
code:
1
2
3
4
5
<?
$sTest['test'] = 'geslaagd';
$test          = "testert '{$sTest['test']}'";
echo $test;
?>
Maar een paar opmerkingen hierover...
-Gebruik zo veel mogelijk single-quotes; deze zijn sneller
-Dubbele-quotes laten variabelen toe en verwerken deze, single quotes behandelen de inhoud als een letterlijke string
-Gebruik altijd accolades, dit voorkomt een hoop gezeik in dit soort strings. Zoals je kon zien
-Niet array variabelen gaan zonder accolades meestal goed, maar gebruik voor de zekerheid accolades

[ Voor 92% gewijzigd door Verwijderd op 02-06-2004 13:25 ]


Acties:
  • 0 Henk 'm!

  • D-Raven
  • Registratie: November 2001
  • Laatst online: 10-09 20:32
EDIT: Laat maar werkt al :Y)

Dat van dat md5 encryptie was ik al van plan. maar voorlopig is het toch maar om te testen. EN ik wil dan mn wachtwoorden nog even leesbaarhouden in mn database. Maar later ga ik dat aanpassen.
Even md5 ervoor zetten waar nodig is zo gedaan toch ? :)

[ Voor 95% gewijzigd door D-Raven op 02-06-2004 20:01 ]


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Verwijderd schreef op 02 juni 2004 @ 13:18:
-Gebruik altijd accolades, dit voorkomt een hoop gezeik in dit soort strings. Zoals je kon zien
-Niet array variabelen gaan zonder accolades meestal goed, maar gebruik voor de zekerheid accolades
Dat is nogal overkill lijkt me... Dat heeft evenveel nut als checken of true gelijk is aan true... 8)7

Het is waar dat er dan minder fout kan gaan maar het is veel lastiger coden en leest alleen maar lastiger. Je moet gewoon zelf consequent zijn. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • D-Raven
  • Registratie: November 2001
  • Laatst online: 10-09 20:32
Ok FIJN.
<form method="POST" action="$PHP_SELF"> (ismaar voorbeeld check code paar posts trug voor werkelijke code) werkt niet goed. Hij geeft de argumenten niet door. GRMBL.
Dan maar met een verwijzing naar een apart verwerkings script.

[ Voor 14% gewijzigd door D-Raven op 02-06-2004 20:28 ]


Acties:
  • 0 Henk 'm!

  • phYzar
  • Registratie: November 2001
  • Laatst online: 22:33
D-Raven schreef op 02 juni 2004 @ 20:27:
Ok FIJN.
<form method="POST" action="$PHP_SELF"> (ismaar voorbeeld check code paar posts trug voor werkelijke code) werkt niet goed. Hij geeft de argumenten niet door. GRMBL.
Dan maar met een verwijzing naar een apart verwerkings script.
action="$_SERVER['PHP_SELF']"

[ Voor 9% gewijzigd door phYzar op 02-06-2004 20:52 ]


Acties:
  • 0 Henk 'm!

  • D-Raven
  • Registratie: November 2001
  • Laatst online: 10-09 20:32
was eral achter :) thx

Acties:
  • 0 Henk 'm!

Verwijderd

NMe84 schreef op 02 juni 2004 @ 20:11:
[...]
Dat is nogal overkill lijkt me... Dat heeft evenveel nut als checken of true gelijk is aan true... 8)7

Het is waar dat er dan minder fout kan gaan maar het is veel lastiger coden en leest alleen maar lastiger. Je moet gewoon zelf consequent zijn. :)
En geven die accolades niet veel duidelijker aan waar je variabelen zitten.

Maar goed, ik gebruik dit zelf zelden, zoals gezegd werk ik met een template engine en normaal gesproken meertalig waardoor ik nooit direct strings hoef te typen.

Maar voor zover ik weet gaat het sneller met accolades voor zover mensen dat getest hebben, en dat is een reden om het te gebruiken....
D-Raven schreef op 02 juni 2004 @ 19:50:
EDIT: Laat maar werkt al :Y)

Dat van dat md5 encryptie was ik al van plan. maar voorlopig is het toch maar om te testen. EN ik wil dan mn wachtwoorden nog even leesbaarhouden in mn database. Maar later ga ik dat aanpassen.
Even md5 ervoor zetten waar nodig is zo gedaan toch ? :)
Ja, en de wachtwoorden in je db veranderen of alle gebruikers verwijderen...
Pagina: 1