GET request
Het gaat om de volgende site: www.jackmaessen.nl
Je kunt inloggen met username:test en password: pass
Eenmaal ingelogd, klik in de navigatie op "My account"
Kijk vervolgens in de url en zie dat de username in de url wordt aangeroepen
(http://www.jackmaessen.nl/userinfo.php?user=test)
er is dus nu vrij gemakkelijk de info van andere leden te raadplegen door bv. in de url "test" te vervangen door "piet" of een andere naam. Dit mag natuurlijk nooit gebeuren.
Het script dat de info parsed ziet er als volgt uit:
Code (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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
<!-- MY ACCOUNT INFO -->
<?php
/**
* UserInfo.php
*
* This page is for users to view their account information
* with a link added for them to edit the information.
*
* Updated by: The Angry Frog
* Last Updated: October 26, 2011
*/
if (!isset($_GET['user'])) {
header("Location: ".$config['WEB_ROOT'].$config['home_page']);
}
?>
<?php
/* Requested Username error checking */
$req_user = trim($_GET['user']);
if(!$req_user || strlen($req_user) == 0 ||
!preg_match("/^[a-z0-9]([0-9a-z_-\s])+$/i", $req_user) ||
!$database->usernameTaken($req_user)){
die("Username not registered");
}
/* Logged in user viewing own account */
if(strcmp($session->username,$req_user) == 0){
echo "<h6><br>My Account</h6>";
}
/* Visitor not viewing own account */
else{
echo "<h6>User Info</h6>";
}
/* Display requested user information - add/delete as applicable */
$req_user_info = $database->getUserInfo($req_user);
/* Username */
echo "<b> Username: ".$req_user_info['username']."</b><br />";
/* Email */
echo "<b> Email:</b> ".$req_user_info['email']."<br />";
/**
* Note: when you add your own fields to the users table
* to hold more information, like homepage, location, etc.
* they can be easily accessed by the user info array.
* $session->user_info['location']; (for logged in users)
* $req_user_info['location']; (for any user)
*/
/* If logged in user viewing own account, give link to edit */
if(strcmp($session->username,$req_user) == 0){
echo '';
}
/* Link back to main */
/*echo "<br>Back To [<a href='".$config['WEB_ROOT'].$config['home_page']."'>Main</a>]<br>";*/
?>
<!-- EINDE MY ACCOUNT INFO -->
<?php
/**
* UserInfo.php
*
* This page is for users to view their account information
* with a link added for them to edit the information.
*
* Updated by: The Angry Frog
* Last Updated: October 26, 2011
*/
if (!isset($_GET['user'])) {
header("Location: ".$config['WEB_ROOT'].$config['home_page']);
}
?>
<?php
/* Requested Username error checking */
$req_user = trim($_GET['user']);
if(!$req_user || strlen($req_user) == 0 ||
!preg_match("/^[a-z0-9]([0-9a-z_-\s])+$/i", $req_user) ||
!$database->usernameTaken($req_user)){
die("Username not registered");
}
/* Logged in user viewing own account */
if(strcmp($session->username,$req_user) == 0){
echo "<h6><br>My Account</h6>";
}
/* Visitor not viewing own account */
else{
echo "<h6>User Info</h6>";
}
/* Display requested user information - add/delete as applicable */
$req_user_info = $database->getUserInfo($req_user);
/* Username */
echo "<b> Username: ".$req_user_info['username']."</b><br />";
/* Email */
echo "<b> Email:</b> ".$req_user_info['email']."<br />";
/**
* Note: when you add your own fields to the users table
* to hold more information, like homepage, location, etc.
* they can be easily accessed by the user info array.
* $session->user_info['location']; (for logged in users)
* $req_user_info['location']; (for any user)
*/
/* If logged in user viewing own account, give link to edit */
if(strcmp($session->username,$req_user) == 0){
echo '';
}
/* Link back to main */
/*echo "<br>Back To [<a href='".$config['WEB_ROOT'].$config['home_page']."'>Main</a>]<br>";*/
?>
<!-- EINDE MY ACCOUNT INFO -->
Hoe kan ik dit beveiligen?
- Je logt in, nadat alles is gecontroleerd maak je een random hash aan (met bijv. uniqid + een sha functie in een gegeven van de gebruiker), deze sla je op in de database en in een sessie.
- Op elke volgende pagina kijk je of deze hash nog steeds hetzelfde is (door de sessie met een db te controleren), zo ja => gebruiker ingelogd, zo nee => gebruiker uitgelogd.
Juist geen $_GET parameter meegeven. In je inlogsessie moet toch al bekend zijn wie je bent?
Wouter J op 24/12/2012 20:20:23:
- Op elke volgende pagina kijk je of deze hash nog steeds hetzelfde is (door de sessie met een db te controleren), zo ja => gebruiker ingelogd, zo nee => gebruiker uitgelogd.
Wouter, maak je dan bij iedere pagina een database request?
Je kunt ook in de sessie opslaan dat iemand is ingelogd ($logged_in=true). Of is dat qua veiligheid te risicovol?
Code (php)
Ik weet niet of dat handig is, maar in ieder geval krijgt u een alert met het bericht "This is not your profile!" en wordt u direct doorgestuurd naar uw eigen profiel. ;)
Als usernaam variable gelijk is aan requested user, toon de info; anders ga naar userinfo.php waarna de cyclus opnieuw doorlopen wordt en died bij "requested username error checking"
Code (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
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
<?php
/* Requested Username error checking */
$req_user = trim($_GET['user']);
if(!$req_user || strlen($req_user) == 0 ||
!preg_match("/^[a-z0-9]([0-9a-z_-\s])+$/i", $req_user) ||
!$database->usernameTaken($req_user)){
die("<br /></br />Username not registered or you don't have permission to view this information");
}
/* Logged in user viewing own account */
if(strcmp($session->username,$req_user) == 0){
echo "<h6><br>My Account</h6>";
}
/* Visitor not viewing own account */
else{
header('Location: userinfo.php');
/*echo "<h6><br /><br />User Info</h6>";*/
}
/* Display requested user information - add/delete as applicable */
$req_user_info = $database->getUserInfo($req_user);
/* Username */
echo "<b> Username: ".$req_user_info['username']."</b><br />";
/* Email */
echo "<b> Email:</b> ".$req_user_info['email']."<br />";
?>
/* Requested Username error checking */
$req_user = trim($_GET['user']);
if(!$req_user || strlen($req_user) == 0 ||
!preg_match("/^[a-z0-9]([0-9a-z_-\s])+$/i", $req_user) ||
!$database->usernameTaken($req_user)){
die("<br /></br />Username not registered or you don't have permission to view this information");
}
/* Logged in user viewing own account */
if(strcmp($session->username,$req_user) == 0){
echo "<h6><br>My Account</h6>";
}
/* Visitor not viewing own account */
else{
header('Location: userinfo.php');
/*echo "<h6><br /><br />User Info</h6>";*/
}
/* Display requested user information - add/delete as applicable */
$req_user_info = $database->getUserInfo($req_user);
/* Username */
echo "<b> Username: ".$req_user_info['username']."</b><br />";
/* Email */
echo "<b> Email:</b> ".$req_user_info['email']."<br />";
?>
Gewijzigd op 24/12/2012 23:31:52 door jack maessen
Quote:
Wouter, maak je dan bij iedere pagina een database request?
Dat doe je in principe toch al.
Quote:
Je kunt ook in de sessie opslaan dat iemand is ingelogd ($logged_in=true). Of is dat qua veiligheid te risicovol?
En dan pas ik lokaal even die sessie aan zodat ik al ben ingelogd terwijl ik niks heb ingevoerd? Wat je natuurlijk eerst doet is kijken of die sessie bestaat, zo niet dan hoef je niet verder te gaan met de DB, zoja dan kijk je of de hash in de DB nog steeds geldig is, of dat hij bijv. zelf een random hash heeft ingevuld of misschien wel gekopieerd van een andere gebruiker van die website.
Wouter J op 24/12/2012 23:48:19:
Dat doe je in principe toch al.
Quote:
Wouter, maak je dan bij iedere pagina een database request?
Dat doe je in principe toch al.
Waarom zou je dat doen?
Wouter J op 24/12/2012 23:48:19:
En dan pas ik lokaal even die sessie aan...
Quote:
Je kunt ook in de sessie opslaan dat iemand is ingelogd ($logged_in=true). Of is dat qua veiligheid te risicovol?
En dan pas ik lokaal even die sessie aan...
Lokaal een sessie aanpassen...? Hoe doe je dat dan?????
Marco King op 24/12/2012 21:05:58:
Ik weet niet of dat handig is, maar in ieder geval krijgt u een alert met het bericht "This is not your profile!" en wordt u direct doorgestuurd naar uw eigen profiel. ;)
Code (php)
Ik weet niet of dat handig is, maar in ieder geval krijgt u een alert met het bericht "This is not your profile!" en wordt u direct doorgestuurd naar uw eigen profiel. ;)
Dit kan natuurlijk niet. Bij de header krijg je dan de foutmelding 'Headers already sent'. Als je een redirect doet kan je niet ook nog gewone output versturen.
Ozzie PHP op 24/12/2012 23:52:56:
Waarom zou je dat doen?
Wouter J op 24/12/2012 23:48:19:
Dat doe je in principe toch al.
Quote:
Wouter, maak je dan bij iedere pagina een database request?
Dat doe je in principe toch al.
Waarom zou je dat doen?
Om te controleren of je nog wel werkelijk de user bent? Tokens opslaan in je db heeft ook heel veel extra handige features:
- je kan leden aan jouw kant uitloggen
- leden kunnen eerdere sessies aan hun kant uitloggen
- je kan makkelijk online leden ophalen
Geloof me, zo belastend is het niet.
- Raoul - op 25/12/2012 09:48:28:
Geloof me, zo belastend is het niet.
Dat was/is dus ook een beetje mijn vraag. Ik snap wel dat het veiliger is, maar vraag me inderdaad ook wel af of het belastend is.
Maar Wouter heeft het over lokaal een sessie aanpassen. Ik snap niet wat hij daarmee bedoelt.
Ik heb de html code van de footer in bestand footer.php opgeslagen en geinclude na de "die" echo, maar hij laadt hem niet.
Code (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
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
<?php
/* Requested Username error checking */
$req_user = trim($_GET['user']);
if(!$req_user || strlen($req_user) == 0 ||
!preg_match("/^[a-z0-9]([0-9a-z_-\s])+$/i", $req_user) ||
!$database->usernameTaken($req_user)){
die("<br /></br />Username not registered or you don't have permission to view this information");
}
include("footer.php");
/* Logged in user viewing own account */
if(strcmp($session->username,$req_user) == 0){
echo "<h6><br>My Account</h6>";
}
/* Visitor not viewing own account */
else{
header('Location: userinfo.php');
/*echo "<h6><br /><br />User Info</h6>";*/
}
>?
[/code]
wat gaat er fout?
/* Requested Username error checking */
$req_user = trim($_GET['user']);
if(!$req_user || strlen($req_user) == 0 ||
!preg_match("/^[a-z0-9]([0-9a-z_-\s])+$/i", $req_user) ||
!$database->usernameTaken($req_user)){
die("<br /></br />Username not registered or you don't have permission to view this information");
}
include("footer.php");
/* Logged in user viewing own account */
if(strcmp($session->username,$req_user) == 0){
echo "<h6><br>My Account</h6>";
}
/* Visitor not viewing own account */
else{
header('Location: userinfo.php');
/*echo "<h6><br /><br />User Info</h6>";*/
}
>?
[/code]
wat gaat er fout?
Gewijzigd op 25/12/2012 17:10:51 door jack maessen
Jack maessen op 25/12/2012 17:03:23:
ik snap niet waarom de browser dat stuk html wat er achter komt niet gewoont toont?
Volgens mij geeft Not Moose het antwoord:
Not Moose op 25/12/2012 16:29:31:
Na die() of exit() stopt je script. http://nl3.php.net/manual/en/function.die.php
Jack maessen op 25/12/2012 17:03:23:
ik snap niet waarom de browser dat stuk html wat er achter komt niet gewoont toont?
Zie hier:
Not Moose op 25/12/2012 16:29:31:
Na die() of exit() stopt je script. http://nl3.php.net/manual/en/function.die.php
Misschien heb je hier wat aan, kreeg ik vandaag als tip mee om even door te lezen:
http://nl.wikipedia.org/wiki/Session_hijackin
en
http://www.acros.si/papers/session_fixation.pdf
is er dan geen enkele manier om die footer erna nog te tonen?
Ja, geen die() gebruiken. Dat is gewoon geen foutafhandeling.
Ik heb ze nu naar een aparte pagina gestuurd "forbidden.html" met een link erin waar ze terug gaan naar de index.php, die de inlogsessie weer controleert waardoor ze of hun eigen bestanden weer zien of de inlogform voor hun neus krijgen
En dan ga ik nu iets geks zeggen.... in het laatste script dat je post zou je het juist wel moeten gebruiken. Na een redirect wil je namelijk dat wat er nog na komt hoe dan ook niet meer wordt uitgevoerd. Na een redirect is het dus juist wel een goede gewoonte om een exit() te plaatsen. Daarmee voorkom je dat er onverwachts toch nog een actie uitgevoerd wordt.
Wat is eigenlijk het verschil tussen DIE en EXIT?