Discussion:
probleme changement de version des varaibales
(trop ancien pour répondre)
LF36
2007-02-28 09:59:35 UTC
Permalink
bonjour,

voici mon problème :
j'ai conçu un certains nombre de script de la façon suivante

page1.php
<?php

if ($action == '')
{

//affichage en ligne des infos d'une table
// pour chaque ligne
<a href=\"page1.php?action=mod&id=$id\">modifier</a>

}
elseif ($action == 'mod')
{

// affichage de l'enregistrement dans un form pour modif
// dans le form 2 champ masqué
<input type=\"hidden\" name=\"id\" value=\"$id\">
<input type=\"hidden\" name=\"action\" value=\"valid\">
}
elseif ($action == 'valid')
{

//update des modifs
// lien pour retour avec action = ''

}
?>

lorsque je veux passer ce script avec une version 'récente' de php en
changeant les variables action par

if ($_GET['action'] == '')
{

}
elseif ($_GET['action'] == 'mod')
{
etc etc
}

rein que dalle.
aprés plusieurs heures penché sur les les déclarations de variables et
autres $_GET, $_POST , $_REQUEST,
j'avoue être un peu perdu

en résumé comment faire pour faire fonctionné le bidule
merci d'avance
Laurent
P'tit Marcel
2007-02-28 10:54:09 UTC
Permalink
Post by LF36
j'ai conçu un certains nombre de script de la façon suivante
if ($action == '')
<a href=\"page1.php?action=mod&id=$id\">modifier</a>
elseif ($action == 'mod')
<input type=\"hidden\" name=\"action\" value=\"valid\">
elseif ($action == 'valid')
lorsque je veux passer ce script avec une version 'récente' de php en
changeant les variables action par
if ($_GET['action'] == '')
rein que dalle.
OK. On suppose que ton application ne gère rien de confidentiel ou de
sensible car sinon le codage serait à revoir complètement (voir le doc
proposé par John en ce cas: http://www.saphirtech.com/securite.html)

Le problème est que ta variable est passée tantôt en GET et tantôt en POST.

à mon sens, il faudrait un truc du genre :

$action = (isset($_REQUEST['action']) ? $_REQUEST['action'] : '');

while(true) {
switch($action) {
case '':
echo "<a href=\"$PHP_SELF?action=mod&id=$id\">modifier</a>\n";
...
break 2;
case 'mod':
echo "<input type=\"hidden\" name=\"action\" value=\"valid\">";
...
break 2;
case 'valid':
...on rejette en cas de mise à jour en masse (script kiddie)
...vérification qu'il y a une donnée à modifier
..... mise à jour
break 2;
default:
message d'erreur éventuel
$action = ''; # retour au cas ''
}
}

Là, c'est en version simplifiée. En fait il faudrait que chaque mode
soit géré dans une fonction dédiée qui serait appelée dans le switch


eça
--
P'tit Marcel
stats sur les forums modérés http://www.centrale-lyon.org/ng/
Olivier Miakinen
2007-02-28 19:17:30 UTC
Permalink
Un petit complément à la réponse de P'tit Marcel...
Post by P'tit Marcel
Post by LF36
<a href=\"page1.php?action=mod&id=$id\">modifier</a>
echo "<a href=\"$PHP_SELF?action=mod&id=$id\">modifier</a>\n";
Ne pas oublier d'écrire « &amp; » à la place de « & » :
"<a href=\"$PHP_SELF?action=mod&amp;id=$id\">modifier</a>\n"

Et si ton $id ne contient pas de guillemets simples, cela se simplifie en :
"<a href='$PHP_SELF?action=mod&amp;id=$id'>modifier</a>\n"
Jean-Francois Ortolo
2007-02-28 22:51:19 UTC
Permalink
Post by Olivier Miakinen
"<a href='$PHP_SELF?action=mod&amp;id=$id'>modifier</a>\n"
Objection votre Honneur

Entre guillemets simples, la valeur $i va devenir la string '$id'

Bien à vous.

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
Olivier Miakinen
2007-03-01 07:34:28 UTC
Permalink
Post by Jean-Francois Ortolo
Post by Olivier Miakinen
"<a href='$PHP_SELF?action=mod&amp;id=$id'>modifier</a>\n"
Objection votre Honneur
Entre guillemets simples, la valeur $i va devenir la string '$id'
Objection rejetée.

La chaîne de caractères PHP étant encadrée de guillemets doubles, la
valeur de $id sera correctement interprétée. Le fait que cette chaîne
PHP contienne elle-même des guillemets simples (qui se retrouveront dans
le code HTML) n'a aucune influence sur le résultat de l'interprétation
des variables.
Jean-Francois Ortolo
2007-03-01 11:52:04 UTC
Permalink
Post by Olivier Miakinen
Objection rejetée.
La chaîne de caractères PHP étant encadrée de guillemets doubles, la
valeur de $id sera correctement interprétée. Le fait que cette chaîne
PHP contienne elle-même des guillemets simples (qui se retrouveront dans
le code HTML) n'a aucune influence sur le résultat de l'interprétation
des variables.
Bonjour Monsieur

Je vous prie de m'excuser pour cette présentation un peu cavalière. ;)

Et aussi, à ma grande honte, d'avoir avancé une contre-vérité, sans
le savoir évidemment.

Je croyais seulement que, comme pour tout langage, l'effet de
l'environnement le plus proche des instructions ( donc les guillemets
simples ), avaient priorité sur l'environnement plus éloigné (
guillemets doubles ).

Il est vrai qu'encore maintenant, j'avoue ne pas comprendre comment
celà pourrait être possible, que le contenu entre guillemets simples,
puisse être interprété: Est-ce parce qu'il contient plusieurs tokens de
langage, et non pas seulement une variable ?

Bien à vous, merci de votre réponse.

Aves mes respects.

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
Olivier Miakinen
2007-03-01 12:56:50 UTC
Permalink
Post by Jean-Francois Ortolo
Post by Olivier Miakinen
Objection rejetée.
La chaîne de caractères PHP étant encadrée de guillemets doubles, la
valeur de $id sera correctement interprétée. Le fait que cette chaîne
PHP contienne elle-même des guillemets simples (qui se retrouveront dans
le code HTML) n'a aucune influence sur le résultat de l'interprétation
des variables.
Bonjour Monsieur
;-)

Je commence à m'habituer, mais cette entrée en matière me fait toujours
sourire. J'espère que tu me pardonneras, de même que de continuer à te
tutoyer alors que tu vouvoies tout le monde.
Post by Jean-Francois Ortolo
Je vous prie de m'excuser pour cette présentation un peu cavalière. ;)
Cela ne m'a pas gêné du tout, d'ailleurs j'ai répondu sur le même mode.
Post by Jean-Francois Ortolo
Et aussi, à ma grande honte, d'avoir avancé une contre-vérité, sans
le savoir évidemment.
Je croyais seulement que, comme pour tout langage, l'effet de
l'environnement le plus proche des instructions ( donc les guillemets
simples ), avaient priorité sur l'environnement plus éloigné (
guillemets doubles ).
Pourtant, le comportement de PHP en la matière est justement le même que
celui des autres langages :
1) une séquence de caractères commencée par " se termine par ", et peut
contenir des ' sans protection à l'intérieur ;
2) une séquence de caractères commencée par ' se termine par ', et peut
contenir des " sans protection à l'intérieur.
Post by Jean-Francois Ortolo
Il est vrai qu'encore maintenant, j'avoue ne pas comprendre comment
celà pourrait être possible, que le contenu entre guillemets simples,
puisse être interprété: Est-ce parce qu'il contient plusieurs tokens de
langage, et non pas seulement une variable ?
Le contenu n'est *pas* entre guillemets simples. Le contenu est entre
guillemets doubles, avec des guillemets simples à l'intérieur.

Quelques exemples :

$var = "XXX";

echo '$var'; // $var
echo '$var"'; // $var"
echo '"$var'; // "$var
echo '""$var'; // ""$var
echo '"$var"'; // "$var"

echo "$var"; // XXX
echo "$var'"; // XXX'
echo "'$var"; // 'XXX
echo "''$var"; // ''XXX
echo "'$var'"; // 'XXX'

if ("'" . "$var" . "'" === "'$var'") {
// le code ici est exécuté
}
Jean-Francois Ortolo
2007-03-01 18:28:10 UTC
Permalink
Post by Olivier Miakinen
Post by Jean-Francois Ortolo
Bonjour Monsieur
;-)
Je commence à m'habituer, mais cette entrée en matière me fait toujours
sourire. J'espère que tu me pardonneras, de même que de continuer à te
tutoyer alors que tu vouvoies tout le monde.
Salut patron ;)

Merci beaucoup pour votre information, qui m'a convaincu de ma
profonde nullité en PHP ;).

Pour le vouvoiement, je vous prie de m'excuser, c'est pour paraître
"jet set" ( ce que je ne suis pas évidemment ) ;)

Bien à vous, et mcerci pour votre réponse.
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
Olivier Miakinen
2007-03-01 19:13:38 UTC
Permalink
Post by Jean-Francois Ortolo
Post by Jean-Francois Ortolo
Bonjour Monsieur
Salut patron ;)
Mes respects, Monseigneur.
Post by Jean-Francois Ortolo
Pour le vouvoiement, je vous prie de m'excuser, c'est pour paraître
"jet set" ( ce que je ne suis pas évidemment ) ;)
Tant que tu ne te formalises pas du tutoiement en retour, il n'y a aucun
souci. En revanche, si ortolo.jeanfrancois.no_reply n'est pas ta vraie
adresse chez free.fr, ce serait sympa d'utiliser le TLD réservé à cet
effet, et de remplacer « free.fr » par exemple par « free.invalid » ou
bien par « free.fr.invalid ».

Amicalement,
--
Olivier Miakinen
Jean-Francois Ortolo
2007-03-01 21:14:45 UTC
Permalink
Post by Olivier Miakinen
Tant que tu ne te formalises pas du tutoiement en retour, il n'y a aucun
souci. En revanche, si ortolo.jeanfrancois.no_reply n'est pas ta vraie
adresse chez free.fr, ce serait sympa d'utiliser le TLD réservé à cet
effet, et de remplacer « free.fr » par exemple par « free.invalid » ou
bien par « free.fr.invalid ».
Amicalement,
Bonjour Monsieur

Je vous suis au contraire très reconnaissant de bien vouloir me
hisser ( oh, hisse ! ) à votre hauteur.

Je vous avoue que je pense que je ne mérite pas cet honneur.

J'ai le sentiment de ma profonde indignité.

Pour tout dire, je suis dans les derniers dessous. ;)

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
Olivier Miakinen
2007-03-01 22:02:53 UTC
Permalink
[...] votre hauteur [...] je ne mérite pas [...] profonde
indignité [...] derniers dessous [...]
Si tu le permets, on va arrêter là.

Cela étant -- et je te prie de ne pas répondre encore que c'était une
preuve de stupidité ou quoi que ce soit du même genre -- je rappelle que
c'est le TLD (Top Level Domain - domaine de premier niveau) qui doit
être « .invalid ». Avec une adresse en invalid.free.fr tu continues à
faire spammer free.fr, alors qu'une adresse se *terminant* par .invalid
sera arrêtée par le tout premier composant programmé par quelqu'un qui
lit les RFC -- à commencer par l'utilisateur.

Donc : <***@free.fr.INVALID>

Thierry
2007-03-01 13:31:37 UTC
Permalink
Post by P'tit Marcel
OK. On suppose que ton application ne gère rien de confidentiel ou de
sensible car sinon le codage serait à revoir complètement (voir le doc
proposé par John en ce cas: http://www.saphirtech.com/securite.html)
Je viens de lire cet excellent document.
Au risque de relancer un vieux débat je suis surpris de l'apparente
reticence à
l'utilisation des regexp.
Je les ai personnellement adoptées pour tester que c'est bien quelque chose
d'autorisée
qui entre. Typiquement mes scripts commencent par ceci:

$inputs = array (
'fTitle' => '#^[\w \-@_/]+$#', //une chaîne de caractère
'dirName' => '#^[\w \-_\\\/]+$#', //un nom de répertoire
'idLE' => '/^[0-9]+$/' //un entier
);
//test des entrées
if ( ($k = checkInputsForSecurity2($inputs, true)) != -1 ) {
throw new Exception ("preg_match(".$inputs[$k].", <span
style='background-color:menu;'>".addslashes($_REQUEST[$k])."</span>) =
false", 1);
}

ce qui à mon sens me permet bien d'éliminer les combinaisons de caractères
dangeureux
de mes entrés (', ", (, ), %, <, >)

suis je en train de me fourvoyer ?

la seule limitation que je vois à ce système c'est que les caractères cités
sont exclus
et donc inutilisables même de bonne foi.

thierry
Thief13
2007-02-28 10:57:10 UTC
Permalink
Post by LF36
page1.php
<?php
if ($action == '')
{
Elle sort d'où la variable action ?
Post by LF36
//affichage en ligne des infos d'une table
// pour chaque ligne
<a href=\"page1.php?action=mod&id=$id\">modifier</a>
ce serait pas plutot :
echo "<a href=\"page1.php?action=mod&id=$id\">modifier</a>"; ?
(peso, je préfère :
echo '<a href="page1.php?action=mod&id='.$id.'">modifier</a>';
Moin d'antislashs, et on repere mieux les vaiables)
Post by LF36
}
elseif ($action == 'mod')
{
// affichage de l'enregistrement dans un form pour modif
// dans le form 2 champ masqué
<input type=\"hidden\" name=\"id\" value=\"$id\">
<input type=\"hidden\" name=\"action\" value=\"valid\">
Pareil, c'est quoi ce code html au mileux de php, sans echo, sans ; ?
en plus, je comprend pas, tout à l'heure, tu envoi des truc en post, et
là, tu les envoi en get... il est ou le form ?
Post by LF36
}
elseif ($action == 'valid')
{
//update des modifs
// lien pour retour avec action = ''
}
?>
lorsque je veux passer ce script avec une version 'récente' de php en
changeant les variables action par
if ($_GET['action'] == '')
essaye :
if (isset($_GET['action']) && !empty($_GET['action']))
Post by LF36
{
}
elseif ($_GET['action'] == 'mod')
{
Bin, si tu passe des trucs un coup en post un coup en get comme tout a
l'heure,
elseif ($_REQUEST['action'] == 'mod')
comme ça t'es sur
Post by LF36
}
rein que dalle.
aprés plusieurs heures penché sur les les déclarations de variables et
autres $_GET, $_POST , $_REQUEST,
j'avoue être un peu perdu
bin, le code que tu fournit est vraiment pas claire, en plus, on sait
pas d'ou tu sort les trucs, comment tu les envoi...
Continuer la lecture sur narkive:
Loading...