Foutmelding bij beveiliging pagina
Ik heb een inlogscript die een sessie meegeeft aan een persoon die inlogt. Elk persoon heeft dus zijn eigen sessie. Nu wil ik dat niet alle mensen die ingelogd zijn dezelfde pagina's kunnen zien, dus ik wil controleren of ze de juiste sessie hebben om de pagina te bekijken. Ik heb nu dit:
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
<?php
require ("../3 juli/CMS/connect.php");
require("../3 juli/CMS/session.php");
?>
<?
// in te vullen data
$bestand = ("../3 juli/CMS/nieuws.php");
if(!is_readable($bestand))
{
die("Kon bestand niet openen: bestand is niet leesbaar");
}
if(is_writable($bestand) == FALSE)
{
die("Kon bestand niet openen: bestand is niet schrijfbaar");
}
if(isset($_SERVER["inhoud"]) == TRUE)
{
$inhoud = $_POST["inhoud"];
$handeling = fopen($bestand,"w") or die("Kon bestand niet openen om te schrijven");
$schrijf = fwrite($handeling,stripslashes($inhoud)) or die("Kon niet naar bestand schrijven");
echo "<b>Het bestand is succesvol bewerkt.</b><br><br>Klik <a href=\"CMS/login.php\">hier</a> om terug te gaan naar het overzicht.";
die();
}
$inhoud = file_get_contents($bestand) or die("Kon bestand niet openen om uit te lezen");
?>
<html>
<head>
<title>Bestand editten</title>
<link href="sample.css" rel="stylesheet" type="text/css" />
<script type="fckeditor.js"></script>
</head>
<style>
.update{
background-color: #ffffff;
color: #EE3034;
border: 1px solid #999999;
font-family: Arial;
font-size: 12px;
}
</style>
<body bgcolor="#ffffff">
<?php
if(isset($_SESSION['suser'])) {
?>
<?php
if(($_SESSION['slevel'] & 1) == 1) {
// voer code uit behorend bij recht #1
?>
<?include("fckeditor.php") ;
?>
<form action="<? echo $_SERVER["PHP_SELF"]; ?>" method="post">
<?php
$sBasePath = $_SERVER['PHP_SELF'] ;
$sBasePath = substr( $sBasePath, 0, strpos( $sBasePath, "_samples" ) ) ;
$oFCKeditor = new FCKeditor('inhoud') ;
$oFCKeditor->BasePath = $sBasePath ;
$oFCKeditor->Height = 600 ;
$oFCKeditor->Value = $inhoud ;
$oFCKeditor->Create() ;
?>
<input type="submit" class="update" value="Update pagina >>">
</form>
<?php
} else {
?>
<br />
<?php
}
?>
</body>
</html>
require ("../3 juli/CMS/connect.php");
require("../3 juli/CMS/session.php");
?>
<?
// in te vullen data
$bestand = ("../3 juli/CMS/nieuws.php");
if(!is_readable($bestand))
{
die("Kon bestand niet openen: bestand is niet leesbaar");
}
if(is_writable($bestand) == FALSE)
{
die("Kon bestand niet openen: bestand is niet schrijfbaar");
}
if(isset($_SERVER["inhoud"]) == TRUE)
{
$inhoud = $_POST["inhoud"];
$handeling = fopen($bestand,"w") or die("Kon bestand niet openen om te schrijven");
$schrijf = fwrite($handeling,stripslashes($inhoud)) or die("Kon niet naar bestand schrijven");
echo "<b>Het bestand is succesvol bewerkt.</b><br><br>Klik <a href=\"CMS/login.php\">hier</a> om terug te gaan naar het overzicht.";
die();
}
$inhoud = file_get_contents($bestand) or die("Kon bestand niet openen om uit te lezen");
?>
<html>
<head>
<title>Bestand editten</title>
<link href="sample.css" rel="stylesheet" type="text/css" />
<script type="fckeditor.js"></script>
</head>
<style>
.update{
background-color: #ffffff;
color: #EE3034;
border: 1px solid #999999;
font-family: Arial;
font-size: 12px;
}
</style>
<body bgcolor="#ffffff">
<?php
if(isset($_SESSION['suser'])) {
?>
<?php
if(($_SESSION['slevel'] & 1) == 1) {
// voer code uit behorend bij recht #1
?>
<?include("fckeditor.php") ;
?>
<form action="<? echo $_SERVER["PHP_SELF"]; ?>" method="post">
<?php
$sBasePath = $_SERVER['PHP_SELF'] ;
$sBasePath = substr( $sBasePath, 0, strpos( $sBasePath, "_samples" ) ) ;
$oFCKeditor = new FCKeditor('inhoud') ;
$oFCKeditor->BasePath = $sBasePath ;
$oFCKeditor->Height = 600 ;
$oFCKeditor->Value = $inhoud ;
$oFCKeditor->Create() ;
?>
<input type="submit" class="update" value="Update pagina >>">
</form>
<?php
} else {
?>
<br />
<?php
}
?>
</body>
</html>
Maar in de browser krijg ik de fout:
Parse error: syntax error, unexpected $end in /www/test/bewerk.php on line 103
Weet iemand waar de fout zit?? Heb alles geprobeerd, maar kom er zelf niet uit. De bedoeling is dus dat alleen de mensen met session id 1 de pagina mogen bekijken.
Alvast heel erg bedankt!!!
P.S. op regel 7 staat $bestand = ("../3 juli/CMS/nieuws.php");, maar er moeten meerdere bestanden bewerkt worden.
Het zit zo dat er vanuit een andere pagina op een link wordt geklikt, bijv: "home", en dan moet de editor home.php uitlezen. Nu moet ik handmatig "home" linken aan bijv. uitlezen_home.php, en daarin zet ik dan: $bestand = ("../3 juli/CMS/home.php");.
ik moet dus voor elke pagina die uitgelezen moet worden in de editor een nieuwe pagina aanmaken. Volgens mij moet dit makkelijker kunnen, maar ik weet niet hoe en kan het nergens vinden. Wie helpt mij uit de brand??
Gewijzigd op 01/01/1970 01:00:00 door Joeri de Groot
Je sluit de else van regel 88 niet af.
En van
if(is_readable($bestand) == FALSE)
kun je
if(!is_readable($bestand))
maken, en als je dat niet wilt is
if(is_readable($bestand) === FALSE)
altijd nog beter dan wat je bu hebt.
Ik zit nu alleen nog met het probleem dat ik voor elk bestand dat ik bij wil werken een nieuwe pagina moet maken. Wie weet wat ik moet doen om i.pv. elke keer een nieuw bestand met:
$bestand = ("../3 juli/CMS/nieuws.php");
bijv. een link kan maken vanaf een bestand zoals:
<a href="bewerk.php?bestand=nieuws.php">
??
Ik ontvang alle hulp met open armen, alvast bedankt!!
Gewijzigd op 01/01/1970 01:00:00 door Joeri de Groot
glob kun je een array maken van alle php bestanden in een bepaalde map, bv:
Met Code (php)
1
2
3
4
5
2
3
4
5
<?php
foreach (glob ('CMS/*php') as $file) {
echo '<a href="bewerk.php?bestand='.urlencode ($file).'">'.htmlentities ($file).'</a>';
}
?>
foreach (glob ('CMS/*php') as $file) {
echo '<a href="bewerk.php?bestand='.urlencode ($file).'">'.htmlentities ($file).'</a>';
}
?>
Inderdaad. Maar jouw scriptje geeft bestand.nietphp ook weer ;) Dit moet je er dus van maken:
Code (php)
1
2
3
4
5
2
3
4
5
<?php
foreach (glob ('CMS/*.php') as $file) {
echo '<a href="bewerk.php?bestand='.urlencode ($file).'">'.htmlentities ($file).'</a>';
}
?>
foreach (glob ('CMS/*.php') as $file) {
echo '<a href="bewerk.php?bestand='.urlencode ($file).'">'.htmlentities ($file).'</a>';
}
?>
Nog één klein ding, misschien ben ik dom, maar hoe zorg ik er nu voor dat
$bestand = ("../3 juli/CMS/nieuws.php"); kan worden vervangen zodat hij het $bestand uitleest uit de url dus bijv. bewerk.php?bestand=nieuws.php??
ALvast 100000x dank!!
Gewijzigd op 01/01/1970 01:00:00 door Joeri de Groot
Jan Koehoorn schreef op 05.07.2008 19:59:
Klopt, was het puntje vergeten ;-)
Weet iemand ook of ik de variabele $bestand= "" zo kan maken dat wanneer je op de link klikt die bijv. http://www.mijnwebsite.nl/bewerk.php?bestand=home.php aangeeft, dat $bestand dan ook direct automatisch "home.php" geeft?
Dus als ik op de link
http://www.mijnwebsite.nl/bewerk.php?bestand=home.php klik, dat $bestand= "home.php" dan direct automatisch wordt ingevuld door het script??
Hoop dat het een beetje duidelijk is...
Groetjes en alvast bedankt voor de hulp!!!
Wellicht makkerlijker en veiliger om te werken met htaccesss.
Dan vul je dit in:
mijnwebsite.nl/bewerk/home/
Dat wordt dan omgetoverd naar:
mijnwebsite.nl/bewerk.php?bestand=home
Met de php kan je die .php wel achter home[/]b plakken.
De kans dat je gehacket wordt, is gewoon veel kleiner.
Immers: bewerk.php?bestand=config.php is niet echt prettig ;).
Nee, mod rewrite is geen beveiligings middel het is enkel een middel om te zorgen dat je urls er netter uit zien en tevens bots van bijvoorbeeld google je site beter te kunnen laten indexeren. De beveiliging zul je toch echt in je PHP code op moeten nemen, daar zul je dus moeten aangeven dat config.php niet in de editor geopend mag worden...
Ik heb nu alleen nog 1 klein vraagje:
het bestand dat ik wil wijzigen zit bijv. in de map www/CMS/joeri/nieuws.php en de editor bevindt zich in de map www/editor/bewerk.php.
Hoe kan ik er nu voor zorgen dat nieuws.php uitgelezen wordt in bewerk.php, wanneer deze in andere mappen zitten???
Als ik ze in dezelfde map doe lukt het, maar in andere nog niet....
Of gewoon los doorgeven, dus hardcore htaccesse en niet met eregs etc.
De beveiliging is uiteraard in php nogmaals aanwezig.
Want men kan alsnog naar bewerken.php?bestand=config gaan, ook zonder htaccess om.
@ Joeri: ../CMS/joeri/nieuws.php
Je gaat dus eerst uit editor.. dan zit je in de map "www". En gaat daarvandaan dus weer je CMS-map in etc.
Mensen bestanden alleen uit één map bewerken. Ik dacht dus: ik maak $bestand zo dat de map al is ingesteld in het php bestand dus zoiets als:
$bestand = ../3 juli/CMS/richard/htmlentities($_GET['bestand']);
alleen bovenstaand werkt natuurlijk niet. Weet iemand wat ik moet doen om dit wél te laten werken???
B.v.d.
Maar goed, dat is nog niet veilig. Want als je nu als get variabele bijvoorbeeld '../../bestand.php' opgeeft, zit je alweer in de map '3 juli' en open je daar het bestand 'bestand.php'.
Je zult dus moeten voorkomen dat mensen zomaar in alle mappen kunnen komen door bijvoorbeeld het gedeelte '../' te weigeren in $_GET['bestand']. Komt dat wel voor, dan moet je een foutmelding geven...
*schaamt* en hoe doe ik dat.....?
heb nu dit in m'n pagina staan:
Code (php)
1
2
3
4
5
6
2
3
4
5
6
$bestand = '../3 juli/CMS/' . htmlentities($_GET['bestand']);
if(strpos($_GET['bestand'], '../'))
{
echo "Deze pagina mag niet worden bekeken.";
}
if(strpos($_GET['bestand'], '../'))
{
echo "Deze pagina mag niet worden bekeken.";
}
maar ik kan nog steeds in mappen komen door ../../ enz...
Wat doe ik fout????
Iemand een idee?
Let wel dat men een punt ook op diverse andere manieren kan schrijven (htmlspecialchar() en htmlentities() etc).
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
<?php
$bestand = '../3 juli/CMS/' . htmlentities($_GET['bestand']);
if(preg_match('_\.\./_', $_GET['bestand']))
{
echo "Deze pagina mag niet worden bekeken.";
}
?>
$bestand = '../3 juli/CMS/' . htmlentities($_GET['bestand']);
if(preg_match('_\.\./_', $_GET['bestand']))
{
echo "Deze pagina mag niet worden bekeken.";
}
?>