Includen van paginas

Toelichting

Veel mensen werken met een systeem waarbij ze pagina's met informatie includen in een bepaalde hoofdpagina. De te includen pagina's worden dan vaak in de url meegegeven. Dit echter kan een potentieel risico opleveren als zo'n systeem niet goed beveiligd is. Ik zou bijvoorbeeld niet willen dat iemand met website aanroep met index.php?pagina=www.foutesite.com/vervelendscript.php en dat vervolgens vervelendscript.php op mijn server gedraaid wordt.

In dit script zitten verschillende elementen ingebouwd waardoor bovenstaande niet kan voorkomen. Je bent er dus van verzekerd dat alleen de door jou geselecteerde pagina's geinclude worden. Bovendien wordt er onderscheid gemaakt tussen statische paginas (met enkel HTML) en dynamische paginas (waarin de output door PHP gegenereerd wordt).

De logica (PHP) in dit script blijft strict gescheiden van de output (HTML), precies zoals een goed PHP script opgebouwd moet zijn. Pas op het laatste moment worden de arrays met content uitgelezen en wordt er output op het scherm gezet.

Voorbeeld

Klik hier voor een voorbeeld

Script

Code
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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
<?php
ini_set
('display_errors''On');
error_reporting(E_ALL);

/**
* Arrays om errors en content tijdelijk in op te slaan
*/
$aErrors = array();
$aContent = array();

/**
* Array met alle paginas die geïnclude mogen worden,
* de keys stellen de namen van paginas voor en de waarden geven met een boolean
* aan of de pagina statisch (false) dan wel dynamisch (true)
*/
$aPages = array (
    
'voorbeeld_statisch' => false,
    
'voorbeeld_dynamisch' => true,
    
'bestaat_niet' => false
);

/**
* Directory waarin de paginas zich bevinden
* Extensie die de te includen paginas hebben
*/
$sDir 'inc/';
$sExt '.inc.php';

/**
* Is er een pagina opgegeven?
*/
if(isset($_GET['page']))
{
    
$sPad $sDir.$_GET['page'].$sExt;
    
    
/**
    * Is dit een toegestane pagina?
    */
    
if(array_key_exists($_GET['page'], $aPages))
    {
        
/**
        * Bestaat de opgevraagde pagina?
        */
        
if(file_exists($sPad))
        {
            
/**
            * Is de pagina dynamisch of statisch?
            */
            
if($aPages[$_GET['page']] === true)
            {
                include(
$sPad);
            }
            else
            {
                
$aContent[] = file_get_contents($sPad);
            }
        }
        else
        {
            
$aErrors[] = 'Sorry, deze pagina bestaat niet.';
        }    
    }
    else
    {
        
$aErrors[] = 'Sorry, deze pagina is niet toegestaan.';
    }
}
else
{
    
$aContent[] = 'Geen pagina opgegeven';
}
?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>PHP Scripts en Tutorials - Paginas veilig includen</title>
    <link rel="stylesheet" href="../styles/default.css" type="text/css" media="screen" />
    
    <style type="text/css">
        #include {
            padding: 10px;
            border: 2px solid #EEF7D4;
        }
    </style>    
</head>

<body>
    <div id="wrap">
        <p class="none small align-right"><a href="/view/42/">&lt;-- Terug naar Scripts</a></p>
        <h1>Include paginas veilig</h1>
        
        <div id="info">
            <p>PHP versie: &gt;= 4.1.0</p>
        </div>
        
        <p>Gebruik onderstaande links om een pagina te kiezen of probeer zelf een pagina te openen door ?page=jouw_pagina achter de URL te zetten. Dit script maakt verschil tussen statische paginas (enkel HTML code) en dynamische paginas (PHP code), zie ook de bron van de verschillende paginas voor een voorbeeld.</p>
        
        <p>
            <a href="?page=voorbeeld_statisch">Statisch voorbeeld</a> (<a href="inc/voorbeeld_statisch.inc.phps" target="_blank">Bron</a>)<br />
            <a href="?page=voorbeeld_dynamisch">Dynamisch voorbeeld</a> (<a href="inc/voorbeeld_dynamisch.inc.phps" target="_blank">Bron</a>)<br />
            <a href="?page=bestaat_niet">Bestaat niet</a><br />
            <a href="?page=niet_toegestaan">Niet toegestaan</a><br />
        </p>
        
        <div id="include">
        <?php
            
/**
            * Outputten van content die tijdens het includen gegenereerd is.
            * Fouten staan in $aErrors, de rest van de content in $aContent.
            */    
            
if(!empty($aErrors))
            {
                echo 
'<ul>';
                foreach(
$aErrors as $sError)
                {
                    echo 
'<li>'.$sError.'</li>';
                }
                echo 
'</ul>';
            }
            elseif(!empty(
$aContent))
            {
                foreach(
$aContent as $sLine)
                {
                    echo 
$sLine;
                }
            }
        
?>
        </div>        
    </div>    
</body>
</html>

Reacties