Discussion:
lecture d'une variable
(trop ancien pour répondre)
m***@walla.com
2006-12-19 11:53:33 UTC
Permalink
Bonjour

comment faire pour lire une variable du genre

$mavariable="id";
echo $_GET['".$mavariable."'];

je ne sais pas pourquoi ne marche pas !
CrazyCat
2006-12-19 12:04:25 UTC
Permalink
Post by m***@walla.com
comment faire pour lire une variable du genre
$mavariable="id";
echo $_GET['".$mavariable."'];
echo $_GET[$mavariable];
--
Astuces pour webmasters: http://www.crazycat.info
Tchat francophone: http://www.crazy-irc.net
Dominique Ottello
2006-12-19 17:07:05 UTC
Permalink
Post by CrazyCat
Post by m***@walla.com
comment faire pour lire une variable du genre
$mavariable="id";
echo $_GET['".$mavariable."'];
echo $_GET[$mavariable];
Les variables dynamiques du style $_GET[$ma_var] ou $_POST[$ma_var] ne
fonctionnent pas à l'intérieur d'une fonction.
Il faut alors utiliser $_REQUEST[$ma_var]

Par exemple :
function retourne_para($nom,$defaut) {
if (isset($_REQUEST[$nom])) return $_REQUEST[$nom];
else return $defaut;
}
--
Ce n'est pas parce que l'erreur se propage qu'elle devient vérité. Gandhi
Technologie aéronautique : http://aviatechno.free.fr (http://ottello.net)
Concorde dans la presse de 1965 à 2003 : http://le.pointu.free.fr
f***@gmail.com
2006-12-19 21:26:55 UTC
Permalink
salut
Post by Dominique Ottello
Les variables dynamiques du style $_GET[$ma_var] ou $_POST[$ma_var] ne
fonctionnent pas à l'intérieur d'une fonction.
Il faut alors utiliser $_REQUEST[$ma_var]
$_GET, $_POST, tout comme $_REQUEST ou encore $_COOKIE sont des
variables superglobales et sont TOUTES accessibles dans les fonctions.

Fab
Bruno Desthuilliers
2006-12-19 21:26:55 UTC
Permalink
Post by Dominique Ottello
Post by CrazyCat
Post by m***@walla.com
comment faire pour lire une variable du genre
$mavariable="id";
echo $_GET['".$mavariable."'];
echo $_GET[$mavariable];
Les variables dynamiques du style $_GET[$ma_var] ou $_POST[$ma_var] ne
fonctionnent pas à l'intérieur d'une fonction.
Pardon ?

# truc.php
<?php

function truc($name) {
if (isset($_GET[$name])) {
echo "\$_GET[$name] == $_GET[$name]\n";
}
else {
echo "oops ?";
}
}

truc("truc");
?>

http://localhost/~bruno/truc.php?truc=bidule

=>

$_GET[truc] == bidule
Post by Dominique Ottello
Il faut alors utiliser $_REQUEST[$ma_var]
function retourne_para($nom,$defaut) {
if (isset($_REQUEST[$nom])) return $_REQUEST[$nom];
else return $defaut;
}
N'importe quoi. Tu ferais mieux de Lire le Fameux Manuel au lieu de
poster des âneries.
John GALLET
2006-12-20 08:36:53 UTC
Permalink
Bonjour,
Post by Dominique Ottello
function retourne_para($nom,$defaut) {
if (isset($_REQUEST[$nom])) return $_REQUEST[$nom];
else return $defaut;
}
C'est bien de faire de l'adaptation des cours que je diffuse, mais encore
faudrait-il lire la page 18 avant la page 19.

<CITE>
Si pour une raison quelconque on souhaite se restreindre aux arguments
reçus par méthode GET, on peut utiliser le tableau prédéfini $_GET à la
place de $_REQUEST, ou le tableau $_POST pour se limiter aux arguments
reçus par méthode POST.
</CITE>

Si j'utilise $_REQUEST dans ce genre de chose, c'est uniquement pour
rendre tranparent le mode de transmission de la variable. Ce qui est débat
en soi mais un autre.

a++;
JG
Jean-Francois Ortolo
2006-12-20 10:25:06 UTC
Permalink
Post by CrazyCat
Post by m***@walla.com
comment faire pour lire une variable du genre
$mavariable="id";
echo $_GET['".$mavariable."'];
echo $_GET[$mavariable];
Bonjour Monsieur

C'est bon à savoir, ça va me servir pour mon package d'administration
de sondages, que je suis en train de concocter ( amoureusement, celà va
sans dire... )

En effet, je ne peux pas prévoir exactement le nombre de variables
$_POST[] qui vont être transmises en paramètres à mon script principal
d'administration, mais je peux prévoir une suite de variables de la
forme: $_POST['var_1'] , $_POST['var_2'] etc...

Donc, il me suffit de lire progressivement les variables var_$indice
avec $indice croissant à partir de 1, et d'arrêter quand la valeur
retournée n'existe pas.

Excellent.

J'envisage, pour la clarté du code, une séparation en fonctions,
chacune prenant en charge une fonctionnalité particulière, et demandant
une entrée de l'utilisateur ( souris ou clavier, un formulaire POST quoi ).

Au moment de l'envoi du formulaire de chaque fonction, le même script
est appelé avec une variable indiquant quelle prochaine fonction il
faudra appeler à partir du script. Donc les liens d'exécution entre les
fonctions sont fixés dans chaque fonction précédente.

Enfin, chaque fonction est appelée à partir du script où elle figure,
son interface écran ( mettons web ) s'affiche, et elle s'exécute
jusqu'au retour vers le script appelant, puis jusqu'à la fin du script
appelant.

C'est un paradigme que je n'ose appeler objet, puisqu'il n'y a pas
d'héritage ni de polymorphisme, par contre la structure des appels aux
fonctions peut très bien être un graphe, et non pas seulement une
arborescence, comme c'est le cas en programmation séquentielle classique.

Bien à vous.
Amicalement.

Jean-François Ortolo
--
Visitez mon site gratuit donnant des Statistiques
et des Historiques Graphiques sur les Courses de Chevaux:
http://www.ortolojf-courses.com
John GALLET
2006-12-20 14:01:19 UTC
Permalink
Bonjour,
Post by Jean-Francois Ortolo
En effet, je ne peux pas prévoir exactement le nombre de variables
$_POST[] qui vont être transmises en paramètres à mon script principal
d'administration,
Si, si : il suffit de le passer en paramètre... Et si on une incohérence
entre ce nombre éclarer et celles présentes, on sort.
C'est exactement pour faire ce genre de trucs que le paragraphe
http://faqfclphp.free.fr/#rub2.15 a été écrit, à une époque où par défaut
register_globals était à On et donc on récupérait directement les
variables de nom dynamique depuis l'extérieur.
Post by Jean-Francois Ortolo
Au moment de l'envoi du formulaire de chaque fonction, le même script
est appelé avec une variable indiquant quelle prochaine fonction il
faudra appeler à partir du script. Donc les liens d'exécution entre les
fonctions sont fixés dans chaque fonction précédente.
Si j'ai bien compris, c'est le principe du hub : au lieu d'avoir
action1.php et action2.php on a $action qui arrive sur index.php et on
fait un switch dessus.

Dans tous les cas, meme si c'est un script d'admin, attention à bien
valider l'action courante à exécutée, car ele arrive du navigateur.

a++
JG
Jean-Francois Ortolo
2006-12-20 22:17:02 UTC
Permalink
Post by John GALLET
Bonjour,
Si, si : il suffit de le passer en paramètre... Et si on une incohérence
entre ce nombre éclarer et celles présentes, on sort.
Merci beaucoup Monsieur

Comme d'habitude, les fautes d'inattention dans la conception, c'est
mortel...

C'est vrai que votre solution est aussi plus sécurisée que la mienne,
qui est il est vrai sécurité minimum.
Post by John GALLET
Si j'ai bien compris, c'est le principe du hub : au lieu d'avoir
action1.php et action2.php on a $action qui arrive sur index.php et on
fait un switch dessus.
Dans tous les cas, meme si c'est un script d'admin, attention à bien
valider l'action courante à exécutée, car ele arrive du navigateur.
Oh, ben...

Je vais simplement passer un indice numérique pour l'accès aux
fonctions *et* faire une vérification par identificateur de session, genre:

Si appel au script sans identificateur de session == celui enregistré
dans la base de données => ouverture nouvelle session avec
identificateur numérique = qqchose genre: md5sum(microtime()), puis
appel de la fonction donnant le menu principal d'administration.

Si appel au script avec identificateur de session == l'un de ceux
enregistrés dans la base, alors exécution normale.

Evidemment suppression à chaque entrée, des sessions durant depuis
longtemps ( manière classique, une seule requête SQL ).

L'accès au script est évidemment protégé par login/password avec
fichier .htaccess et .htpasswd de façon classique.

Pour l'affichage public du sondage choisi sur le site web ( une
fonction du package dans un autre script ), la prise en compte de
l'adresse IP pour l'unicité du sondage, ne se fera qu'à partir de la
prise en compte des données entrées par l'utilisateur, après l'appel au
deuxième script ( autre script ), et donnera lieu au même message de
remerciements, que les données soient ou non prises en compte ( adresse
IP client déjà dans la base => non prise en compte des données +
affichage de ce message. )

Je sais bien que l'adresse IP n'est pas suffisante pour les
authentifications, mais je sais que pour ma part, j'efface
systématiquement les cookies de mon navigateur à chaque fois que je
l'arrête, donc rien n'empêchant n'importe qui de faire de même s'il veut
voter plusieurs fois, je préfère ne tenir compte que de l'adresse IP.

La vérification par identificateur de session aléatoire pour le
script d'admin, me paraît fiable théoriquement, qu'en pensez-vous ?

Evidemment, si les cookies ne sont pas permis par le navigateur
client, l'id de session sera transmis par mes soins, en paramètre POST,
ce qui est faisable dans les même conditions qu'en GET. Il ne me semble
pas que l'on puisse usurper une session avec un autre navigateur
différent, à moins de conditions très très particulières, qu'il me
semble inutile de prévoir pour une telle utilisation ( fonctionnement
et sécurité du script d'admin des sondages. )

Merci de me donner votre avis sur le degré de sécurité,
particulièrement pour l'unicité des sondages par prise en compte de
l'adresse IP.

Je sais que dans votre site, vous dites bien qu'il est strictement
impossible d'authentifier des accès HTTP, mais bon, je ne cherche pas le
degré de fiabilité maximum...

Bien à vous.
Respectueusement.

Jean-François Ortolo
--
Visitez mon site gratuit donnant des Statistiques
et des Historiques Graphiques sur les Courses de Chevaux:
http://www.ortolojf-courses.com
John GALLET
2006-12-21 08:58:14 UTC
Permalink
Re,
Post by Jean-Francois Ortolo
Comme d'habitude, les fautes d'inattention dans la conception, c'est
mortel...
Ca arrive à tout le monde. Le plus compliqué, c'est de faire simple.
Post by Jean-Francois Ortolo
C'est vrai que votre solution est aussi plus sécurisée que la mienne,
qui est il est vrai sécurité minimum.
Absolument pas, passer le nombre de variables permet juste de ne pas
s'emmerder pour écrire la boucle qui les récupère. Ni plus ni moins de
sécurité là dedans, c'est seulement plus facile à écrire. Dans les deux
cas, il faut ensuite vérifier si on a toutes les variables.
Post by Jean-Francois Ortolo
Si appel au script sans identificateur de session == celui enregistré
dans la base de données => ouverture nouvelle session avec
identificateur numérique = qqchose genre: md5sum(microtime()), puis
appel de la fonction donnant le menu principal d'administration.
Je n'ai pas compris la première ligne : pourquoi donne-t-on un accès quand
on compare une donnée NON RECUE avec une donnée en base ? Le "sans" doit
être une faute de frappe.
Post by Jean-Francois Ortolo
Si appel au script avec identificateur de session == l'un de ceux
enregistrés dans la base, alors exécution normale.
Ah bah non, c'était volontaire. Donc je n'ai pas compris la logique
d'attribution du token.
Post by Jean-Francois Ortolo
L'accès au script est évidemment protégé par login/password avec
fichier .htaccess et .htpasswd de façon classique.
"Houba, houba, hop !" (c) Marsupilami Franquini. On a plusieurs
utilisateurs avec des sessions (celle de ci-dessus) différentes ou un seul
luser ?
Post by Jean-Francois Ortolo
La vérification par identificateur de session aléatoire pour le
script d'admin, me paraît fiable théoriquement, qu'en pensez-vous ?
cf http://www.saphirtech.com/cours_php.html chapitre sessions.
Post by Jean-Francois Ortolo
Merci de me donner votre avis sur le degré de sécurité,
particulièrement pour l'unicité des sondages par prise en compte de
l'adresse IP.
Il n'y a aucune solution fiable concernant les sondages. Vous aviez déjà
eut strictement le même problème sur l'accès aux stats restreintes si ma
mémoire est bonne. L'alternative est l'adresse email, qui permet tout
autant de truander le système si on le souhaite mais ne poubellise pas des
votes légitimes.

En étant bien conscient que ceci retirera des votes normaux, pour ce
besoin, l'IP est une solution acceptable. On pourrait avoir un système de
time out de quelques heures/jours pour la liste des "ip votantes".
Post by Jean-Francois Ortolo
Je sais que dans votre site, vous dites bien qu'il est strictement
impossible d'authentifier des accès HTTP, mais bon, je ne cherche pas le
degré de fiabilité maximum...
Pour un système de sondage anonyme, je n'en connais pas qui soit
incontournable par un truandeur. On peut juste lui rendre la vie pénible.

On peut aussi de manière classique ajouter la demande de saisie d'une
suite de lettres/chiffres affichés par la GD lib, non pas tellement pour
éviter les scripts, mais surtout ici pour que le truandeur se lasse. La
liste des séquences valides affichées est conservée côté serveur, on tente
un DELETE et si affected_rows==1 c'est qu'elle était valide d'une part
(donc on peut la compter dans les stats) et tout refresh échouera.
Post by Jean-Francois Ortolo
Respectueusement.
aïe mes chevilles !

JG
Bruno Desthuilliers
2006-12-21 23:10:14 UTC
Permalink
Post by John GALLET
Re,
Post by Jean-Francois Ortolo
Comme d'habitude, les fautes d'inattention dans la conception, c'est
mortel...
Ca arrive à tout le monde. Le plus compliqué, c'est de faire simple.
DansMesBras(tm) !-)
Jean-Francois Ortolo
2006-12-21 23:10:14 UTC
Permalink
Post by John GALLET
Post by Jean-Francois Ortolo
Si appel au script sans identificateur de session == celui enregistré
dans la base de données => ouverture nouvelle session avec
identificateur numérique = qqchose genre: md5sum(microtime()), puis
appel de la fonction donnant le menu principal d'administration.
Je n'ai pas compris la première ligne : pourquoi donne-t-on un accès quand
on compare une donnée NON RECUE avec une donnée en base ? Le "sans" doit
être une faute de frappe.
Post by Jean-Francois Ortolo
Si appel au script avec identificateur de session == l'un de ceux
enregistrés dans la base, alors exécution normale.
Ah bah non, c'était volontaire. Donc je n'ai pas compris la logique
d'attribution du token.
Je vous prie de m'excuser de ma formulation un peu rapide.

Le "sans" concerne l'égalité "==" qui la suit, un peu comme une
négation logique.

Le problème étant d'empêcher un intrus extérieur de lancer ce script
avec ce paramètre de branchement vers la fonction, ( donc avec un faux
paramètre, puisque non produit par le script lui-même ), on fait en
sorte de "suivre" les accès à ce script, par une session ( par user
évidemment, mais il n'y a théoriquement que l'administrateur qui a le
login/password d'accès ). Cette session comporte simplement une variable
de session numérique ou alphabétique complexe. Par exemple: la valeur
de microtime()

Première possibilité: Au début du script, la session démarre, si
cette variable de session n'existe pas ou n'a pas une valeur existante
dans la base de données, c'est que c'est le premier appel à ce script:
Donc cette variable complexe de session est générée, mise dans la base
de données, et la fonction de branchement est la première, c'est-à-dire
celle du menu d'administration.

Evidemment, la valeur de la variable gérant le branchement aux
fonctions, est transmise à chaque fois en mode POST, après modification
dans la fonction précédente et/ou dans le début du script en fonction du
branchement ultérieur et/ou du contenu des données transmises en POST au
script.

Deuxième possibilité: Si au début du script, après le démarrage de la
session, la variable numérique ou alphabétique complexe existe et figure
dans la base de données, c'est que cet appel à ce script, provient bien
de ce même script, et donc il est possible de faire confiance aux
données transmises en POST lors de cet appel, puisque la session ne peut
pas, pratiquement, être usurpée ( théoriquement ).

Dans ce cas, le traitement des données transmises en POST est
effectué dans le début du script ( enregistrement dans la base de
données par exemple ), puis éventuellement la variable gérant le
branchement aux fonctions, est modifiée en fonction des données
transmises en POST au script. En effet, ce n'est qu'au moment où on
prend connaissance des choix précédents de l'administrateur, que l'on
saura quelle prochaine fonction appeler. la fonction correcte est
appelée par le script, puis les choix sont faits par l'utilisateur sur
l'interface web de cette fonction, puis son formulaire POST est lancé,
et ainsi de suite, jusqu'à ce que l'ensemble du traitement opéré par le
script, suivant les besoins de l'utilisateur, ait été fait. Donc la
dernière prise en compte des choix de l'administrateur sera faite, puis
l'exécution du script sera terminée.

Il faut dans l'étape préalable d'analyse fonctionnelle, que je
précise bien la logique d'évolution entre les différentes fonctions,
suivant les choix de l'administrateur, et la trasmission des données
saisies par l'administrateur. ( Quelles données pour quelles
fonctionnalités, etc.. )

Celà, je pense l'avoir déjà mis au point, dans une première approche
fonctionnelle, que j'ai mise dans un fichier readme.txt

Je sais, ce n'est pas le rôle d'un fichier readme.txt, mais bon... ;)
Post by John GALLET
Post by Jean-Francois Ortolo
Merci de me donner votre avis sur le degré de sécurité,
particulièrement pour l'unicité des sondages par prise en compte de
l'adresse IP.
En étant bien conscient que ceci retirera des votes normaux, pour ce
besoin, l'IP est une solution acceptable. On pourrait avoir un système de
time out de quelques heures/jours pour la liste des "ip votantes".
Bon.

Mais si l'on mémorise les adresses IP ayant voté, avec disons un
timestamp, et que l'on efface les adresses IP après un délai, les mêmes
personne vont pouvoir revoter ?

Je ne vois pas quel intérêt présente ce dispositif.

Merci beaucoup beaucoup de vos conseils.

Bien à vous.
Respectueusement.

Aïe, aïe, mes pieds. ;)

Jean-François Ortolo
--
Visitez mon site gratuit donnant des Statistiques
et des Historiques Graphiques sur les Courses de Chevaux:
http://www.ortolojf-courses.com
John GALLET
2006-12-22 08:11:58 UTC
Permalink
Re,
Post by Jean-Francois Ortolo
Je vous prie de m'excuser de ma formulation un peu rapide.
Sans problèmes, le elcteur n'était peut-être pas très réveillé non plus...
Post by Jean-Francois Ortolo
Le problème étant d'empêcher un intrus extérieur de lancer ce script
avec ce paramètre de branchement vers la fonction, ( donc avec un faux
paramètre, puisque non produit par le script lui-même ),
Ca c'est facile, ca tient en une seule ligne :
exit("F*CK YOU");
Post by Jean-Francois Ortolo
sorte de "suivre" les accès à ce script, par une session ( par user
évidemment, mais il n'y a théoriquement que l'administrateur qui a le
login/password d'accès ). Cette session comporte simplement une variable
de session numérique ou alphabétique complexe. Par exemple: la valeur
de microtime()
Oui mais non.
1) on ne donne pas de ressource, quelle qu'elle soit, à quiconque n'a pas
à accéder à cette page. Rien, nada, bernique.
2) quand on fait un backoffice, on fait toujours une répartition semblable
à ceci :

RACINE/frontal.php
RACINE/private/config.php avec .htaccess DENY FROM ALL
RACINE/administration/ avec .htaccess login/pass commun à tous les admins
RACINE/administration/privateadmin/ressources_adm.php avec .htaccess DENY
FROM ALL

Les fichiers au niveau de frontal.php sont ceux qui sont susceptibles de
recevoir d'être appelés par http GET/POST de la partie visible par la
terre entière.

Les fichiers dans private/ sont appelés par require( ) et require_once()
par les script publics. PERSONNE n'a à les appeler directement, donc on
interdit tout accès http par un .htaccess DENY FROM ALL. Si on n'a pas
apache, leut première ligne commence par :
if(!defined('MY_SECU12345')) exit();
et on définit la constante dans les scripts publics.

La même architecture est disponible pour la partie d'admnistration. Un
premier .htaccess protège l'accès aux scripts uniquement pour empêcher
toutes les attaques automatisées par robots. S'il y a plusieurs admins,
ils peuvent ici partager un seul login/pass dans le .htaccess, et ensuite
l'application gère son propre système d'accès.
Post by Jean-Francois Ortolo
Première possibilité: Au début du script, la session démarre, si
cette variable de session n'existe pas ou n'a pas une valeur existante
Oui. Mais est-ce bien raisonnable d'ouvrir une session anonyme dans la
partie administration à quelqu'un qu'on ne connait pas ? Non.
Donc si on ne reçoit pas de variable de session ou si elle est invalide
c'est directement :

require('privateadmin/print_login_form.html');
exit();

Et fin de la discussion.
Post by Jean-Francois Ortolo
Donc cette variable complexe de session est générée, mise dans la base
de données, et la fonction de branchement est la première, c'est-à-dire
celle du menu d'administration.
Mais de quel droit ?! Pourquoi aurait-on une quelconque velléité
d'exécuter du code sans savoir à qui on a affaire dans la partie ADMIN ?
Post by Jean-Francois Ortolo
Deuxième possibilité: Si au début du script, après le démarrage de la
session, la variable numérique ou alphabétique complexe existe et figure
dans la base de données, c'est que cet appel à ce script, provient bien
de ce même script,
La requête est légitime. Il est ici normal d'exécuter du code.
Post by Jean-Francois Ortolo
et donc il est possible de faire confiance aux
données transmises en POST lors de cet appel,
Non, ça jamais. La requête peut donner lieu à exécution de code parce
qu'elle est légitime (le token d'identification est valide) mais les
données reçues du monde extérieur ne peuvent JAMAIS êter considérées comme
dignes de confiance, ne serait-ce qu'à cause des fautes de frappe : si je
tape 1 0 (espace en trop) dans une zone de quantité parce que, comme
d'hab, j'ai pas encore enlevé les moufles et le café est trop chaud, la
requête SQL va faire une drôle de gueule.
Post by Jean-Francois Ortolo
Dans ce cas, le traitement des données transmises en POST est
effectué dans le début du script ( enregistrement dans la base de
données par exemple ), puis éventuellement la variable gérant le
branchement aux fonctions, est modifiée en fonction des données
transmises en POST au script. En effet, ce n'est qu'au moment où on
prend connaissance des choix précédents de l'administrateur, que l'on
saura quelle prochaine fonction appeler.
Euh... L'oeuf ou la poule ? Reprenons. Quand on appelle une
fonction/méthode il faut bien à un moment ou à un autre vérifier qu'on a
toutes nos billes pourle faire, et qu'il ne manque pas de données
obligatoires pour ce faire. Or ceci dépend de chaque traitement. Donc il
faut commencer par récupérer, d'une manière ou d'une autre, peu importe,
l'action à exécuter, et c'est elle la racine de l'arbre d'appel : selon
l'action à exécuter, on vérifie si on a bien toutes les informations
nécessaires pour le traitement (reçues directement, ou stockées ailleurs,
en session au sens large, en base, sur la lune, etc.).
Post by Jean-Francois Ortolo
suivant les choix de l'administrateur, et la trasmission des données
saisies par l'administrateur. ( Quelles données pour quelles
fonctionnalités, etc.. )
Ca tombe bien, cf ci-dessus.
Post by Jean-Francois Ortolo
Mais si l'on mémorise les adresses IP ayant voté, avec disons un
timestamp, et que l'on efface les adresses IP après un délai, les mêmes
personne vont pouvoir revoter ?
Oui, mais ça ce sera le cas de toutes façons : la majeure partie de la
population ne possède pas des IP fixes... Si je me connecte par wanamou le
matin puis l'après midi, je n'aurai pas la même IP. Et ne parlons pas des
utilisateurs derrière des proxys (le cas le plus connu est AOL) qui
changent d'IP à chaque requête (sur une page qui a 10 images, on peut voir
11 adresses IP différentes...)
Post by Jean-Francois Ortolo
Je ne vois pas quel intérêt présente ce dispositif.
Uniquement empêcher quelqu'un de s'exciter sur le bouton refresh. Pas
plus, pas moins. Et encore, marchera pas pour les utilisateurs d'AOL.

a++;
JG
Jean-Francois Ortolo
2006-12-28 15:02:04 UTC
Permalink
Bonjour Monsieur

Je suis désolé de ne pas avoir répondu plus tôt, j'étais en vacances
de Noël chez mon père, dans un coin pas trop perdu du pays basque... ;)

Voir mes réponses ci-dessous.

Jean-François Ortolo
Post by John GALLET
Post by Jean-Francois Ortolo
Le problème étant d'empêcher un intrus extérieur de lancer ce script
avec ce paramètre de branchement vers la fonction, ( donc avec un faux
paramètre, puisque non produit par le script lui-même ),
N'oublions pas, que tout le répertoire où se trouve la partie
administration, est sécurisé par login/password dans les fichiers
.htaccess et .htpasswd

Théoriquement donc, personne ne devrait pouvoir avoir accès à ce
répertoire, directement de l'extérieur.

Cependant, le fait de suivre les appels au *même* script
d'administration par une session avec une variable complexe (
microtime() au moment de l'ouverture de la session, nous garantit même
dans ce cas ( login/password volés ), que le script d'admin ne peut
s'exécuter, que conformément à sa programmation.
Post by John GALLET
Post by Jean-Francois Ortolo
sorte de "suivre" les accès à ce script, par une session ( par user
évidemment, mais il n'y a théoriquement que l'administrateur qui a le
login/password d'accès ). Cette session comporte simplement une variable
de session numérique ou alphabétique complexe. Par exemple: la valeur
de microtime()
Oui mais non.
1) on ne donne pas de ressource, quelle qu'elle soit, à quiconque n'a pas
à accéder à cette page. Rien, nada, bernique.
Quelle ressource ?

Si c'est le résultat de microtime(), elle peut être visible comme
cookie temporaire, si la session se fait par cookie. Evidemment, si le
visiteur n'est pas l'administrateur et a volé le login/password, il
s'aperçoit à la rigueur, qu'il y a une session, et que la variable de
session, ressemble à une valeur de microtime(). Mais que voulez-vous
qu'il en retire ultérieurement ? Il ne peut pas deviner aucune valeur
ultérieure de microtime(), qui a une résolution de une micro-seconde, et
de toute façon, il a déjà volé le login/password, alors...

En fait, je reconnais que la protection par session, ne servirait à
rien, puisque toute la sécurité du script d'admin, tient à sa protection
par login/password.
Post by John GALLET
Post by Jean-Francois Ortolo
Donc cette variable complexe de session est générée, mise dans la base
de données, et la fonction de branchement est la première, c'est-à-dire
celle du menu d'administration.
Mais de quel droit ?! Pourquoi aurait-on une quelconque velléité
d'exécuter du code sans savoir à qui on a affaire dans la partie ADMIN ?
L'accès au répertoire d'admin, est protégé par login/password.
Post by John GALLET
Post by Jean-Francois Ortolo
Deuxième possibilité: Si au début du script, après le démarrage de la
session, la variable numérique ou alphabétique complexe existe et figure
dans la base de données, c'est que cet appel à ce script, provient bien
de ce même script,
La requête est légitime. Il est ici normal d'exécuter du code.
Post by Jean-Francois Ortolo
et donc il est possible de faire confiance aux
données transmises en POST lors de cet appel,
Non, ça jamais. La requête peut donner lieu à exécution de code parce
qu'elle est légitime (le token d'identification est valide) mais les
données reçues du monde extérieur ne peuvent JAMAIS êter considérées comme
dignes de confiance, ne serait-ce qu'à cause des fautes de frappe : si je
tape 1 0 (espace en trop) dans une zone de quantité parce que, comme
d'hab, j'ai pas encore enlevé les moufles et le café est trop chaud, la
requête SQL va faire une drôle de gueule.
Ce ne sont pas des données reçues de l'extérieur. En effet, le fait
que la variable de session ait authentifié l'accès au script par POST,
indique que cet appel POST, provient du script lui-même.

Donc, il est possible de faire confiance à ces données reçues en
POST, puisqu'elles viennent du script lui-même, et que chaque appels
POST précédents à ce script, aient été authentifiés par la variable de
session.

Côté verrouillage exclusif d'accès, c'est évident qu'au début de
l'ajout d'un nouveau sondage ( c'est un cas particulier ), j'incrémente
le numéro d'indice du sondage. Ce numéro d'indice, servira de paramètre
à la fonction appelant l'interface du sondage, dans le script public
servant à l'affichage du sondage.

Cependant, il me paraît nécéssaire d'authentifier l'appel POST au
deuxième script public, enregistrant les données POST du script public
d'affichage, de la façon que j'ai indiquée, par une variable de session,
qui n'est ni devinable, ni simulable.

Donc, au total: Pas de mécanisme d'authentification par session dans
le script d'administration, mais mécanisme d'authentification par
session, dans les scripts publics.

En effet, le seul script existant dans le répertoire
d'administration, est le script d'administration, et de toute façon,
l'accès à ce répertoire est protégé par un login/password.

Si le monsieur malhonnête et méchant, a mon login/password, il peut
de toute façon, faire ce qu'il veut de ma base de données.

Il me semblerait plus sécuritaire, de logguer les accès à ce
répertoire, pour être informé du vol de login/password, histoire de le
changer.

Si le méchant hacker, qui m'en veut particulièrement, a simplement
modifié ma base de données d'une façon imprévisible, il me serait à
priori dificile de m'en apercevoir, si effectivement il appelé le script
d'admin avec des variables POST trafiquées. Pour parer à cette
éventualité, il faudrait donc quand même, faire une authentification par
session, même dans le script d'admin ( en plus des scripts publics ).

A charge pour moi de faire un programme pour détecter les
incohérences dans ma bdd, suite à ce type d'intrusion ( exécution
normale du script d'admin, mais modification de la bdd. ) Dans le cas de
l'exécution normale, ce type de programme serait beaucoup plus facile à
faire.
Post by John GALLET
Post by Jean-Francois Ortolo
Dans ce cas, le traitement des données transmises en POST est
effectué dans le début du script ( enregistrement dans la base de
données par exemple ), puis éventuellement la variable gérant le
branchement aux fonctions, est modifiée en fonction des données
transmises en POST au script. En effet, ce n'est qu'au moment où on
prend connaissance des choix précédents de l'administrateur, que l'on
saura quelle prochaine fonction appeler.
Euh... L'oeuf ou la poule ? Reprenons. Quand on appelle une
fonction/méthode il faut bien à un moment ou à un autre vérifier qu'on a
toutes nos billes pourle faire, et qu'il ne manque pas de données
obligatoires pour ce faire. Or ceci dépend de chaque traitement. Donc il
faut commencer par récupérer, d'une manière ou d'une autre, peu importe,
l'action à exécuter, et c'est elle la racine de l'arbre d'appel : selon
l'action à exécuter, on vérifie si on a bien toutes les informations
nécessaires pour le traitement (reçues directement, ou stockées ailleurs,
en session au sens large, en base, sur la lune, etc.).
C'est sûr, que je peux faire une vérification de la cohérence des
variables POST reçues, entre elles. Je ne pense pas qu'il y ait besoin
de pousser la sécurité, jusqu'à faire une concordance entre des
variables de session dédiées, et certaines vaiables POST reçues. C'est
de l'ordre du possible, mais le mécanisme de session, pour les deux
scripts publics, me paraît suffisamment sécurisé, pour ne pas avoir à
m'embarasser de proécédés supplémentaires de sécurité, que la cohérence
des variables POST, entre elles.

Pour ce qui est du script d'admin, toute sa sécurité repose sur le
secret du login/password.

Eventuellement, rien ne m'empêche, de supprimer du serveur ce script
d'admin, une fois que l'ensemble de la gestion des sondages, ait été
fait, et de le remettre quand j'en ai besoin. Je sais bien, c'est
foireux... ;)

Par ailleurs, rien ne m'empêche, pour la variable POST de switching
entre les fonctions, d'utiliser des valeurs complexes, difficiles à
deviner, et qui ne seront de toute façon pas vues du visiteur, les
données étant en mode POST.
Post by John GALLET
Post by Jean-Francois Ortolo
Mais si l'on mémorise les adresses IP ayant voté, avec disons un
timestamp, et que l'on efface les adresses IP après un délai, les mêmes
personne vont pouvoir revoter ?
Oui, mais ça ce sera le cas de toutes façons : la majeure partie de la
population ne possède pas des IP fixes... Si je me connecte par wanamou le
matin puis l'après midi, je n'aurai pas la même IP. Et ne parlons pas des
utilisateurs derrière des proxys (le cas le plus connu est AOL) qui
changent d'IP à chaque requête (sur une page qui a 10 images, on peut voir
11 adresses IP différentes...)
Post by Jean-Francois Ortolo
Je ne vois pas quel intérêt présente ce dispositif.
Uniquement empêcher quelqu'un de s'exciter sur le bouton refresh. Pas
plus, pas moins. Et encore, marchera pas pour les utilisateurs d'AOL.
Oui.

Dans ce cas, peut-être faudrait-il simplement, en plus de l'adresse
IP obsolète, supprimer la variable de session ( des scripts publics ),
de la base de données, ce qui arrête l'authentification, avec
éventuellement backlistage de l'adresse IP correspondante, sans pour
autant modifier le message par défaut, pour ne pas alerter le visiteur
malhonnête.

Merci beaucoup pour tous vos conseils.

"La connaissance s'accroît quand on la partage." ;)

Bien à vous.
Amicalement.

Jean-François Ortolo
--
Visitez mon site gratuit donnant des Statistiques
et des Historiques Graphiques sur les Courses de Chevaux:
http://www.ortolojf-courses.com
Jean-Francois Ortolo
2006-12-28 17:42:08 UTC
Permalink
Oui.
Dans ce cas, peut-être faudrait-il simplement, en plus de l'adresse IP
obsolète, supprimer la variable de session ( des scripts publics ), de
la base de données, ce qui arrête l'authentification, avec
éventuellement backlistage de l'adresse IP correspondante, sans pour
autant modifier le message par défaut, pour ne pas alerter le visiteur
malhonnête.
Excusez-moi de mon erreur.

J'ai fait une sorte de lapsus, qui vient du fait que mon esprit était
un peu brouillé.

Ce problème de refresh, ne peut provenir, théoriquement, que de
l'appel au script public de prise en compte des données d'affichage du
sondage, dans la bdd. Le script d'administration, lui, est protégé par
login/password.

Donc, effectivement, authentification par variable de session au
niveau du script public de prise en compte dans la bdd, donc il
semblerait, qu'il faille supprimer la variable de session, ce qui aurait
pour effet de supprimer l'authentification par cette variable de
session, lors d'un refresh éventuel.

Mais... Si cet effacement de la variable de session juste à la fin de
la première exécution du deuxième script public ( dédié à
l'enregistrement dans la bdd ), si cet effacement permet d'éviter les
refresh, ne vaut-il pas mieux garder les adresses IP durant un délai
plus grand ( tout en les supprimant aussi après ce délai ), ce qui
servira, non pas à éviter les refresh, mais à permettre à des visiteurs
différents d'adresses IP identiques, de répondre au sondage ?

Dans ce cas, les adresses IP serviraient, à éviter que des visiteurs
répondent entièrement plusieurs fois au sondage, de manière répétée.

Le message d'acknowledgment donné par le deuxième script, ne variant
pas suivant succès ou échec, les hackers ne seraient pas censés
s'apercevoir du fait, qu'il leur est nécéssaire d'attendre pour refaire
le sondage.

Une question: Dans ce cas, pourriez-vous me dire, quel délai serait
envisageable, pour cette utilisation ?

Merci beaucoup à vous pour vos conseils.

Bien à vous.
Amicalement.

Jean-François Ortolo
--
Visitez mon site gratuit donnant des Statistiques
et des Historiques Graphiques sur les Courses de Chevaux:
http://www.ortolojf-courses.com
Jean-Francois Ortolo
2006-12-28 19:52:23 UTC
Permalink
Bonjour Monsieur

J'ajoute, pour être plus clair:

La partie admin privée, est entièrement séparée de la partie
publique, qui sert, elle, aux sondages proprement dits.

La partie publique, comprendra deux scripts PHP, le premier contenant
uniquement une fonction d'affichage du sondage appelée par le script PHP
du site web, à l'endroit de l'affichage du sondage. Cette fonction ne
prendra qu'un paramètre numérique, qui sera l'indice du sondage affiché,
dont les données d'affichage et de sondage seront contenues entièrement
dans la base de données. Ce premier script sera inclus dans le script
PHP du site web. Le deuxième script public, quant à lui servira à
enregistrer dans la base de données, les données reçues en POST
provenant du premier script. Une variable de session assurera que cet
appel POST, provient bien du premier script correctement utilisé, et non
pas directement d'un hacker quelconque.


La partie admin, située dans un répertoire ad hoc séparé et protégé
par .htaccess et .htpasswd, avec login/password classique, sera composée
d'un seul script PHP, qui contiendra ce que j'ai déjà indiqué au début
de cet échange. Je préfère ne pas faire d'include dans ce script ( à
part celui du fichier de configuration ), car je ne veux pas que
d'autres scripts PHP inclus, puissent être éventuellement appelés de
façon intrusive.

Donc, la seule irrégularité possible pour la partie admin, concernera
ce script d'admin, protégé par login/password, et peut-être ( si vous
voulez me donner votre avis à ce sujet ) par une variable de session
assurant que tout appel POST à ce script, aura été fait par ce même script.

Ouf. Voilà le complément à ces messages que j'ai envoyés précédemment.

Bien à vous.
Amicalement.

Jean-François Ortolo
--
Visitez mon site gratuit donnant des Statistiques
et des Historiques Graphiques sur les Courses de Chevaux:
http://www.ortolojf-courses.com
Jean-Francois Ortolo
2007-01-21 18:13:55 UTC
Permalink
Bonjour Monsieur Gallet

Ce problème de refresh, ne peut provenir, théoriquement, que de
l'appel au script public de prise en compte des données d'affichage du
sondage, dans la bdd. Le script d'administration, lui, est protégé par
login/password.

Donc, effectivement, authentification par variable de session au
niveau du deuxième script public de prise en compte dans la bdd, donc
il semblerait, qu'il faille supprimer la variable de session en fin
d'excéution du deuxième script public, ce qui aurait pour effet de
supprimer l'authentification par cette variable de session, lors d'un
refresh éventuel.

Mais... Si cet effacement de la variable de session juste à la fin de
la première exécution du deuxième script public ( dédié à
l'enregistrement dans la bdd ), si cet effacement permet d'éviter les
refresh, ne vaut-il pas mieux garder les adresses IP durant un délai
plus grand, tout en les supprimant aussi après ce délai, ce qui
servira, non pas à éviter les refresh, mais à permettre à des visiteurs
différents d'adresses IP identiques, de répondre au sondage ?

Dans ce cas, les adresses IP serviraient, à éviter que des visiteurs
répondent entièrement plusieurs fois au sondage, de manière répétée.

Le message d'acknowledgment donné par le deuxième script public, ne
variant pas suivant succès ou échec, les hackers ne seraient pas censés
s'apercevoir du fait, qu'il leur est nécéssaire d'attendre pour refaire
le sondage.

Une question: Dans ce cas, pourriez-vous me dire, quel délai serait
envisageable, pour cette utilisation ?

Ouf. Voilà le complément à ces messages que j'ai envoyés précédemment.

Bien à vous.
Amicalement.

Jean-François Ortolo

Thierry Boudet
2006-12-21 11:26:15 UTC
Permalink
Post by Jean-Francois Ortolo
particulièrement pour l'unicité des sondages par prise en compte de
l'adresse IP.
Et quand il y a deux cent personnes derriere une seule adresse IP ?
Ou quand l'adresse IP change presque à chaque requete ?
--
Post by Jean-Francois Ortolo
S'il est plus expressif, cela veut-il dire qu'il existe des algorithmes
implémentables en lisp qui ne peuvent pas l'être avec Sed ?
Par Dieu, non. Par toi ou moi, oui.
- PB - fr.comp.os.unix -
John GALLET
2006-12-20 09:16:08 UTC
Permalink
Post by m***@walla.com
echo $_GET['".$mavariable."'];
je ne sais pas pourquoi ne marche pas !
Outre les réponses déjà faites donnant la syntaxe à utiliser : c'est la
base de la gestion des strings en PHP. Tout ce qui est entre ' n'est pas
interprêté. Donc ici, on recherche dans $_GET une clef qui s'appelerait
".$mavariable." (avec les ", les . et le $ dans le nom de la clef).

Le piège inverse courant avec au contraire les " :

$path="C:\abc\toto"; // et paf! C:\abc\ oto
car \t c'est une tabulation.

HTH
a++;
JG
Continuer la lecture sur narkive:
Loading...