[RESOLU] register_globals OFF

marih
Invité n'ayant pas de compte PHPfrance

23 mai 2013, 14:14

Bonjour,
suite à la destruction de mon site par des hackers je dois sérieusement améliorer le code de mes PHP.
Je dois utiliser "register_globals OFF".
Je fonctionnais avec des variables de SESSION.
Dans un formulaire utilisant POST : je transmets la variable "NomInitial".
Dans le programme qui suit je la récupère par:
 
if (isset( $_POST['NomInitial'])) {$NomInitial = $_POST['NomInitial'];};
C'est OK.
Par contre dans le programme qui suit celui-ci, je pensais pouvoir retrouver cette variable de la même façon :
 
if (isset( $_POST['NomInitial'])) {$NomInitial = $_POST['NomInitial'];};
Ca ne fionctionne pas.
Je suis obligé de passer la variable dans le lien, à savoir:
 
<a href='Parvis.php3?NomInitial=$NomInitial'>
*
Ca c'est OK.
QUESTION:
Je pensais que POST fonctionnait comme SESSION et fournissait une liste de variables utilisables de n'importe quel programme.
Je me trompe sans doute dans la façon de récupérer la variable, pouvez-vous me dire où est mon erreur ?

Merci de vos conseils.
Marih

Mammouth du PHP | 619 Messages

23 mai 2013, 14:41

BOnjour,

$_POST on recupere les informations envoye en post souvent via un formulaire
$_GET on recupere les informations envoyer dans l'url
$_SESSION on recupere/ecrit dans une session (il faut un session_start(); ) en haut de tes fichiers

donc si tu veux avoir $_POST['NomInitial'] en session
if (isset( $_POST['NomInitial'])) {$_SESSION['NomInitial'] = $_POST['NomInitial'];}
mais je ne suis pas bien sur de comprendre

marih
Invité n'ayant pas de compte PHPfrance

23 mai 2013, 14:54

Bonjour, merci de ta réponse.
Je précise.
En utilisant register_globals Off les variables de SESSION ne sont plus accessibles.
J'essaye donc par POST et GET comme tu le dis.
MAIS je pensais qu'une fois initialisée dans un $_POST une variable était accessible par n'importe quel programme. Or cela ne semble pas vrai (mais j'ai éliminé session_start fallait-il le garder ?
Qu'en est-il ?

Mammouth du PHP | 619 Messages

23 mai 2013, 14:57

Re,

non $_POST ou $_GET ne garde pas en memoir les donnees a chaque changement de page c'est perdu seule les sessions et cookie permettre de garder en mémoire un resultat

les sessions c'est pas forcement dangereux si elle sont bien protégé il me semble jamais vu de problème

une session et lier au site (sauf modification) donc une fois le navigateur ferme la session et perdu

marih
Invité n'ayant pas de compte PHPfrance

23 mai 2013, 15:01

Le pb c'est que les variables des SESSION ne sont pas transmises avec register_globals OFF.
Sinon comme tu fais ?

Mammouth du PHP | 619 Messages

23 mai 2013, 15:17

Re,

tu dis Je dois utiliser "register_globals OFF". du coup tu peux le remettre sur ON

sinon voila quelques informations http://www.journaldunet.com/developpeur ... -off.shtml

et voila quelqu'un qui veux faire comme toi avec deux solution

http://www.siteduzero.com/forum/sujet/r ... -php-88945

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

23 mai 2013, 16:01

Il y a un tuto la dessus faq-tutoriels/pourquoi-register-globals ... f-t48.html

Ne pas mettre register globals à ON car :
1/ C'est une anerie, comme expliqué dans le tuto
2/ Ce paramètre est supprimé avec php 5.4 donc ce n'est pas un pari sur l'avenir => http://fr2.php.net/ChangeLog-5.php#5.4.0 (un an de retard)
3/ C'est rattraper 11 ans de non évolution du code ! => http://fr2.php.net/ChangeLog-4.php#4.2.0


Pour répondre à marih c'est dans les tutos de base ;)

http://phpdebutant.org/article69.php
http://www.lephpfacile.com/cours/18-les-sessions

Même s'il date un peu ils sont d'actuallité ;)


@+
Il en faut peu pour être heureux ......

Mammouth du PHP | 619 Messages

23 mai 2013, 16:18

Re,

désolé moogli je connais pas cette option si je lui ai dis de la réactivé c'est que plus haut je lui ai donne un code session elle a répondu

En utilisant register_globals Off les variables de SESSION ne sont plus accessibles.

donc si cette option et a off on peux quand même faire des sessions ?

marih
Invité n'ayant pas de compte PHPfrance

23 mai 2013, 18:15

Tout d'abord merci à Moogli et ghost5922 de m'avoir répondu.
Je suis un modeste selfmade webmaster bien qu'ancien informaticien et je ne sais plus à quel "saint me vouer" !
Comme je l'ai dit ci-dessus mon site vient d'être détruit à 80% (tous les fichiers html) et un 2ème niveau de mon hébergeur US (assez gros) me conseille fortement d'utiliser "register_glogals Off" pour augmenter la sécurité du site.
Par ailleurs cette info semble confirmée par les recommandations du manuel PHP à: http://php.net/manual/fr/security.globals.php.

Question travail à accomplir je préfèrerai rester avec "register_glogals On" car dans ce cas je n'aurai rien à changer, MAIS je reste inquiet car le salaud qui m'a "dézingué" peut recommencer qd il veut ... ! vous voyez ce que je veux dire ?

Alors que me conseillez-vous question "sécurité améliorée" ?

merci encore de votre aide avant que je ne me lance dans des jours de modifs !

Mammouth du PHP | 619 Messages

23 mai 2013, 19:57

Re,

comme le dit moogli ( je me repete mais je connais pas cette option ) meme avec l'option register_globals OFF les sessions sont disponible

donc par exemple pour un compte user

on a un formulaire avec les inputs login,password,etc

puis on a une page pour verifier les informations avec la bdd si les informations sont correcte alors on mets les variables post en session

$login=$_POST['login'];
$password=md5($_POST['password']);
$_SESSION['login'] = array($login,$password);

marih
Invité n'ayant pas de compte PHPfrance

24 mai 2013, 08:22

Merci pour tout.
Je n'avais pas compris que Moogli conseillait aussi register_globals OFF.
On est donc d'accord.

Pour l'utilisation des sessions je dois faire une erreur je vais vérifier avec ton dernier exemple.
merci

Eléphanteau du PHP | 13 Messages

24 mai 2013, 10:57

Pour répondre au 1er post,

Il faut utiliser $_GET et non $_POST lorsque tu passes tes variables via l'URL.

L'utilisation du $_POST est soit suite à l'envoi d'un formulaire avec l'attribut method="POST" soit via un envoi AJAX en POST.

EDIT : Je te suggère de bien nettoyer les variables récupérées avant de les utiliser. Pour celà, assure toi du type que tu attends. Les fonctions is_string ou is_numeric peuvent éviter bien des ennuis. Ensuite, pense à bien protéger les chaines avec la fonction quote de PDO, ou à les escaper si tu lances des scripts et enfin mets toi à jour avec PHP5.

Bonne continuation.

Mammouth du PHP | 619 Messages

24 mai 2013, 11:04

Bonjour,

pour un accès a un espace membre vos mieux éviter le $_GET :)

test sur une page a cote de ton site ce code normalement la premier fois le array sera vide mais au prochain il devrai avoir tes infos
<?php
session_start();

print_r($_SESSION);

if(isset($_POST)){
   $login=$_POST['login'];
   $password=md5($_POST['password']);
    

  $_SESSION['user']=array("login"=>$login,"password"=>$password);

}
?>
<form action="" method="POST">
<input type="text" name="login" />
<input type="password" name="password" />
<input type="submit" value="go" />
</form>

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

24 mai 2013, 11:53

comme je l'indique, coder pour register globals = OFF c'est rattraper plus de 10 ans de non évolution du code.

De plus ce paramètre est supprimé depuis la version 5.4 et c’est un paris sur l'avenir car les hébergeurs y viennent et en dehors d'avoir un serveur perso tu n'auras pas le choix ;)

Je sais que c'est galère et que tu va y passer du temps, rien que pour savoir d'où provient une variable (c'est du vécu) mais à ce prix ton code sera au moins lisible et précis.

Ensuite pour le coté sécurisation, il faut que tu comprenne bien ce que fait le register globals = on

Avec ce paramètre toutes les variables issue de formulaire ($_GET ou POST), de l'url ($_GET), de cookie ($_COOKIE), session ($_SESSION), serveur ($_SERVER) etc sont déclarées directement dans le code.

donc une valeur passer dans l'url, disons http://tonsiteatoi.com?login=412
va donner dans le code une variable $login(qui aura pour valeur 412).

Maintenant imagine que tu ai une variable de session qui s'appel truc.
à la version ante diluvienne tu aurais ce code
<?php
session_start();
session_register('login');
$login= 412;
?>
ce qui correspond, en utilisant les supers globales à
<?php
session_start();
$_SESSION['login'] = 412
?>
donc si l'on arrive sur une page qui vérifie qu'un membre est connecté tu as un code qui peux ressembler à ça
<?php
session_start();
if(!$login) { // on est d'accord à ne pas faire il faut utiliser isset ou empty, mais c'est malheureusement souvent le cas .... 
    echo 'faut  être connecté oust, du balai';
}
else {
    echo 'coucou le membre : '.$login;
}
?>
donc avec ce code et les lignes du dessus tu te rend compte que le mec qui est connecté va afficher ce qu'il y a dans le else, mais aussi le mec qui met dans l'url ?login=xxx.

Maintenant imagine sur un forum comme ici, et que login correspond à l'id de l'utilisateur dans la table sql qui va bien. Tu affiche le profile d'un membre, de préférence un administrateur, tu affiche les pages d'administration juste en mettant ?login=l'id de l'admin.

==> tu a créé une faille de sécurité.

Autre chose, la collision des variables.

si tu as oublié que tu a une variable de session email et que dans un formulaire de contact (par exemple) tu demande d'entrer un email, dans un champs texte qui s'appel email. A la validation comment peux tu être certain de ce que va contenir $email ?
pour cela il y a un paramètre variable_order qui indique l'ordre de création des variables et donc d'écréasement puisse qu'elle auront le même nom.
Par défaut c'est EGPCS pour (ENV ,GET, POST, COOKIE et SERVER). L'ordre est important car il s'agit de l'ordre dans lequel les variables seront créer.
du coup si tu as une variable en get elle sera écrasée par une du même nom en post, qui peux être écrasée par une du même nom en cookie etc .
au final du n'aura surement pas la valeur que tu souhaite.

Ensuite les problème de ce genre peuvent aussi être du à d'autre chose comme un formulaire d'upload qui laisse passer n'importe quoi, un formulaire de connexion qui ne controle pas les données et n'échappe aucune valeur du coup tu crée une faille de type injection SQL (cf google).

Donc au final récupère ton code sur ta machine, configure php pour register globals = PHP (si php < 5.4 sinon c'est pas défaut) et corrige ton code.


bon courage.

@+
Il en faut peu pour être heureux ......

Mammouth du PHP | 619 Messages

24 mai 2013, 12:40

Bonjour,

Merci Moogli pour les explications je comprends mieux l’utilité de cette option maintenant par chance (on va dire cela ) j'ai toujours utilise dans mes codes directement les sessions ou cookie au besoin

Bonne chance a toi marih