source: spip-zone/_core_/securite/ecran_securite.php @ 43532

Last change on this file since 43532 was 43532, checked in by fil@…, 10 years ago

Suivre
http://core.spip.org/projects/spip/repository/revisions/16948
et
http://core.spip.org/projects/spip/repository/revisions/16949

File size: 7.1 KB
Line 
1<?php
2
3/*
4 * ecran_securite.php
5 * ------------------
6 */
7
8define('_ECRAN_SECURITE', '0.9.7'); // 13 janv 2011
9
10/*
11 * Documentation : http://www.spip.net/fr_article4200.html
12 *
13 */
14
15/*
16 * test utilisateur
17 */
18if (isset($_GET['test_ecran_securite']))
19        $ecran_securite_raison = 'test '._ECRAN_SECURITE;
20
21/*
22 * detecteur de robot d'indexation
23 */
24if (!defined('_IS_BOT'))
25        define('_IS_BOT',
26                isset($_SERVER['HTTP_USER_AGENT'])
27                AND preg_match(',bot|slurp|crawler|spider|webvac|yandex,i',
28                        (string) $_SERVER['HTTP_USER_AGENT'])
29        );
30
31/*     - interdit de passer une variable id_article (ou id_xxx) qui ne
32 *       soit pas numerique (ce qui bloque l'exploitation de divers trous
33 *       de securite, dont celui de toutes les versions < 1.8.2f)
34 *       (sauf pour id_table, qui n'est pas numerique jusqu'a [5743])
35 */
36foreach ($_GET as $var => $val)
37        if (strncmp($var,"id_",3)==0 AND $var!='id_table')
38                $_GET[$var] = is_array($_GET[$var])?@array_map('intval',$_GET[$var]):intval($_GET[$var]);
39foreach ($_POST as $var => $val)
40        if (strncmp($var,"id_",3)==0 AND $var!='id_table')
41                $_POST[$var] = is_array($_POST[$var])?@array_map('intval',$_POST[$var]):intval($_POST[$var]);
42foreach ($GLOBALS as $var => $val)
43        if (strncmp($var,"id_",3)==0 AND $var!='id_table')
44                $GLOBALS[$var] = is_array($GLOBALS[$var])?@array_map('intval',$GLOBALS[$var]):intval($GLOBALS[$var]);
45
46
47/*     - interdit la variable $cjpeg_command, qui etait utilisee sans
48 *       precaution dans certaines versions de dev (1.8b2 -> 1.8b5)
49 *
50 */
51$cjpeg_command='';
52
53/*     - controle la variable $lang (XSS)
54 *
55 */
56if (isset($_GET['lang']))
57        $GLOBALS['lang'] = $_GET['lang'] = htmlentities((string)$_GET['lang']);
58if (isset($_POST['lang']))
59        $GLOBALS['lang'] = $_POST['lang'] = htmlentities((string)$_POST['lang']);
60
61/*     - filtre l'acces a spip_acces_doc (injection SQL en 1.8.2x)
62 *
63 */
64if (preg_match(',^(.*/)?spip_acces_doc\.,', (string)$REQUEST_URI)) {
65        $file = addslashes((string)$_GET['file']);
66}
67
68/*
69 *     - agenda joue a l'injection php
70 */
71if (isset($_REQUEST['partie_cal'])
72AND $_REQUEST['partie_cal'] !== htmlentities((string)$_REQUEST['partie_cal']))
73        $ecran_securite_raison = "partie_cal";
74if (isset($_REQUEST['echelle'])
75AND $_REQUEST['echelle'] !== htmlentities((string)$_REQUEST['echelle']))
76        $ecran_securite_raison = "echelle";
77
78/*
79 *     - espace prive
80 */
81if (isset($_REQUEST['exec'])
82AND !preg_match(',^\w+$,', (string)$_REQUEST['exec']))
83        $ecran_securite_raison = "exec";
84if (isset($_REQUEST['cherche_auteur'])
85AND preg_match(',[<],', (string)$_REQUEST['cherche_auteur']))
86        $ecran_securite_raison = "cherche_auteur";
87if (isset($_REQUEST['action'])
88AND $_REQUEST['action'] == 'configurer') {
89        if (@file_exists('inc_version.php')
90        OR @file_exists('ecrire/inc_version.php')) {
91                function action_configurer() {
92                        include_spip('inc/autoriser');
93                        if(!autoriser('configurer', _request('configuration'))) {
94                                include_spip('inc/minipres');
95                                echo minipres(_T('info_acces_interdit'));
96                                exit;
97                        }
98                        require _DIR_RESTREINT.'action/configurer.php';
99                        action_configurer_dist();
100                }
101        }
102}
103
104/*     - bloque les requetes contenant %00 (manipulation d'include)
105 *
106 */
107if (strpos(
108        @get_magic_quotes_gpc() ?
109                stripslashes(serialize($_REQUEST)) : serialize($_REQUEST),
110        chr(0)
111) !== false)
112        $ecran_securite_raison = "%00";
113
114/*     - bloque les requetes fond=formulaire_
115 *
116 */
117if (isset($_REQUEST['fond'])
118AND preg_match(',^formulaire_,i', $_REQUEST['fond']))
119        $ecran_securite_raison = "fond=formulaire_";
120
121/*     - bloque les requetes du type ?GLOBALS[type_urls]=toto (bug vieux php)
122 *
123 */
124if (isset($_REQUEST['GLOBALS']))
125        $ecran_securite_raison = "GLOBALS[GLOBALS]";
126
127/*     - bloque les requetes des bots sur:
128 *       les agenda
129 *       les paginations entremelees
130 */
131if (_IS_BOT AND (
132        (isset($_REQUEST['echelle']) AND isset($_REQUEST['partie_cal']) AND isset($_REQUEST['type']))
133        OR (strpos((string)$_SERVER['REQUEST_URI'],'debut_') AND preg_match(',[?&]debut_.*&debut_,', (string)$_SERVER['REQUEST_URI']))
134)
135)
136        $ecran_securite_raison = "robot agenda/double pagination";
137
138/*
139 * Bloque une vieille page de tests de CFG (<1.11)
140 * Bloque un XSS sur une page inexistante
141 */
142if (isset($_REQUEST['page'])) {
143        if ($_REQUEST['page']=='test_cfg')
144                $ecran_securite_raison = "test_cfg";
145        if ($_REQUEST['page'] !== htmlspecialchars((string)$_REQUEST['page']))
146                $ecran_securite_raison = "xsspage";
147}
148
149/*
150 * XSS par array
151 */
152foreach (array('var_login') as $ecran_securite_i)
153if (isset($_REQUEST[ $ecran_securite_i]) AND is_array($_REQUEST[$ecran_securite_i]))
154        $ecran_securite_raison = "xss ".$ecran_securite_i;
155
156/* Parade antivirale contre un cheval de troie */
157if(!function_exists('tmp_lkojfghx')){
158function tmp_lkojfghx(){}
159function tmp_lkojfghx2($a=0,$b=0,$c=0,$d=0){
160        // si jamais on est arrive ici sur une erreur php
161        // et qu'un autre gestionnaire d'erreur est defini, l'appeller
162        if($b&&$GLOBALS['tmp_xhgfjokl'])
163                call_user_func($GLOBALS['tmp_xhgfjokl'],$a,$b,$c,$d);
164}
165}
166if (isset($_POST['tmp_lkojfghx3']))
167        $ecran_securite_raison = "gumblar";
168
169/*
170 * Outils XML mal securises < 2.0.9
171 */
172if (isset($_REQUEST['transformer_xml']))
173        $ecran_securite_raison = "transformer_xml";
174
175/*
176 * Sauvegarde mal securisee < 2.0.9
177 */
178if (isset($_REQUEST['nom_sauvegarde'])
179AND strstr((string)$_REQUEST['nom_sauvegarde'], '/'))
180        $ecran_securite_raison = 'nom_sauvegarde manipulee';
181if (isset($_REQUEST['znom_sauvegarde'])
182AND strstr((string)$_REQUEST['znom_sauvegarde'], '/'))
183        $ecran_securite_raison = 'znom_sauvegarde manipulee';
184
185
186/*
187 * op, lang, permettent des inclusions arbitraires
188 */
189foreach (array('op','lang') as $var)
190if (isset($_REQUEST[$var])
191AND $_REQUEST[$var] !== preg_replace('/\W/', '', $_REQUEST[$var]))
192        $ecran_securite_raison = "$var";
193
194
195/*
196 * S'il y a une raison de mourir, mourons
197 */
198if (isset($ecran_securite_raison)) {
199        header("HTTP/1.0 403 Forbidden");
200        header("Expires: Wed, 11 Jan 1984 05:00:00 GMT");
201        header("Cache-Control: no-cache, must-revalidate");
202        header("Pragma: no-cache");
203        header("Content-Type: text/html");
204        die("<html><title>Error 403: Forbidden</title><body><h1>Error 403</h1><p>You are not authorized to view this page ($ecran_securite_raison)</p></body></html>");
205}
206/*
207 * Fin securite
208 */
209
210
211
212/*
213 * Bloque les bots quand le load deborde
214 *
215 */
216if (!defined('_ECRAN_SECURITE_LOAD'))
217        define('_ECRAN_SECURITE_LOAD', 4);
218
219if (
220        defined('_ECRAN_SECURITE_LOAD')
221        AND _ECRAN_SECURITE_LOAD>0
222        AND _IS_BOT
223        AND $_SERVER['REQUEST_METHOD'] === 'GET'
224        AND (
225                (function_exists('sys_getloadavg') AND $load = array_shift(sys_getloadavg()))
226                OR (@is_readable('/proc/loadavg') AND $load = floatval(file_get_contents('/proc/loadavg')))
227        )
228        AND $load > _ECRAN_SECURITE_LOAD // eviter l'evaluation suivante si de toute facon le load est inferieur a la limite
229        AND rand(0, $load*$load) > _ECRAN_SECURITE_LOAD*_ECRAN_SECURITE_LOAD
230) {
231        header("HTTP/1.0 503 Service Unavailable");
232        header("Retry-After: 300");
233        header("Expires: Wed, 11 Jan 1984 05:00:00 GMT");
234        header("Cache-Control: no-cache, must-revalidate");
235        header("Pragma: no-cache");
236        header("Content-Type: text/html");
237        die("<html><title>Status 503: Site temporarily unavailable</title><body><h1>Status 503</h1><p>Site temporarily unavailable (load average $load)</p></body></html>");
238}
239
240
241?>
Note: See TracBrowser for help on using the repository browser.