[PHP] Loginscriptje werkt niet lekker

Pagina: 1
Acties:
  • 149 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • _eXistenZ_
  • Registratie: Februari 2004
  • Laatst online: 23-05 20:48
Ik heb een login scriptje dat ik al een poosje online gebruik, en wat goed werkt.

Het werkt alsvolgt:

========
functions.php
========

PHP:
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
function logincheck() {
    session_start();
    if(!isset($_SESSION['userid'])) {
        if(isset($_COOKIE['nickname']) && isset($_COOKIE['password'])) {
            $nickname = addslashes($_COOKIE['nickname']);
            $password = addslashes($_COOKIE['password']);
            login($nickname, $password);
        } else {
            header('Location: login.php');
        }
    }
}

function login($nickname, $password) {
    session_start();
    global $db;
    if ($row = $db->query_first("SELECT * FROM `users` WHERE `nickname` = '{$nickname}' AND `password` = '{$password}' LIMIT 1")) {
        setcookie('nickname', $nickname, time() + 31536000);
        setcookie('password', $password, time() + 31536000);
        $_SESSION['userid'] = $row['id_user'];
        $_SESSION['template'] = $row['template_user'];
        header('Location: index.php');
    } else {
        setcookie('nickname', $nickname, time() - 3600);
        setcookie('password', $password, time() - 3600);
        header('Location: login.php');
    }
}

function logout(){
    session_start();
    setcookie('nickname', '', time()-3600);
    setcookie('password', '', time()-3600);
    $_SESSION['userid'] = false;
    $_SESSION['template'] = false;
    session_destroy();
}


========
login.php
========
Formpje weergeven, daarna de functie login($nickname, $password) aanroepen.

========
index.php, eigenlijk alle andere .php files
========
Eerst logincheck() aanroepen, daarna de pagina zelf weergeven.

Online werkt dit. Offline op mijn testserver ook.

Zodra ik echter de login.php en index.php kopieer naar een andere map en er een andere database aan hang, krijg ik in Firefox dit bericht zodra ik inlog:
Firefox heeft ontdekt dat deze pagina door wordt gelinkt op een manier die niet eindigd.
Dit kan komen door het uitschakelen van cookies.

IE doet dan helemaal niks meer, daar is het IE voor natuurlijk :+

Ik weet niet hoe dit nu komt, ben er al een paar uur op aan het debuggen, maar wat ik ook doe, ik krijg m niet goed aan de praat...

[ Voor 19% gewijzigd door _eXistenZ_ op 21-06-2006 13:29 ]

There is no replacement for displacement!


Acties:
  • 0 Henk 'm!

  • BasieP
  • Registratie: Oktober 2000
  • Laatst online: 22-07-2024
even zonder inhoudelijk naar je code te kijken:
die foutmelding die je krijgt komt voro wanneer je bijv een pagina maakt die een header verstuurd met een redicrect naar zichzelf. zor krijg je een soort loop van headerredirections

verder heb ik zoiets ook wel eens gehad, toen ik mijn (werkende) script op een andere server zette
toen bleek dat de $_SESSION VAR die ik gebruikte gereserveerd was oid.
heb toen ipv 'userid' 'mijnsite_userid' gebruikt, en toen werkte het weer




trouwens een heel ander verhaal: de manier waarop jij nu je script hebt werken is de meest ranzige die er is.
je wilt NOOIT van ze leven een wachtwoord in een cookie hebben staan.
sterker nog, ik zou niet eens me wachtwoord plain text willen verzenden over internet. Toch doe jij dit nu allebij wel.
Enorm onveilig en slecht geregelt. Dit kan veel netter door client side je password te md5'en oid, en dan te versturen. Verder check je dan serverside de hash, met de HASH in de database (dus niet het password, die staat niet in de DB) en sla je een soort van sessie-hash op in je cookie.
die hash sla je ook op in de DB, zodat je kan zien welke hash+user ingelogt is

[ Voor 43% gewijzigd door BasieP op 21-06-2006 13:31 ]

This message was sent on 100% recyclable electrons.


Acties:
  • 0 Henk 'm!

  • Cyphax
  • Registratie: November 2000
  • Laatst online: 11-06 20:52

Cyphax

Moderator LNX
Je loginpagina redirect steeds naar zichzelf. Ik gok dat het fout gaat bij regel 17 waarna 'ie dus naar login.php redirect. En die roept de loginfunctie aan, gaat mis, enzovoorts.

Saved by the buoyancy of citrus


Acties:
  • 0 Henk 'm!

  • _eXistenZ_
  • Registratie: Februari 2004
  • Laatst online: 23-05 20:48
Nee zodra ie redirect, wordt er geen POST-variabele meer meegestuurd, waar ik op check wattie moet doen, en dus zal je de form weer zien. Dit kan de lus niet veroorzaken.

@ BasieP

Weet ik, zo wordt et ook, maar mijn script en de bijbehorende site is nog under construction.
Dit is gewoon makkelijk voor mij als iemand zijn code vergeet in de tussentijd, dan kan ik snel even de database induiken en iemand zjin code geven. Anyway, dit zou ook gewoon moeten werken natuurlijk.

[ Voor 85% gewijzigd door _eXistenZ_ op 21-06-2006 13:46 ]

There is no replacement for displacement!


Acties:
  • 0 Henk 'm!

  • Cyphax
  • Registratie: November 2000
  • Laatst online: 11-06 20:52

Cyphax

Moderator LNX
Je zegt in je startpost:
Formpje weergeven, daarna de functie login($nickname, $password) aanroepen.
Dat zou betekenen een oneindige loop van login()
Maar je zegt ook dat je cookies hebt uitgeschakeld en dan redirect logincheck naar login.php en gaat hetzelfde verhaal ongeveer op maar dan niet van login(), maar van logincheck()

[ Voor 8% gewijzigd door Cyphax op 21-06-2006 13:36 ]

Saved by the buoyancy of citrus


Acties:
  • 0 Henk 'm!

  • BasieP
  • Registratie: Oktober 2000
  • Laatst online: 22-07-2024
eXistenZ_NL schreef op woensdag 21 juni 2006 @ 13:31:
Nee zodra ie redirect, wordt er geen POST-variabele meer meegestuurd, waar ik op check wattie moet doen, en dus zal je de form weer zien. Dit kan de lus niet veroorzaken.
wel als je $_SESSION['userid'] opeens weer leeg is.. poep die vars eens uit bovenaan elke file
@ BasieP

Weet ik, zo wordt et ook, maar mijn script en de bijbehorende site is nog under construction.
Dit is gewoon makkelijk voor mij als iemand zijn code vergeet in de tussentijd, dan kan ik snel even de database induiken en iemand zjin code geven. Anyway, dit zou ook gewoon moeten werken natuurlijk.
das voor mij al genoeg reden om nooit te reggen op jouw site.. ik denk zelfs dat je er voor aangeklaagt zou kunnen worden btw ;)
(wegens het opwekken van de illusie dat niemand achter het wachtwoord kan komen, terwijl het plain tekst in de DB staat)

[ Voor 8% gewijzigd door BasieP op 21-06-2006 13:37 ]

This message was sent on 100% recyclable electrons.


Acties:
  • 0 Henk 'm!

  • Mysteryman
  • Registratie: Februari 2001
  • Laatst online: 22:35

Mysteryman

kan jij wat ik kan...

ik ben benieuwd wat de volgorde is van de functies hoe je ze aanspreekt... want zoals het er nu staat gebeurd er in principe niets...

tevens ben ik het eens met BasieP zoals het er nu uit ziet; is het onveilig! MD5 de wachtwoorden want op deze manier kan er te snel, te veel misbruik gemaakt van je site...

Everybody happy??? I soon change that here we go...


Acties:
  • 0 Henk 'm!

  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Je kunt natuurlijk ook even een logfile maken en daar bij elke header('Location:...') aanroep een aparte waarde in wegschrijven en vervolgens analyseren in welke loop hij terecht komt. Je zou dan namelijk een herhalende reeks moeten zien.

Acties:
  • 0 Henk 'm!

  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
BasieP schreef op woensdag 21 juni 2006 @ 13:36:
[...]
ik denk zelfs dat je er voor aangeklaagt zou kunnen worden btw ;)
(wegens het opwekken van de illusie dat niemand achter het wachtwoord kan komen, terwijl het plain tekst in de DB staat)
Dat is volgens mij alleen aan de orde wanneer de privacywetgeving wordt overtreden. Dus wanneer derde partijen ineens over jouw gegevens beschikken. Er is (voor zover bij mij bekend) geen wet die zegt dat je een wachtwoord van iemand encrypted op moet slaan.

Dit overigens los van het feit dat ik het wel met je eens ben dat je de ethische verantwoordelijkheid hebt om zorgvuldig met mensen hun gegevens om te gaan.

Acties:
  • 0 Henk 'm!

  • _eXistenZ_
  • Registratie: Februari 2004
  • Laatst online: 23-05 20:48
OPGELOST

op regel 20 in het script stop ik id_user in de session, maar die bestond niet in mijn niewue DB.
Daarom bleef die var leeg, en logde ik weer uit, en weer in en weer uit enzovoort. 8)7

Ktnxbye

@ moraalridders:

Niet zeuren het is voor een vriendengroepje van mij. Die klagen mij nog niet zo snel aan denk ik :7

There is no replacement for displacement!


Acties:
  • 0 Henk 'm!

  • DDemolition
  • Registratie: Augustus 2003
  • Laatst online: 30-09-2024

DDemolition

slopen is mijn lust en leven

eXistenZ_NL schreef op woensdag 21 juni 2006 @ 13:47:
Niet zeuren het is voor een vriendengroepje van mij. Die klagen mij nog niet zo snel aan denk ik :7
Dan is het nog niet echt netjes. Er zijn genoeg vrienden waarvan ik m'n password niet mee zal delen.
PHP:
1
2
3
$MD5Pass = md5($_POST['Wachtwoord']);

$SQL = "SELECT * FROM gebruikers WHERE password = '$MD5Pass' AND ID = '$ID'";


Heb je meteen geen last van hoofdletter gevoeligheid, maarja, je moet zelf weten 8)

[ Voor 13% gewijzigd door DDemolition op 21-06-2006 14:33 ]

Specs: Server, WS boven, WS beneden


Acties:
  • 0 Henk 'm!

Anoniem: 64721

DDemolition schreef op woensdag 21 juni 2006 @ 14:31:
[...]

Dan is het nog niet echt netjes. Er zijn genoeg vrienden waarvan ik m'n password niet mee zal delen.
PHP:
1
2
3
$MD5Pass = md5($_POST['Wachtwoord']);

$SQL = "SELECT * FROM gebruikers WHERE password = '$MD5Pass' AND ID = '$ID'";


Heb je meteen geen last van hoofdletter gevoeligheid, maarja, je moet zelf weten 8)
Kan zelfs nog makkelijker:

PHP:
1
$sql = "SELECT * FROM `gebruikers` WHERE `password`=MD5('$password') AND `id`='$id'";

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 11-06 21:17

Janoz

Moderator Devschuur®

!litemod

Het meest kwalijke vind ik persoonlijk nog dat de gebruikersnaam en wachtwoord gewoon in een cookie opgeslagen wordt. Dat is nog een veel groter security risico. Een plain wachtwoord in de DB en over de lijn is lastig te onderscheppen of in te zien. Hiervoor moet je de verbinding overnemen of toegang krijgen tot de db. Een wachtwoord in een cookie kan ik al achterhalen zodra ik ergens in een minuscuul stukje javascript op je site krijg! (via een reactie bijvoorbeeld).

Het is dus niet enkel of ik jou kan vertrouwen, maar of ik je scripting kwaliteiten en de rest van internet kan vertrouwen. Over de eerste van deze 2 zal ik mijn mond houden, maar over de tweede kunnen we het allemaal eens zijn.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • BasieP
  • Registratie: Oktober 2000
  • Laatst online: 22-07-2024
Anoniem: 64721 schreef op woensdag 21 juni 2006 @ 15:16:
[...]


Kan zelfs nog makkelijker:

PHP:
1
$sql = "SELECT * FROM `gebruikers` WHERE `password`=MD5('$password') AND `id`='$id'";
en dat werkt niet schat ;) als je het zo nodig beter wil doen, doe het dan wel goed :P

@TS:
wat is url van je site dan stop ik hem in me blocked list

This message was sent on 100% recyclable electrons.


Acties:
  • 0 Henk 'm!

Anoniem: 175386

Anoniem: 64721 schreef op woensdag 21 juni 2006 @ 15:16:
Kan zelfs nog makkelijker:

PHP:
1
$sql = "SELECT * FROM `gebruikers` WHERE `password`=MD5('$password') AND `id`='$id'";
Zeker kan dat. Nadeel is wel dat het wachtwoord dan in plain text van het php-script naar de database reist. (Correct me if I'm wrong.) Normaal gesproken is dat niet echt een probleem, maar als de database op een server aan de andere kant van de planeet draait is het weer een extra risico.

Acties:
  • 0 Henk 'm!

Anoniem: 64721

BasieP schreef op woensdag 21 juni 2006 @ 15:42:
[...]
en dat werkt niet schat ;) als je het zo nodig beter wil doen, doe het dan wel goed :P
Hoezo werkt niet?
Ik gebruik dit soort query namelijk altijd bij mijn inlog routine!
MD5(str)

Calculates an MD5 128-bit checksum for the string. The value is returned as a binary string of 32 hex digits, or NULL if the argument was NULL. The return value can, for example, be used as a hash key.

mysql> SELECT MD5('testing');
-> 'ae2b1fca515949e5d54fb22b8ed95575'

This is the “RSA Data Security, Inc. MD5 Message-Digest Algorithm.”

If you want to convert the value to uppercase, see the description of binary string conversion given in the entry for the BINARY operator in Section 12.8, “Cast Functions and Operators”.

See the note regarding the MD5 algorithm at the beginning this section.

MD5() was added in MySQL 3.23.2
@Weird Hobbes: Daar heb je gelijk in, dit kun je beter niet toepassen als de sqlserver niet localhost is.

[ Voor 11% gewijzigd door Anoniem: 64721 op 21-06-2006 15:55 ]

Pagina: 1