PageRenderTime 120ms CodeModel.GetById 12ms RepoModel.GetById 0ms app.codeStats 0ms

/config/ecran_securite.php

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