séquelles de sécurisation de serveur

Le retraité
Invité n'ayant pas de compte PHPfrance

04 juil. 2005, 13:44

J'ai fait un programme qui fonctionne correctement :) , malheureusement (pour moi) le serveur qui l'héberge va reforcer sa sécurité en
- activant le mode "safe_mode"
- activant la variable magic_quotes_gpc
- mettant la variable register_globals à OFF
Après certains essais avec cette nouvelle future configuration, apparemment, mes variables définies comme "global" se perdent dans la nature :cry:
Et les passages de paramêtres par l'Url du style
"etablissement.php?affiche=vrai"
ne sont plus reconnus non plus :cry:
Y aurait-il une bonne âme qui pourrait me conseiller quelques modification de code avant que je me prenne la tête à refaire tout mon programme ?
Merci d'avance à tous
Alain

Administrateur PHPfrance
Administrateur PHPfrance | 3131 Messages

04 juil. 2005, 15:23

Les changements induits par register_globals à Off (c'est une option importante, plus personne aujourd'hui ne code en register_globals à On, elle est à Off par défaut partout ou devrait l'être) :

===============------------------------------

- Une variable passée par url script.php?variable=valeur n'est plus accédée par $variable mais par $_GET['variable'] (utilisation du tableau superglobal $_GET).

===============------------------------------

- Une variable passée par formulaire <form method="POST" ...>...<input type="text" name="variable" value="valeur" />... n'est plus accédée par $variable mais par $_POST['variable'] (utilisation du tableau superglobal $_POST). Si la méthode du formulaire n'est pas POST, mais GET, les variables sont passées par url et c'est la première méthode.

===============------------------------------

- La manipulation des sessions n'est pas la même. Les fonction session_register() & cie sont désuées. On préfèrera l'utilisation directe du tableau superglobal $_SESSION.
// ouverture d'une session utilisateur
session_start();
// déclaration ou modification d'une variable de session : pas de session_register !
$_SESSION['variable'] = 'valeur'; 
// utilisation d'une variable de session
echo $_SESSION['variable'];
// vérification de l'existence d'une variable de session
if (isset($_SESSION['variable'])) {
    // la variable existe dans la session
}
else {
    // elle n'existe pas
}
===============------------------------------

- idem pour les cookies (utilisation du tableau superglobal $_COOKIE) et pour l'upload de fichier (tableau superglobal $_FILE ou $_FILES j'oublie tout le temps).

===============------------------------------

Le safe_mode implique d'autres restrictions que je n'ai pas en tête, mais a priori pour des scripts classiques, seul le register_globals pose vraiment problème.
Note que si tu suis ces bonnes pratiques, ton script fonctionnera en mode register_globals=Off, mais AUSSI register_globals=On. C'est donc la bonne façon de faire ;)

Invité
Invité n'ayant pas de compte PHPfrance

04 juil. 2005, 23:19

"l'Eléphant" de la rapidité de ta réponse....
Mais, si j'ai posté ma demande dans les "débutants PhP" c'est que, malgré la réussite d'un assez long programme, mes connaissances restent assez "fragiles", et ma "réussite" je la dois en grande partie à des gens comme toi en glanant des infos à gauche et à droite...
Aussi, encore une petite question STP avant de me lancer dans les modifs de code.
Si je comprends bien, quand je veux réutiliser mes variables, au lieu de les appeler "$variable" il faut que je les appelle par "$_GET['variable']"
C'est à dire, dans mon exemple de drapeau:
"etablissement.php?affiche=vrai"
Pour que ça marche comme avant, il me suffirait de tester "$_GET['affiche'] au lieu de tester $affiche comme je le fais jusqu'à maintenant...
Est-ce juste ???
Merci encore de ta gentillesse
Alain

Administrateur PHPfrance
Administrateur PHPfrance | 3131 Messages

05 juil. 2005, 08:45

C'est tout à fait ça ;)
Cela permet de séparer à coup sûr les variables de provenance différente, si une variable vient de l'url c'est $_GET, d'un formulaire posté c'est $_POST, d'une session c'est $_SESSION et d'un cookie c'est $_COOKIE.

Pour illustrer le problème que ça peut poser, imagine que pour autoriser l'accès à la zone d'administration du site tu utilises une page d'identification et une session. Dans ta page d'identification tu fais ceci :
session_start();
...
if ($motdepasseok) {
    $is_admin = true; // on note dans la session de l'utilisateur qu'il est bien admin
    session_register('is_admin');
}
Et dans admin.php tu vérifies qu'il s'est bien loggé :
session_start();
...
if ($is_admin) {
    echo 'Vous pouvez administrer tout le site, vous avez les pleins pouvoirs';
}
Avec register_globals à On, il aurait suffi d'aller sur admin.php?is_admin=1 pour zapper toute la séquence d'identification, et pour se retrouver administrateur sans avoir eu besoin de déballer le moindre outillage de hacker ;)
Bien sûr même avec register_globals à On on peut faire ce genre de traitement de façon sécurisée (en vérifiant que $is_admin est bien une variable de session) mais il y aura toujours confusion possible quant à l'origine des variables, et c'est la base de nombreuses failles.

Histoire que tu vois que ces nouvelles contraintes ne sortent pas de n'importe où ElePHPant

Eléphanteau du PHP | 11 Messages

05 juil. 2005, 10:57

Je n'ai plus "qu'à" me lancer dans les modifs...
A priori, je ne vois qu'un seul pb qui risque de me coincer, c'est les introductions de quotes(') dans ces nouveaux noms de variables quand la ligne de code contient déjà des (") et des (')...
comme, par exemple dans une expression telle que:
$sql = "select * from t_etablissements where nom_secteur like '$nom_secteur'";
Lors du remplacement de $nom_secteur par $POST['nom_secteur'], je crains le pire...!
Mais, ne soyons pas défaitiste... Si vraiment je ne m'en sors pas, je reviendrai abuser de ta patience....
Merci encore
Alain
Alain

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

05 juil. 2005, 11:04

C'est, entre autres, pour ça que je déconseille cet écriture :
$sql = "select * from t_etablissements where nom_secteur like '$nom_secteur'"; 
A remplacer par
$sql = "select * from t_etablissements where nom_secteur like '".$nom_secteur."'";


Ca marche aussi bien, même mieux car on est pas embeté avec les tableau ... :wink:
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphanteau du PHP | 11 Messages

05 juil. 2005, 14:22

Merci à ce nouveau "tuteur".
Je ne connaissais pas du tout cette syntaxe ....
C'est bien quote (') guillements (") et point (.) ?
Dans mon exemple ça ferait donc:

Code : Tout sélectionner

$sql = "select * from t_etablissements where nom_secteur like '".$POST['nom_secteur']."'";
Exact :?:
Alain

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

05 juil. 2005, 14:30

Tout a fait

En fait, pour que tu comprennes, le . sert à concatener (coller au bout si tu ne connait pas le terme) 2 chaines

Ce que je te propose de faire, c'est de concatener
"select * from t_etablissements where nom_secteur like '"
à
$POST['nom_secteur']
puis le résultat à
"'"
PHP est permissif puisqu'il interprete des variable dans les chaines (comme tu le faisait avant) mais cette méthode trouve ses limites lors de l'utilisation de tableaux

En plus, je trouve cette syntaxe plus lisible ... :wink:
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Administrateur PHPfrance
Administrateur PHPfrance | 3131 Messages

05 juil. 2005, 15:01

Une autre syntaxe existe pour le cas des tableaux :
$sql = "select * from t_etablissements where nom_secteur like '{$POST['nom_secteur']}'";
Cette syntaxe ne fonctionne bien sûr que pour des chaines entre double quotes (") sinon les variables ne sont pas intérprétées dans la chaine.
Quelques bons éditeurs reconnaissent cette syntaxe (dont Scite)

Mais c'est uniquement pour la culture, je recommande la méthode de zeus

Eléphanteau du PHP | 11 Messages

05 juil. 2005, 21:49

Vous êtes super...!
J'ai "tout compris"...
Oui je connaissais cette syntaxe et l'ai déjà utilisée pour les concaténations de chaînes de caractères, mais je ne savais pas que l'on pouvait également s'en servir dans de telles expressions...
Merci encore à vous 2
Grâce à vous je mourrai moins bête...
Amitiés
Ah, encore un dernier mot....
J'oubliai de vous demander si je devais continuer ou non à récupérer mes variables en début de script comme il m'avait été conseillé de le faire il y a 2 ans. Du style:

Code : Tout sélectionner

$nom_secteur=$HTTP_POST_VARS["nom_secteur"];
Faut-il l'adapter et mettre maintenant

Code : Tout sélectionner

$_POST['nom_secteur']=$HTTP_POST_VARS["nom_secteur"];
:?:
Pardon, j'abuse... Mais une réponse à ce style de soucis évite tellement de s'énerver et de perdre du temps...
Alain

Administrateur PHPfrance
Administrateur PHPfrance | 3131 Messages

05 juil. 2005, 23:17

J'oubliai de vous demander si je devais continuer ou non à récupérer mes variables en début de script comme il m'avait été conseillé de le faire il y a 2 ans. Du style:

Code : Tout sélectionner

$nom_secteur=$HTTP_POST_VARS["nom_secteur"];
Faut-il l'adapter et mettre maintenant

Code : Tout sélectionner

$_POST['nom_secteur']=$HTTP_POST_VARS["nom_secteur"];
:?:
Pardon, j'abuse... Mais une réponse à ce style de soucis évite tellement de s'énerver et de perdre du temps...
$_POST est un raccourci pour $HTTP_POST_VARS, donc dans un code ou tu as
$variable = $HTTP_POST_VARS['variable'];
...
echo $variable; // ou autre utilisation de la variable $variable
Il n'y a absolument rien à modifier.

Eléphanteau du PHP | 11 Messages

11 juil. 2005, 10:01

Après une vérification complète du programme, j'ai modifié toutes les récupérations de variables comme vous me l'avez conseillé: Tout fonctionne parfaitement bien malgré le passage de "register_globals" à off, sauf aux endroits où j'ai utilisé des redirections avec "header"....
Comment vaincre ce dernier écueil ???
Merci d'avance
Alain

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

11 juil. 2005, 10:18

Quand tu passes les variables par l'url, il faut récupérer avec $_GET et non plus $_POST

Tu y a pensé ?
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Administrateur PHPfrance
Administrateur PHPfrance | 3131 Messages

11 juil. 2005, 11:18

sauf aux endroits où j'ai utilisé des redirections avec "header"....
Comment vaincre ce dernier écueil ???
Il se passe quoi à ces endroits ?

Eléphanteau du PHP | 11 Messages

11 juil. 2005, 14:37

en ce qui concerne les variables $_GET et $_POST,
C'est "oui", évidemment, puisque c'est la consigne qui m'avait été donnée au départ par l'éléphant...(merci à lui)8)
Pour ce qui de se qui se passe aux endroits où j'utilise header:
La variable est "perdue".
Dans la page concernée , j'ai testé la session par "session_id()", le numéro de session est bien le même que la session ouverte au moment de l'alimentation des variables par $_SESSION["nom_secteur"]= $_POST["nom_secteur"];...
Je n'y comprends rien....

:?: :cry:
Alain