Connexion MySQL valide dans des fonctions dans un script inclus ?

WRInaute accro
Bonjour

C'est dans le but de modifier tout un site, pour sécuriser son mode d'authentification de ses visiteurs authentifiés.

Désormais, la fonction certitifiant l'authentification, aurait pour prototype : make_authen($password) , et la fonction vérifiant l'authentification, aurait pour prototype : verif_authen()

Ces deux fonctions, serait incluses dans un script php nommé authen.php , et ces deux fonctions, contiendraient des instructions MySQL sur une table MySQL nommée : authentification.

Ces deux fonctions, contiendraient donc chacune, la variable globale $conn donnant la connexion en cours, à la Base de Données, et le problème consiste à savoir, à quel endroit des scripts du site, inclure le script authen.php contenant ces fonctions.

Il va de soi, qu'au moment où l'une de ces deux fonctions est appelée, la connexion à la Base de Données ( alimentant la variable $conn ) est toujours active.

Sachant celà, est-ce que je pourrais, inclure tout simplement ce script authen.php, dans le script contenant les fonctions de connexion et de déconnexion à la Base de Données, sachant que ce dernier script est lui-même inclus dans chaque scripts du site à modifier, et qu'effectivement, les connexions à la Base de Données, ne sont pas fait dans ce dernier script, mais dans les scripts incluant ce dernier script ?

Par exemple, pourrais je avoir une architecture de ce type :


script connect_deconnect.php contenant les fonction connect() et disconnect(), ainsi que les scripts inclus class_MyPDO.php et authen.php :

connect_deconnect.php
---------------------

-------------------------------------------------------
<?php

include("class_myPDO.php");

global $conn;

function connect()
{
// Instruction de connexion
// alimentant la variable
// globale $conn

}

function disconnect($conn)
{
unset($conn);
}

include("authen.php");

?>
-----------------------------------------------------------


authen.php
----------

-----------------------------------------------------------
<?php

global $conn;

function make_authen($password)
{
global $conn;

// Instructions MySQL
// utilisant la connexion
// à la Base de Données
// donnée par la variable $conn,
// ces instructions assurant
// l'authentification
// du visiteur ayant présenté
// le mot de passe $password

return(true);
}

function verif_authen()
{
global $conn;

// Instructions MySQL
// utilisant la connexion
// à la base de Données
// donnée par la variable $conn,
// cette fonction rend true
// si le visiteur est authentifié
// et false si non authentifié.

}
?>

-----------------------------------------------------


Maintenant, un exemple d'un script php utilisant les fonctions du script authen.php , alors que la connexion à la Base de Données est active :

script example.php

<?php
session_start();

include("connect_deconnect.php");

global $conn;

$conn = connect();

if(!$conn)
{
// Message d'erreur

exit;
}

// On suppose, que le mot de passe $password
// associé au pseudo $pseudo , a été vérifié, donc
// on authentifie ce visiteur :
$_SESSION['pseudo'] = $pseudo;

if(!make_authen($password))
{
// Message d'erreur,
// visiteur non authentifié

unset($_SESSION['pseudo']);

disconnect($conn);

exit;
}

// Là, le visiteur est authentifié,


// Dans ce script ( mais celà peut être aussi bien dans un autre script ),on vérifie si le visiteur est authentifié :

if(verif_authen())
{
// Traitement normal,
// le visiteur est authentifié.

}
else
{
// Traitement destiné
// à demander au visiteur
// de fournir un pseudo
// et un mot de passe valide,
// puis le traitement
// vérifie si le pseudo et le password
// sont corrects,
// puis dans ce script,
// déclenche de nouveau la fonction
// make_authen($password);
//
}

disconnect($conn);

// Suite du traitement éventuel.


exit;
?>
-------------------------------------------------


Donc, voici ma question :

A supposer, que la connexion à la Base de Données dans le(s) script(s) appelant, précède toujours les appels aux fonctions make_authen($password) et/ou verif_authen() , cette connexion MySQL sera-t-elle valide à l'intérieur de ces deux fonctions, bien que ces deux fonctions, sont déclarées avant l'instruction de connexion ( $conn = connect(); ) ?

En effet, pour plius de rapidité, je souhaite pouvoir inclure le script authen.php , tout bonnement dans le script connect_deconnect.php , ce qui ne fait qu'une seule inclusion pour tous les scripts du site, puisque le script connect_deconnect.php, est inclus partout où il y a besoin d'une connexion MySQL.

La variable $cconn étant globale partout, cette architecture de script est-elle valable ou non ?

Je reconnais que c'est une question très basique en php, mais j'aimerais bien être sûr avant de commencer à faire ces modifications.

Merci beaucoup de vos réponses.

Bien amicalement.

Jean François Ortolo
 
WRInaute accro
Oui tu peux sachant que "authen.php" est inclut par "connect_deconnect.php" tu peux très bien "copier / coller" le contenu de "authen.php" dans "connect_deconnect.php" et virer l'inclusion sans te préoccuper de rien.

A ce sujet vue l'exemple que tu propose et la complexité qu'il engendre (beaucoup d'include dans tous les coins), je me permet de te recommander de travailler plutôt avec un fichier "bibliotheque.php" qui regrouperait tout le framework du site (base, authentification et autre).
 
WRInaute accro
zeb a dit:
Oui tu peux sachant que "authen.php" est inclut par "connect_deconnect.php" tu peux très bien "copier / coller" le contenu de "authen.php" dans "connect_deconnect.php" et virer l'inclusion sans te préoccuper de rien.

A ce sujet vue l'exemple que tu propose et la complexité qu'il engendre (beaucoup d'include dans tous les coins), je me permet de te recommander de travailler plutôt avec un fichier "bibliotheque.php" qui regrouperait tout le framework du site (base, authentification et autre).


Bonsoir zeb ;)

Super !

Cà me fait beaucoup de plaisir de voir, que je vais pouvoir sécuriser mon site partenaire, de manière rapide et facile. ;)

J'ai un assez grand nombre de scripts contenant des vérifications d'authentification, et deux scripts activant cette authentification ( avec make_authen($password) ).

Le fait de laisser ce fichier connect_deconnect.php inclus dans tous ces scripts, et simplement d'insérer le code des deux fonctions d'authentification dans ce script, m'économisera beaucoup beaucoup de temps et d'efforts. ;)

Il me suffira d'identifier dans tous les scripts, l'instruction ( test if ) simple vérifiant l'authentification, et de la remplacer par l'instruction :

if(verif_authen())

Celà devrait être relativement rapide, vu que j'ai tout ce site sur mon ordinateur, en version ancienne mode Posix ( fonctions ereg ) et fonction mysql_*() ) , et en version nouvelle PCRE ( fonctions preg_*() ) et fonctions MySQL objets PDO ).

La migration, que j'ai faite sur tout ce site, de l'ancienne à la nouvelle version ( recopiage ), a eu lieu il y a au moins un an, de manière presque automatique, avec des scripts en Bourne Shell, et un script AWK, pour translater les anciennes vers les nouvelles fonctions. ;)

J'ai également migré mon propre site ( voir profil ), vers cette nouvelle version, et je suis très très fier, d'avoir surmonté toutes les difficultés, vu la quantité monstre de travail que celà aurait représenté, si j'avais été obligé de procéder "à la mano". ;)

Merci beaucoup beaucoup de ta réponse.

Bien amicalement.

Jean François Ortolo
 
WRInaute accro
Bonjour

J'ajoute, par rapport à la sécurité du site que je dois sécuriser, qu'il y a une faille pour certaines versions de Internet Explorer, qui permettent de lire des lookies, simplement au moment où le navigateur fonctionne, et où l'on a l'adresse ip de celui qui le fait fonctionner.

On pourrait imaginer un processus de hacking comme celui-là, pour savoir la valeur de l'identificateur de session d'un utilisateur connecté sur le site :

- Un programme dormant scanne un certain nombre d'adresses ip, de personnes connues comme visiteurs payants de ce site, et utilisant les versions en cause de Internet Explorer,

- Le programme repère un de ces visiteurs payants, qui se connecte ( en payant ) à ce site. Comment c'est possible, je ne sais pas, mais rien n'est impossible à un hacker...

- Le programme lit la valeur de l'identificateur de session du visiteur payant, puis produit ce même cookie dans un fichier de type Netscape, qui lui permet de simuler le fait d'être connecté à ce site,

- Ensuite, le programme, prend connaissance de tout le contenu protégé du site.

- Le programme peut même, enregistrer ces données protégées, et les revendre, à moindre prix évidemment, que le prix initial qu'il aurait fallu pour payer le site...


Maintenant, le problème étant d'éviter que la valeur de l'identificateur de session puisse être lue, il n'y a qu'une seule solution : Changer cette valeur à chaque chargement de page d'un visiteur.

Ceci... Uniquement si c'est le bon visiteur, donc avec une adresse ip ( enregistrée dans une variable de session ), identique à l'adresse cliente du visiteur.


Donc, voici le script, que je compte inclure au début de tous les scripts du site, faisant appel aux sessions, donc remplaçant l'instruction : session_start();

J'appelle ce script: init_session.php

Donc, au début de chaque scripts du site, je remplacerais, l'instruction : session_start(); par celle-ci : include("init_session.php");

Voici le code de ce script :

On appelle ce script init_session.php ,
il sera inclus au début de tous les scripts php
où interviennent des sessions.


Code:
<?php
function make_seed()
{
    list($usec, $sec) = explode(' ', microtime());
    return( (float)$sec + ((float)$usec * 100000);
}
session_start();
if(!isset($_SESSION['REMOTE_ADDR']))
    $_SESSION['REMOTE_ADDR'] = $_SERVER['REMOTE_ADDR'];

if($_SESSION['REMOTE_ADDR'] == $_SERVER['REMOTE_ADDR'])
{
    $old_session = $_SESSION;
    session_write_close();

    mt_srand(make_seed());

    session_id(sha1(mt_rand()));
    session_start();

    $_SESSION = $old_session;
}
?>


L'intérêt d'affecter l'identificateur de session manuellement, est de lui affecter une valeur plus complexe que le md5 habituel, donc une valeur entièrement aléatoire, et non répétitive avec certitude, pour éviter des id de session identiques.

J'ai testé ce script sur un script de mon site ( voir profil ) en local sur mon ordinateur, il a bien changé l'id de session par un contenu en chiffres hexadécimaux en assez grand nombre ( je n'ai pas compté le nombre de caractères, je crois que la fonction sha1() rend 40 caractères hexadécimaux ).

D'autre part, en local sur mon site, ce script a bien l'air de laisser les variables de session inchangées. Cependant, dans mon propre site, il n'y a qu'une seule variable de session, elle ne prend que les deux valeurs 1 ou 0, pour mémoriser le fait d'afficher, ou de ne pas aficher, l'Historique graphique des Courses passées.

Ma principale question est : Pensez-vous, que ce script conserve bien les variables de session ?

Ceci est effectivement essentiel pour la validité de la sécurisation du site.

Je sais bien, que je suppose que l'adresse ip client ne change pas entre deux requêtes http. Je ne peux pas faire autrement, car je suis obligé de tenir compte des cas, où le visiteur reste sur une page plus de quelques secondes, et où le "programme" ci-dessus, lise la valeur de l'identificateur de session, puis se connecte. A ce moment-là, il n'aura pas accès aux données protégées, car le mode d'authentification, tient compte également, de l'adresse ip source.

Merci beaucoup de votre avis à propos de ce script.

Est-ce que celà vous semble suffisamment sécurisé ?

Est-ce que çà marche ? ;)

Bien amicalement.

Jean François Ortolo
 
WRInaute accro
Le programme lit la valeur de l'identificateur de session du visiteur payant
même pas en rêve ... sauf a avoir un cheval de troie sur la machine du pimpin qui est connecté.

Le programme peut même, enregistrer ces données protégées, et les revendre
Si jamais j'avais envie de te voler tes données :
1/ je m'attaque a ton serveur (beaucoup plus simple)
2/ j'utilise un renifleur pour avoir le contenu directement sur le poste d'un utilisateur abonné (encore plus simple)
3/ mais comme je vais même pas me prendre la tête, je vais payer un accès officiel et charger tout ce que je veux quand je veux et tu ne pourra rien y faire.

La solution c'est pas du code a rallonge c'est "Traitement symptomatique des manifestations anxieuses sévères"

Plus sérieusement tu est en train de te noyer dans un ver d'eau. As tu pensé 2 mn a la valeur de tes données ? c'est surement proche de pas grand chose Kevin ne risque pas de venir te les prendre.

Parce que dans le scénario catastrophe il y a aussi l'attaque du datacenter pour faire tomber les moteurs php qui donnent accès au code source et donc au vol des identifiants de base, le brute force de la page login et le rapt des enfants de Marcel pour lui faire cracher son mots de passe.

Sérieusement fait attention tu va toujours trouver un truc qui te chiffonne et tu ne t'en sortira jamais. Si vraiment tu voulais de la sécurité faudrait déjà travailler en https.
 
WRInaute accro
zeb a dit:
même pas en rêve ... sauf a avoir un cheval de troie sur la machine du pimpin qui est connecté.
Si si, regarde l'article, n'importe quelle technique "man in the middle" pourrait fonctionner (Wireshark, Ettercap, ...).
 
WRInaute accro
spout a dit:
n'importe quelle technique "man in the middle" pourrait fonctionner
Oui et c'est en ce sens (similaire) que je parle de reniflage, mais faut aussi se placer du côté "utilisation" et si je veux voler des pronostiques pour la prochaine course je vais acheter un canard en kiosque, je contacte pas la NSA pour pister le "Marcel" moyen. On ne parle pas d'une banque là il me semble.
 
WRInaute accro
Bonjour zeb

Quant à la valeur des données...

Il s'agit de mon site partenaire http://---.lescourses.com

Ce site, est classé par Alexa, 10ème en fréquentation, dans la catégorie : "Courses Hippiques".

Celà veut dire, que ce site a un très grand nombre de visiteurs.

Cependant, le revenu ( nombre de visiteurs payants ) de ce site, est faible, voire très faible.

Où est l'erreur ?

Ce site utilise, pour l'authentification, une simple variable de session de nom et de valeur toujours identiques et fixes.

N'y aurait-il pas comme des questions à me poser ? ;(

D'autre part, je sais ( car j'ai consulté le net ), que rien n'est plus facile que d'avoir la valeur d'un id de session à distance, dans certaines conditions.

Quand je vois le trafic probable très élevé de ce site, et le faible nombre de visiteurs payants, que dois-je conclure ?

Il suffit actuellement, très facilement, d'avoir l'id de session de quelqu'un de connecté, pour simuler une connexion.

Conclusion ? A ton avis ? ;)

J'ai consulté le net et les commentaires accompagnant, dans le PHP Manual, le descriptif de la fonction session_regenerate_id()

Ce sont des spécialistes en sécurisation de sites.

J'ai tiré ce script, de ces commentaires.

Théoriquement, il devrait fonctionner, c'est-à-dire changer l'id de session à chacune de ses exécutions, tout en gardant intactes les variables de session.

Est-ce que c'est vrai ? C'est ma seule question.

Merci beaucoup de ta réponse.

Bien amicalement.

Jean François Ortolo
 
WRInaute accro
zeb a dit:
spout a dit:
n'importe quelle technique "man in the middle" pourrait fonctionner
Oui et c'est en ce sens (similaire) que je parle de reniflage, mais faut aussi se placer du côté "utilisation" et si je veux voler des pronostiques pour la prochaine course je vais acheter un canard en kiosque, je contacte pas la NSA pour pister le "Marcel" moyen. On ne parle pas d'une banque là il me semble.


Rebonjour zeb

Tu as bien lu, ma réponse précédente.

*Si* c'est plus bon marché, d'avoir les pronostics de ce site, que d'acheter le canard en kiosque, dont les pronostics seront d'ailleurs beaucoup moins bon, ( car j'ai les stats de performances de ses pronostics, faut voir... ;) )

En fait, pour tout dire, ses pronostics sont un peu meilleurs que les miens... ;)

Supposons qu'un hacker ( il en suffit d'un seul ), vende à bon marché l'accès à ces pronostics, à ce moment-là, le bouche à oreille ne fait qu'un tour ?

Pourquoi crois-tu, que ce site est 10ème dans le classement de Alexa, dans cette catégorie "Courses Hippiques" ?

Encore une fois, j'ai simplement besoin d'avoir une réponse à ma question purement technique, pas d'avoir une fin de non-recevoir pour "problèmes d'humeur"...

Bien amicalement.

Jean François Ortolo
 
Discussions similaires
Haut