Undefined variables : y a-t-il un inconvenient/ risque ?
5 réponses
fff
Bonjour à tous,
Je me pose une question concernant une pratique courante pour moi :
utiliser des variables qui peuvent être définies ou non.
Par exemple :
<?php
echo $coucou;
?>
Si $coucou n'est pas définie je ne vois rien s'afficher et sinon sa
valeur s'affiche.
Tout va bien pour moi mais je me demande si ça a des répercutions sur le
serveur ou autre chose, notamment des questions de sécurité, ou si tout
simplement c'est une mauvaise pratique.
Dans ce dernier cas y a-t-il une « bonne » pratique ?
Note : je ne me vois pas faire des :
if(isset($coucou)) echo $coucou;
à longueur de page...
C'est juste une interrogation en passant après avoir activé le
error_reporting(E_ALL) sur une page.
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Olivier Miakinen
[...]
<?php echo $coucou; ?>
Si $coucou n'est pas définie je ne vois rien s'afficher et sinon sa valeur s'affiche.
Tout va bien pour moi mais je me demande si ça a des répercutions sur le serveur ou autre chose, notamment des questions de sécurité, ou si tout simplement c'est une mauvaise pratique.
Les deux. C'est toujours une mauvaise pratique de ne pas initialiser ses variables, et cela peut devenir une faille de sécurité si elles sont initialisées par l'appeleant dans une requête GET ou POST.
Dans ce dernier cas y a-t-il une « bonne » pratique ?
Oui. 1) Ne jamais utiliser une variable que tu n'as pas initialisée. 2) Pour une variable qui doit venir de l'appelant, faire un truc du style de ce qui suit :
if (isset($_REQUEST['coucou'])) { $coucou = $_REQUEST['coucou']; if (tests_variable_incorrecte) { $coucou = ''; } } else { $coucou = ''; }
Note : je ne me vois pas faire des : if(isset($coucou)) echo $coucou; à longueur de page...
En effet. Le code ci-dessus n'est à exécuter qu'une fois, en début de script.
C'est juste une interrogation en passant après avoir activé le error_reporting(E_ALL) sur une page.
Excellente idée. Tu dois arriver à zéro erreur en mode E_ALL.
[...]
<?php
echo $coucou;
?>
Si $coucou n'est pas définie je ne vois rien s'afficher et sinon sa
valeur s'affiche.
Tout va bien pour moi mais je me demande si ça a des répercutions sur le
serveur ou autre chose, notamment des questions de sécurité, ou si tout
simplement c'est une mauvaise pratique.
Les deux. C'est toujours une mauvaise pratique de ne pas initialiser ses
variables, et cela peut devenir une faille de sécurité si elles sont
initialisées par l'appeleant dans une requête GET ou POST.
Dans ce dernier cas y a-t-il une « bonne » pratique ?
Oui.
1) Ne jamais utiliser une variable que tu n'as pas initialisée.
2) Pour une variable qui doit venir de l'appelant, faire un truc du
style de ce qui suit :
if (isset($_REQUEST['coucou'])) {
$coucou = $_REQUEST['coucou'];
if (tests_variable_incorrecte) {
$coucou = '';
}
} else {
$coucou = '';
}
Note : je ne me vois pas faire des :
if(isset($coucou)) echo $coucou;
à longueur de page...
En effet. Le code ci-dessus n'est à exécuter qu'une fois, en début de
script.
C'est juste une interrogation en passant après avoir activé le
error_reporting(E_ALL) sur une page.
Excellente idée. Tu dois arriver à zéro erreur en mode E_ALL.
Si $coucou n'est pas définie je ne vois rien s'afficher et sinon sa valeur s'affiche.
Tout va bien pour moi mais je me demande si ça a des répercutions sur le serveur ou autre chose, notamment des questions de sécurité, ou si tout simplement c'est une mauvaise pratique.
Les deux. C'est toujours une mauvaise pratique de ne pas initialiser ses variables, et cela peut devenir une faille de sécurité si elles sont initialisées par l'appeleant dans une requête GET ou POST.
Dans ce dernier cas y a-t-il une « bonne » pratique ?
Oui. 1) Ne jamais utiliser une variable que tu n'as pas initialisée. 2) Pour une variable qui doit venir de l'appelant, faire un truc du style de ce qui suit :
if (isset($_REQUEST['coucou'])) { $coucou = $_REQUEST['coucou']; if (tests_variable_incorrecte) { $coucou = ''; } } else { $coucou = ''; }
Note : je ne me vois pas faire des : if(isset($coucou)) echo $coucou; à longueur de page...
En effet. Le code ci-dessus n'est à exécuter qu'une fois, en début de script.
C'est juste une interrogation en passant après avoir activé le error_reporting(E_ALL) sur une page.
Excellente idée. Tu dois arriver à zéro erreur en mode E_ALL.
fff
1) Ne jamais utiliser une variable que tu n'as pas initialisée. 2) Pour une variable qui doit venir de l'appelant, faire un truc du style de ce qui suit :
if (isset($_REQUEST['coucou'])) { $coucou = $_REQUEST['coucou']; if (tests_variable_incorrecte) { $coucou = ''; } } else { $coucou = ''; }
Je fais toujours la vérification pour les variables $_POST, $_GET et donc tout ce qui est $_REQUEST, je donne d'ailleurs un nom différent à la variable passée par l'URL (ou IRI pour les plus « hip » d'entre vous) qu'a la variable que je vais réellement utiliser (j'ai découvert avec effroi que mon hébergeur, qui a pourtant bonne réputation, règle register_globals sur ON).
Note : je ne me vois pas faire des : if(isset($coucou)) echo $coucou; à longueur de page...
En effet. Le code ci-dessus n'est à exécuter qu'une fois, en début de script.
Certes, mais il y a parfois de nombreuses variables... Bien-sûr c'est de la paresse, ou peut-être un manque d'organisation, voire de rigueur...
C'est juste une interrogation en passant après avoir activé le error_reporting(E_ALL) sur une page.
Excellente idée. Tu dois arriver à zéro erreur en mode E_ALL.
Tout à fait d'accord, je n'en suis pas là mais je vais suivre ton conseil qui, cette fois encore, me paraît judicieux.
Question subsidiaire : si on est arrivé à un débroussaillage parfait, est-il raisonnable/utile de laisser E_ALL sur un site en production ?
Sébastien
PS : Olivier, ton code fonctionne toujours à merveille !
1) Ne jamais utiliser une variable que tu n'as pas initialisée.
2) Pour une variable qui doit venir de l'appelant, faire un truc du
style de ce qui suit :
if (isset($_REQUEST['coucou'])) {
$coucou = $_REQUEST['coucou'];
if (tests_variable_incorrecte) {
$coucou = '';
}
} else {
$coucou = '';
}
Je fais toujours la vérification pour les variables $_POST, $_GET et
donc tout ce qui est $_REQUEST, je donne d'ailleurs un nom différent à
la variable passée par l'URL (ou IRI pour les plus « hip » d'entre vous)
qu'a la variable que je vais réellement utiliser (j'ai découvert avec
effroi que mon hébergeur, qui a pourtant bonne réputation, règle
register_globals sur ON).
Note : je ne me vois pas faire des :
if(isset($coucou)) echo $coucou;
à longueur de page...
En effet. Le code ci-dessus n'est à exécuter qu'une fois, en début de
script.
Certes, mais il y a parfois de nombreuses variables... Bien-sûr c'est de
la paresse, ou peut-être un manque d'organisation, voire de rigueur...
C'est juste une interrogation en passant après avoir activé le
error_reporting(E_ALL) sur une page.
Excellente idée. Tu dois arriver à zéro erreur en mode E_ALL.
Tout à fait d'accord, je n'en suis pas là mais je vais suivre ton
conseil qui, cette fois encore, me paraît judicieux.
Question subsidiaire : si on est arrivé à un débroussaillage parfait,
est-il raisonnable/utile de laisser E_ALL sur un site en production ?
Sébastien
PS :
Olivier, ton code fonctionne toujours à merveille !
1) Ne jamais utiliser une variable que tu n'as pas initialisée. 2) Pour une variable qui doit venir de l'appelant, faire un truc du style de ce qui suit :
if (isset($_REQUEST['coucou'])) { $coucou = $_REQUEST['coucou']; if (tests_variable_incorrecte) { $coucou = ''; } } else { $coucou = ''; }
Je fais toujours la vérification pour les variables $_POST, $_GET et donc tout ce qui est $_REQUEST, je donne d'ailleurs un nom différent à la variable passée par l'URL (ou IRI pour les plus « hip » d'entre vous) qu'a la variable que je vais réellement utiliser (j'ai découvert avec effroi que mon hébergeur, qui a pourtant bonne réputation, règle register_globals sur ON).
Note : je ne me vois pas faire des : if(isset($coucou)) echo $coucou; à longueur de page...
En effet. Le code ci-dessus n'est à exécuter qu'une fois, en début de script.
Certes, mais il y a parfois de nombreuses variables... Bien-sûr c'est de la paresse, ou peut-être un manque d'organisation, voire de rigueur...
C'est juste une interrogation en passant après avoir activé le error_reporting(E_ALL) sur une page.
Excellente idée. Tu dois arriver à zéro erreur en mode E_ALL.
Tout à fait d'accord, je n'en suis pas là mais je vais suivre ton conseil qui, cette fois encore, me paraît judicieux.
Question subsidiaire : si on est arrivé à un débroussaillage parfait, est-il raisonnable/utile de laisser E_ALL sur un site en production ?
Sébastien
PS : Olivier, ton code fonctionne toujours à merveille !
FAb
fff writes:
Bonjour à tous, [...]
Tout va bien pour moi mais je me demande si ça a des répercutions sur le serveur ou autre chose, notamment des questions de sécurité, ou si tout simplement c'est une mauvaise pratique.
Peut donner les noms des chemins des scripts : fuite d'information minime mais fuite quand même. Si les scripts sont dans des répertoires non protégés, il y a du coup un risque de visite des-dits répertoires. Et peut-être contiennent-ils des fichiers de données sensibles (logins/mdp par base de données etc).
Dans ce dernier cas y a-t-il une « bonne » pratique ?
Initialiser ou encadrer avec isset.
Note : je ne me vois pas faire des : if(isset($coucou)) echo $coucou; à longueur de page...
Est-ce sain d'utiliser le contenu de variable non initialisée ?
C'est juste une interrogation en passant après avoir activé le error_reporting(E_ALL) sur une page.
Bin un fois le script développé *et* validé y a plus de pb.
FAb
fff <sdd@fgds.com> writes:
Bonjour à tous,
[...]
Tout va bien pour moi mais je me demande si ça a des répercutions sur le serveur
ou autre chose, notamment des questions de sécurité, ou si tout simplement c'est
une mauvaise pratique.
Peut donner les noms des chemins des scripts : fuite d'information minime mais
fuite quand même. Si les scripts sont dans des répertoires non protégés, il y a
du coup un risque de visite des-dits répertoires. Et peut-être contiennent-ils
des fichiers de données sensibles (logins/mdp par base de données etc).
Dans ce dernier cas y a-t-il une « bonne » pratique ?
Initialiser ou encadrer avec isset.
Note : je ne me vois pas faire des :
if(isset($coucou)) echo $coucou;
à longueur de page...
Est-ce sain d'utiliser le contenu de variable non initialisée ?
C'est juste une interrogation en passant après avoir activé le
error_reporting(E_ALL) sur une page.
Bin un fois le script développé *et* validé y a plus de pb.
Tout va bien pour moi mais je me demande si ça a des répercutions sur le serveur ou autre chose, notamment des questions de sécurité, ou si tout simplement c'est une mauvaise pratique.
Peut donner les noms des chemins des scripts : fuite d'information minime mais fuite quand même. Si les scripts sont dans des répertoires non protégés, il y a du coup un risque de visite des-dits répertoires. Et peut-être contiennent-ils des fichiers de données sensibles (logins/mdp par base de données etc).
Dans ce dernier cas y a-t-il une « bonne » pratique ?
Initialiser ou encadrer avec isset.
Note : je ne me vois pas faire des : if(isset($coucou)) echo $coucou; à longueur de page...
Est-ce sain d'utiliser le contenu de variable non initialisée ?
C'est juste une interrogation en passant après avoir activé le error_reporting(E_ALL) sur une page.
Bin un fois le script développé *et* validé y a plus de pb.
FAb
Olivier Miakinen
Je fais toujours la vérification pour les variables $_POST, $_GET et donc tout ce qui est $_REQUEST, je donne d'ailleurs un nom différent à la variable passée par l'URL (ou IRI pour les plus « hip » d'entre vous) qu'a la variable que je vais réellement utiliser (j'ai découvert avec effroi que mon hébergeur, qui a pourtant bonne réputation, règle register_globals sur ON).
Oh ! Raison de plus pour initialiser tes variables. Si je comprends bien, tu testais les variables que tu avais prévu de recevoir par $_REQUEST, mais pas celles qui ne sont pas censées provenir de l'extérieur. Or c'est précisément ces dernières qui sont le plus sensibles aux attaques : puisque tu ne penses pas qu'elles puissent être modifiées par un cracker, tu leur fais confiance, alors qu'elles sont tout autant modifiables avec register_globals sur ON !
Donc : - isset($_REQUEST['coucou'])) pour les paramètres ; - $coucou = '' pour les autres variables.
Qu'on se le dise !
Question subsidiaire : si on est arrivé à un débroussaillage parfait, est-il raisonnable/utile de laisser E_ALL sur un site en production ?
Beaucoup recommandent de ne pas laisser E_ALL pour un site en prod. Pour moi qui n'ai que des pages perso, je laisse tout en E_ALL.
PS : Olivier, ton code fonctionne toujours à merveille !
J'en suis ravi. N'hésite pas à compléter la table, si tu as un peu de temps !
Je fais toujours la vérification pour les variables $_POST, $_GET et
donc tout ce qui est $_REQUEST, je donne d'ailleurs un nom différent à
la variable passée par l'URL (ou IRI pour les plus « hip » d'entre vous)
qu'a la variable que je vais réellement utiliser (j'ai découvert avec
effroi que mon hébergeur, qui a pourtant bonne réputation, règle
register_globals sur ON).
Oh ! Raison de plus pour initialiser tes variables. Si je comprends
bien, tu testais les variables que tu avais prévu de recevoir par
$_REQUEST, mais pas celles qui ne sont pas censées provenir de
l'extérieur. Or c'est précisément ces dernières qui sont le plus
sensibles aux attaques : puisque tu ne penses pas qu'elles puissent être
modifiées par un cracker, tu leur fais confiance, alors qu'elles sont
tout autant modifiables avec register_globals sur ON !
Donc :
- isset($_REQUEST['coucou'])) pour les paramètres ;
- $coucou = '' pour les autres variables.
Qu'on se le dise !
Question subsidiaire : si on est arrivé à un débroussaillage parfait,
est-il raisonnable/utile de laisser E_ALL sur un site en production ?
Beaucoup recommandent de ne pas laisser E_ALL pour un site en prod. Pour
moi qui n'ai que des pages perso, je laisse tout en E_ALL.
PS :
Olivier, ton code fonctionne toujours à merveille !
J'en suis ravi. N'hésite pas à compléter la table, si tu as un peu de
temps !
Je fais toujours la vérification pour les variables $_POST, $_GET et donc tout ce qui est $_REQUEST, je donne d'ailleurs un nom différent à la variable passée par l'URL (ou IRI pour les plus « hip » d'entre vous) qu'a la variable que je vais réellement utiliser (j'ai découvert avec effroi que mon hébergeur, qui a pourtant bonne réputation, règle register_globals sur ON).
Oh ! Raison de plus pour initialiser tes variables. Si je comprends bien, tu testais les variables que tu avais prévu de recevoir par $_REQUEST, mais pas celles qui ne sont pas censées provenir de l'extérieur. Or c'est précisément ces dernières qui sont le plus sensibles aux attaques : puisque tu ne penses pas qu'elles puissent être modifiées par un cracker, tu leur fais confiance, alors qu'elles sont tout autant modifiables avec register_globals sur ON !
Donc : - isset($_REQUEST['coucou'])) pour les paramètres ; - $coucou = '' pour les autres variables.
Qu'on se le dise !
Question subsidiaire : si on est arrivé à un débroussaillage parfait, est-il raisonnable/utile de laisser E_ALL sur un site en production ?
Beaucoup recommandent de ne pas laisser E_ALL pour un site en prod. Pour moi qui n'ai que des pages perso, je laisse tout en E_ALL.
PS : Olivier, ton code fonctionne toujours à merveille !
J'en suis ravi. N'hésite pas à compléter la table, si tu as un peu de temps !
Thibaut Allender
(j'ai découvert avec effroi que mon hébergeur, qui a pourtant bonne réputation, règle register_globals sur ON).
pour une question de comptabilité des "anciens" scripts, il vaut mieux... sauf si l'hebergeur veut perdre tous ses clients