Cookies en het stelen ervan

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pong Zor

Pong Zor

01/10/2010 22:04:51
Quote Anchor link
Hallo

Ik ben bezig met een onthoud mij functie voor mijn website.
Nu heb ik de code als volgt:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
                    if($remember_me == '1'){
                        setcookie("email", $email, $hour);                 
                        setcookie("password", $password, $hour);     
                    }    


Daar maak ik dus de cookie

Vervolgens lees ik die uit op de volgende manier:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    if(!empty($_COOKIE['email']) && !empty($_COOKIE['password'])){
        // Gegevens uit database ophalen.
        $sql = "SELECT * FROM users WHERE email='" . $_COOKIE['email'] . "' " . "AND password='" . $_COOKIE['password'] . "' AND activated='1'";            
        $result = mysql_query($sql, $thecode) or die ('Kan gebruikersnaam niet controleren...<br />Misschien is er een probleem met de database...');

        if (($row = mysql_fetch_array($result)) == 0){
            $error_wrong_cookie = 'true';
            $error = 'true';
        }
        
        else{
            $_SESSION['id'] = $row['id'];
            $_SESSION['email'] = stripslashes($row['email']);
            $_SESSION['password'] = stripslashes($row['password']);
            $_SESSION['logged_in'] = 'true';
        }
        
    }


Als de cookie email en wachtwoord niet leeg zijn kijk dan of die voorkomen in de database.

Komt het niet overeen om 1 of andere reden dan krijg je een error anders worden de sessie gevuld.

Het werkt opzich wel alleen vraag ik me af of de implementatie wel goed is aangezien ik dit nog nooit gedaan heb. Tevens vraag ik mij ook af of de cookie niet gestolen kan worden en indien dat het geval is er zomaar ingelogd kan worden?

Ik kan me voorstellen als iemand een cookie steelt met de goede username en password en deze bij zichzelf weet te plaatsen hij/ zij zo kan inloggen als deze gebruiker met bijbehorende rechten?
 
PHP hulp

PHP hulp

22/12/2024 07:20:30
 
Noppes Homeland

Noppes Homeland

01/10/2010 22:29:37
Quote Anchor link
Je dient geen wachtwoorden op te slaan in een cookie

GVD: empty is een zinlose functie die je uit je code dient te verbannen, pas correcte validatie toe!
-> ctype_
-> preg_
-> != '' == ''

een onthoud coekie heeft 1 of meerdere waarden waarmee te zamen met 1 of meerdere waarden opgelsagen bij de user een hash is opgeslagen

voorbeeld:
cookie:
- username
- email

database
- lastactive
- registratiedatum

de hash sla je dan op in database tabel bij de user

voor de rest mag je het zelf uitzoeken / uitwerken
Gewijzigd op 01/10/2010 22:36:47 door Noppes Homeland
 
Niels K

Niels K

01/10/2010 22:40:41
Quote Anchor link
@Noppes.

Waarom een persoon op zo'n manier aanvallen omdat hij alleen empty gebruikt?
 
Pong Zor

Pong Zor

01/10/2010 22:54:40
Quote Anchor link
@ Noppes

empty() is hetzelfde als == ''. Hoezo moet je dat opeens verbannen. Ik sla ook geen wachtwoord op in een cookie, maar de md5 waarde van het wachtwoord.

Ik vroeg me alleen af, stel iemand steelt deze cookie op 1 of andere manier met emailadres en de md5 waarde van het wachtwoord. Kan deze gebruiker dan inloggen?

Maar dit wist je natuurlijk al aangezien je mijn code bekeken hebt
 
Noppes Homeland

Noppes Homeland

01/10/2010 22:58:51
Quote Anchor link
@Dennis, ik denk dat je dan nog eens heel goed http://www.php.net/empty moet doornemen.

@Niels, dat is 1 van mijn missies...... ik blijf er net zo lang op hameren opdat ze het lef niet meer hebben deze zinlose functie te gebruiken
 
Niels K

Niels K

01/10/2010 22:59:37
Quote Anchor link
Het is zinloos dat weet ik ook. Maar om daar nu altijd GVD bij te zeggen vind ik wat te veel van het goede;)
 
Pong Zor

Pong Zor

01/10/2010 23:13:11
Quote Anchor link
@ Noppes

Als jij dan antwoord wil geven of ze iets kunnen met een wachtwoord md5hash + email dan ben ik weer helemaal blij.

Wil alleen weten of het zo veilig genoeg is en of er geen kans is dat iemand een cookie steelt en vervolgens kan inloggen.

Toevoeging op 01/10/2010 23:15:03:

@ Noppes,

Ik heb het bekeken, maar ik begrijp het probleem niet
empty() controleert of een waarde leeg is en == '' toch ook en dat is toch ook wat je wilt bereiken of zit ik helemaal mis?

Waarom zou je empty() nooit meer mogen gebruiken?
 
Noppes Homeland

Noppes Homeland

01/10/2010 23:17:09
Quote Anchor link
sessie/cookies zijn altijd te onderscheppen en te misbruiken
en zoals je het gepost hebt is het niet veilig.

Toevoeging op 01/10/2010 23:18:33:

@Dennis, dan moet je nog een keer goed lezen http://www.php.net/empty

emtpy() !== ''
 
Pong Zor

Pong Zor

01/10/2010 23:24:32
Quote Anchor link
@ Noppes het zou ook helpen als je zou zeggen hoe het dan wel veilig zou kunnen zijn of ligt dit puur eraan omdat ik empty() gebruik en niet == '' ?
 
Karizma Yusuf

Karizma Yusuf

02/10/2010 03:41:05
Quote Anchor link
Een artikel voor het beveiligen van je website, misschien ben je er wel in geinteresseerd. session hijacking

Ik zou ook nog dit regeltje toepassen, tijdens het starten van een session. Maakt het wat ingewikkelder om te sidejacken.

session regenerate

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
Gewijzigd op 02/10/2010 03:41:34 door Karizma Yusuf
 
Noppes Homeland

Noppes Homeland

02/10/2010 09:37:53
Quote Anchor link
@Dennis, het niet moeten gebruiken van de functie empty staat helemaal los van of het veilig is of niet. Het gaat erom dat empty niet de betekenis heeft die je er in eerste instantie aan toekend.

Het gaat erom dat je een onbekende factor moet hebben voor de buitenwereled om redelijk veilig met cookies/session te werken.

Zie het geposte dd: 01/10/2010 22:29:37
 
Lars Groot

Lars Groot

02/10/2010 13:15:32
Quote Anchor link
Om te controleren of een variabele leeg is gebruik je GEEN empty(); maar isset();
Dan word het dus zo:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php
if(!isset($var)){
// $var is leeg / niet aangeroepen
}
if(isset($var)){
// $var bevat iets, en is dus niet leeg.
}
?>
 

02/10/2010 14:05:07
Quote Anchor link
Lars Groot op 02/10/2010 13:15:32:
Om te controleren of een variabele leeg is gebruik je GEEN empty(); maar isset();
Dan word het dus zo:
(...)


Nee, zie isset.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
$var
= '';
var_dump(isset($var));
/* Levert:
bool(true)
*/

?>

Dat klopt dus niet.
Zoals je op php.net kan lezen over empty levert empty true als de variabele:
  • "" (an empty string)
  • 0 (0 as an integer)
  • "0" (0 as a string)
  • NULL
  • FALSE
  • array() (an empty array)
  • var $var; (a variable declared, but without a value in a class)

Dus als je wilt dat een variabele die waardes niet mag hebben kan je gerust met empty controleren. Als je dus dan met preg_* en != '' en weet ik veel wat ga prutsen ben je verkeerd bezig, kies dan gewoon voor empty.
Gewijzigd op 02/10/2010 14:07:30 door
 
Noppes Homeland

Noppes Homeland

02/10/2010 15:25:16
Quote Anchor link
Quote:
Dus als je wilt dat een variabele die waardes niet mag hebben kan je gerust met empty controleren. Als je dus dan met preg_* en != '' en weet ik veel wat ga prutsen ben je verkeerd bezig, kies dan gewoon voor empty


Karl, gezien het feit dat je nooit weet welke waarde je door empty haalt gaat jouw verhaaltje dus niet op.

Dus geen empty gebruiken maar gewoon controleren met de juist functies of http://php.net/manual/en/language.operators.comparison.php
 

02/10/2010 15:52:31
Quote Anchor link
Noppes Homeland op 02/10/2010 15:25:16:
Quote:
Dus als je wilt dat een variabele die waardes niet mag hebben kan je gerust met empty controleren. Als je dus dan met preg_* en != '' en weet ik veel wat ga prutsen ben je verkeerd bezig, kies dan gewoon voor empty


Karl, gezien het feit dat je nooit weet welke waarde je door empty haalt gaat jouw verhaaltje dus niet op.
(...)


Jij probeert java in php te krijgen? Jij probeert type save te werken?
Wat mij betreft kan je gewoon empty gebruiken als je wilt dat een variabele dus wel of niet een van de boven genoemde zaken is (dus ook 0 en "0"). Die nul is de enige 'probleem-veroorzaker', dus als je die ook gewoon meerekent, is er geen probleem meer.
Gewijzigd op 02/10/2010 15:53:35 door
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.