Cookies <-> Session
Ik moet voor school met een groepswerk een project maken. Daarvoor heb ik een klein siteje gemaakt waar we onze files kunnen uploaden etc.
Ik beveilig ze met cookies. Ik weet ondertussen ook dat dat niet echt veilig is, maar het is nog altijd mijn eerste inlogsysteempje.
Ik had Jan K. zijn tutorial over sessions zien staan en heb dat proberen toe te passen op die site. Alles werkte, totdat ik op de upload pagina zelf kwam.
Ik post even de code hieronder. Kan iemand me eevn zeggen waar het fout gaat?
MET COOKIES
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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
<html>
<head>
<title>File Management</title>
<link href="includes/stylesheet.css" rel="stylesheet" type="text/css">
</head>
<body>
<div id="content">
<?
include ('includes/config.php');
if((isset($_COOKIE['ProjectUsername'])) && ($_COOKIE['ProjectRank'] >= 2)){
echo '<table width="100%" height="100%" cellpadding="5" cellspacing="0">';
echo '<tr>';
echo '<td width="70%" height="100%" valign="top">';
if($_SERVER['REQUEST_METHOD'] == 'POST')
{
global $_FILES;
$filename = $_FILES['userfile']['name'];
$allow[0] = "jpg";
$allow[1] = "gif";
$allow[2] = "bmp";
$allow[3] = "doc";
$allow[4] = "txt";
$allow[5] = "xls";
$allow[6] = "wmv";
$allow[7] = "avi";
$allow[8] = "rar";
if ($_POST["newname"])
$uploadname = $_POST['newname'];
else
$uploadname = $_FILES['userfile']['name'];
$extentie = substr($uploadname, -3);
for ($i = 0; $i < count($allow); $i++)
{
if ($extentie == $allow[$i])
{
$extentie_check = "ok";
$i = count($allow) + 5; // om loop te beindigen
}
}
if ($extentie_check)
{
if (is_uploaded_file($_FILES['userfile']['tmp_name'])) {
move_uploaded_file($_FILES['userfile']['tmp_name'], "files/" . $uploadname);
echo "Het bestand is geupload onder de naam: $uploadname";
echo '<br>De map van bestanden is <a href="files"><b><u>hier</u></b></a> te vinden.';
$datum = date("Y-m-d");
mysql_query("INSERT INTO projectbestanden (id, uploadname, datum) VALUES ('', '$uploadname', '$datum')") or die(mysql_error());
}
}
else
{
echo "Error: De extentie van het bestand is niet toegelaten!";
}
}else{
echo '
<p>Je kunt de <b>naam om up te loaden leeg laten</b>. <br>
Dan wordt de naam zoals het bestand om het moment zelf heet.</p><br>
De toegelaten extenties zijn: jpg, gif, bmp, doc, txt, xls, wmv, avi.<br>
<form enctype="multipart/form-data" action="uploads.php" method="post">
<p>
<input type="hidden" name="MAX_FILE_SIZE" value="51200" />
Selecteer een bestand: <input name="userfile" type="file"><br />
Naam om up te loaden: <input name="newname" type="text"><br />
<input type="submit" value="Upload" />
</p>
</form>
<br><br>';
echo '</div>';
}
echo '</td>';
echo '<td width="30%" height="100%" valign="top">';
echo '<div id="divtasks">';
include ('tasks.php');
echo '</div>';
echo '<div id="divlinks">';
include ('links.php');
echo '</div>';
echo '</td>';
echo '</tr>';
echo '</table>';
}else{
echo '<div id="contentout" align="center"><br><br><br><br><br><br><br><br>';
echo 'ACCESS DENIED!<br>';
echo '<a href="login.php">Please Login!</a><br><br>';
echo 'Authentication Required!<br><img src="images/print.png" border="0">';
echo '</div>';
}
?>
</body>
</div>
</body>
</html>
<head>
<title>File Management</title>
<link href="includes/stylesheet.css" rel="stylesheet" type="text/css">
</head>
<body>
<div id="content">
<?
include ('includes/config.php');
if((isset($_COOKIE['ProjectUsername'])) && ($_COOKIE['ProjectRank'] >= 2)){
echo '<table width="100%" height="100%" cellpadding="5" cellspacing="0">';
echo '<tr>';
echo '<td width="70%" height="100%" valign="top">';
if($_SERVER['REQUEST_METHOD'] == 'POST')
{
global $_FILES;
$filename = $_FILES['userfile']['name'];
$allow[0] = "jpg";
$allow[1] = "gif";
$allow[2] = "bmp";
$allow[3] = "doc";
$allow[4] = "txt";
$allow[5] = "xls";
$allow[6] = "wmv";
$allow[7] = "avi";
$allow[8] = "rar";
if ($_POST["newname"])
$uploadname = $_POST['newname'];
else
$uploadname = $_FILES['userfile']['name'];
$extentie = substr($uploadname, -3);
for ($i = 0; $i < count($allow); $i++)
{
if ($extentie == $allow[$i])
{
$extentie_check = "ok";
$i = count($allow) + 5; // om loop te beindigen
}
}
if ($extentie_check)
{
if (is_uploaded_file($_FILES['userfile']['tmp_name'])) {
move_uploaded_file($_FILES['userfile']['tmp_name'], "files/" . $uploadname);
echo "Het bestand is geupload onder de naam: $uploadname";
echo '<br>De map van bestanden is <a href="files"><b><u>hier</u></b></a> te vinden.';
$datum = date("Y-m-d");
mysql_query("INSERT INTO projectbestanden (id, uploadname, datum) VALUES ('', '$uploadname', '$datum')") or die(mysql_error());
}
}
else
{
echo "Error: De extentie van het bestand is niet toegelaten!";
}
}else{
echo '
<p>Je kunt de <b>naam om up te loaden leeg laten</b>. <br>
Dan wordt de naam zoals het bestand om het moment zelf heet.</p><br>
De toegelaten extenties zijn: jpg, gif, bmp, doc, txt, xls, wmv, avi.<br>
<form enctype="multipart/form-data" action="uploads.php" method="post">
<p>
<input type="hidden" name="MAX_FILE_SIZE" value="51200" />
Selecteer een bestand: <input name="userfile" type="file"><br />
Naam om up te loaden: <input name="newname" type="text"><br />
<input type="submit" value="Upload" />
</p>
</form>
<br><br>';
echo '</div>';
}
echo '</td>';
echo '<td width="30%" height="100%" valign="top">';
echo '<div id="divtasks">';
include ('tasks.php');
echo '</div>';
echo '<div id="divlinks">';
include ('links.php');
echo '</div>';
echo '</td>';
echo '</tr>';
echo '</table>';
}else{
echo '<div id="contentout" align="center"><br><br><br><br><br><br><br><br>';
echo 'ACCESS DENIED!<br>';
echo '<a href="login.php">Please Login!</a><br><br>';
echo 'Authentication Required!<br><img src="images/print.png" border="0">';
echo '</div>';
}
?>
</body>
</div>
</body>
</html>
MET SESSIES
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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
<?
require ('includes/auth.php');
?>
<html>
<head>
<title>File Management</title>
<link href="includes/stylesheet.css" rel="stylesheet" type="text/css">
</head>
<body>
<div id="content">
<?
echo '<table width="100%" height="100%" cellpadding="5" cellspacing="0">';
echo '<tr>';
echo '<td width="70%" height="100%" valign="top">';
if($_SERVER['REQUEST_METHOD'] == 'POST')
{
global $_FILES;
$filename = $_FILES['userfile']['name'];
$allow[0] = "jpg";
$allow[1] = "gif";
$allow[2] = "bmp";
$allow[3] = "doc";
$allow[4] = "txt";
$allow[5] = "xls";
$allow[6] = "wmv";
$allow[7] = "avi";
$allow[8] = "rar";
if ($_POST["newname"])
$uploadname = $_POST['newname'];
else
$uploadname = $_FILES['userfile']['name'];
$extentie = substr($uploadname, -3);
for ($i = 0; $i < count($allow); $i++)
{
if ($extentie == $allow[$i])
{
$extentie_check = "ok";
$i = count($allow) + 5; // om loop te beindigen
}
}
if ($extentie_check)
{
if (is_uploaded_file($_FILES['userfile']['tmp_name'])) {
move_uploaded_file($_FILES['userfile']['tmp_name'], "files/" . $uploadname);
echo "Het bestand is geupload onder de naam: $uploadname";
echo '<br>De map van bestanden is <a href="files"><b><u>hier</u></b></a> te vinden.';
$datum = date("Y-m-d");
mysql_query("INSERT INTO projectbestanden (id, uploadname, datum) VALUES ('', '$uploadname', '$datum')") or die(mysql_error());
}
}
else
{
echo "Error: De extentie van het bestand is niet toegelaten!";
}
}else{
echo '
<p>Je kunt de <b>naam om up te loaden leeg laten</b>. <br>
Dan wordt de naam zoals het bestand om het moment zelf heet.</p><br>
De toegelaten extenties zijn: jpg, gif, bmp, doc, txt, xls, wmv, avi.<br>
<form enctype="multipart/form-data" action="uploads.php" method="post">
<p>
<input type="hidden" name="MAX_FILE_SIZE" value="51200" />
Selecteer een bestand: <input name="userfile" type="file"><br />
Naam om up te loaden: <input name="newname" type="text"><br />
<input type="submit" value="Upload" />
</p>
</form>
<br><br>';
echo '</div>';
}
echo '</td>';
echo '<td width="30%" height="100%" valign="top">';
echo '<div id="divtasks">';
include ('tasks.php');
echo '</div>';
echo '<div id="divlinks">';
include ('links.php');
echo '</div>';
echo '</td>';
echo '</tr>';
echo '</table>';
?>
</body>
</div>
</body>
</html>
require ('includes/auth.php');
?>
<html>
<head>
<title>File Management</title>
<link href="includes/stylesheet.css" rel="stylesheet" type="text/css">
</head>
<body>
<div id="content">
<?
echo '<table width="100%" height="100%" cellpadding="5" cellspacing="0">';
echo '<tr>';
echo '<td width="70%" height="100%" valign="top">';
if($_SERVER['REQUEST_METHOD'] == 'POST')
{
global $_FILES;
$filename = $_FILES['userfile']['name'];
$allow[0] = "jpg";
$allow[1] = "gif";
$allow[2] = "bmp";
$allow[3] = "doc";
$allow[4] = "txt";
$allow[5] = "xls";
$allow[6] = "wmv";
$allow[7] = "avi";
$allow[8] = "rar";
if ($_POST["newname"])
$uploadname = $_POST['newname'];
else
$uploadname = $_FILES['userfile']['name'];
$extentie = substr($uploadname, -3);
for ($i = 0; $i < count($allow); $i++)
{
if ($extentie == $allow[$i])
{
$extentie_check = "ok";
$i = count($allow) + 5; // om loop te beindigen
}
}
if ($extentie_check)
{
if (is_uploaded_file($_FILES['userfile']['tmp_name'])) {
move_uploaded_file($_FILES['userfile']['tmp_name'], "files/" . $uploadname);
echo "Het bestand is geupload onder de naam: $uploadname";
echo '<br>De map van bestanden is <a href="files"><b><u>hier</u></b></a> te vinden.';
$datum = date("Y-m-d");
mysql_query("INSERT INTO projectbestanden (id, uploadname, datum) VALUES ('', '$uploadname', '$datum')") or die(mysql_error());
}
}
else
{
echo "Error: De extentie van het bestand is niet toegelaten!";
}
}else{
echo '
<p>Je kunt de <b>naam om up te loaden leeg laten</b>. <br>
Dan wordt de naam zoals het bestand om het moment zelf heet.</p><br>
De toegelaten extenties zijn: jpg, gif, bmp, doc, txt, xls, wmv, avi.<br>
<form enctype="multipart/form-data" action="uploads.php" method="post">
<p>
<input type="hidden" name="MAX_FILE_SIZE" value="51200" />
Selecteer een bestand: <input name="userfile" type="file"><br />
Naam om up te loaden: <input name="newname" type="text"><br />
<input type="submit" value="Upload" />
</p>
</form>
<br><br>';
echo '</div>';
}
echo '</td>';
echo '<td width="30%" height="100%" valign="top">';
echo '<div id="divtasks">';
include ('tasks.php');
echo '</div>';
echo '<div id="divlinks">';
include ('links.php');
echo '</div>';
echo '</td>';
echo '</tr>';
echo '</table>';
?>
</body>
</div>
</body>
</html>
Mvg Jens
Wat gaat er eigenlijk precies fout?
Bij het SESSIES-systeem wordt de te uploaden file niet geupload, en bij gevolg wordt ook de naam niet in de database gezet.
Jens
Post die dan ook even.
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
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
<?php
session_start ();
// de gegevens voor de DB connectie
require 'config.php';
// terug naar de loginpagina. Met sleep bouwen we een pauze in tegen brute-forcen
function to_login () {
sleep (1);
header ('Location: HIER STAAT DE LINK NORMAAL GEZIEN ;)'); // NIET VERGETEN AAN TE PASSEN!!!
}
function check_login ($username, $password) {
// query opstellen
// je tabel kan er heel simpel uitzien:
// id INT(11) auto_increment
// username VARCHAR 64
// password VARCHAR 64. Het password sla je op in je DB met een SHA1 hash
// daarom staat SHA1 dus ook in de query
$sql = "
SELECT id
FROM projectmembers
WHERE username = '" . mysql_real_escape_string ($username) . "'
AND password = SHA1('" . mysql_real_escape_string ($password) . "')
";
if ($res = mysql_query ($sql)) {
if (mysql_num_rows ($res) == 1) {
// de query is gelukt en we hebben 1 resultaat
$row = mysql_fetch_assoc ($res);
$_SESSION['id'] = $row['id'];
$_SESSION['logged_in'] = true;
}
else {
to_login ();
}
}
else {
to_login ();
}
}
// eerst maar eens kijken of $_SESSION['logged_in'] bestaat
if (!isset ($_SESSION['logged_in'])) {
// nog niet eerder ingelogd, maar misschien heeft iemand net het loginformulier ingevuld?
if (isset ($_POST['username'], $_POST['password'])) {
check_login ($_POST['username'], $_POST['password']);
}
else {
to_login ();
}
}
?>
session_start ();
// de gegevens voor de DB connectie
require 'config.php';
// terug naar de loginpagina. Met sleep bouwen we een pauze in tegen brute-forcen
function to_login () {
sleep (1);
header ('Location: HIER STAAT DE LINK NORMAAL GEZIEN ;)'); // NIET VERGETEN AAN TE PASSEN!!!
}
function check_login ($username, $password) {
// query opstellen
// je tabel kan er heel simpel uitzien:
// id INT(11) auto_increment
// username VARCHAR 64
// password VARCHAR 64. Het password sla je op in je DB met een SHA1 hash
// daarom staat SHA1 dus ook in de query
$sql = "
SELECT id
FROM projectmembers
WHERE username = '" . mysql_real_escape_string ($username) . "'
AND password = SHA1('" . mysql_real_escape_string ($password) . "')
";
if ($res = mysql_query ($sql)) {
if (mysql_num_rows ($res) == 1) {
// de query is gelukt en we hebben 1 resultaat
$row = mysql_fetch_assoc ($res);
$_SESSION['id'] = $row['id'];
$_SESSION['logged_in'] = true;
}
else {
to_login ();
}
}
else {
to_login ();
}
}
// eerst maar eens kijken of $_SESSION['logged_in'] bestaat
if (!isset ($_SESSION['logged_in'])) {
// nog niet eerder ingelogd, maar misschien heeft iemand net het loginformulier ingevuld?
if (isset ($_POST['username'], $_POST['password'])) {
check_login ($_POST['username'], $_POST['password']);
}
else {
to_login ();
}
}
?>
Zet wel voor de zekerheid een exit() na regel 10.
cva, maar dan is dat upload probleem niet weg eh. Dat was eerst het "primaire" doel van de site...
Je hebt daar niet echt iets aan verandert toch? Alleen die cookie regels verwijdert.
Jep, en beneden op de pagina waar hij het uigelogde gedeelte weergeeft bij de cookies
Kom je wel op die pagina, dus langs de require ('includes/auth.php');
Doe eens dit bovenaan je uploadpagina:
Code (php)
Wat zie je dan, na een uploadpoging?
Wat hij weergaf is dit:
Array
(
[userfile] => Array
(
[name] => Blackjck.xls
[type] => application/vnd.ms-excel
[tmp_name] => /tmp/phpnAPIdn
[error] => 0
=> 17920
)
)
Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at /home/denreyt/domains/vandenreyt.be/public_html/project/uploads.php:3) in /home/denreyt/domains/vandenreyt.be/public_html/project/includes/auth.php on line 2
Die warning is omdat ik dat stukje wat jij zei voor die require had gedaan (en daar staat een header is)
Jens
Merci ;-)
even een vraagje, moet dat stukje code nu blijven staan?
Maar dan gaat het uploaden toch prima? Je krijgt een error 0 en dat betekent: geen errors. Heeft de map waarnaar je het bestand verplaatst wel de goede rechten? Kijk eens met je FTP programma?
Zet die code een NA de require.
Jens schreef op 06.01.2007 13:16:
even een vraagje, moet dat stukje code nu blijven staan?
Nee die mag weg.
ik snap gewoon niet waarom het nu wel werkt, en gisteren niet... Ik had gekeken en had de map zelfs 7777 gechmod.. Toen werkte het nog niet. Hij gaf toen niet eens een error. Gewoon een grijze pagina
Chmod 7777 slaat nergens op doe dan 0777
jaja, dat is het ondertussen terug ;-)
Maar, ik begrijp dat alles nu toch werkt. Vreemd maar okee.
Ik denk juist hetzelfde ;)