Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

probleme changement de version des varaibales

12 réponses
Avatar
LF36
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

10 réponses

1 2
Avatar
P'tit Marcel
voici mon problème :
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/

Avatar
Thief13
page1.php
<?php

if ($action == '')
{
Elle sort d'où la variable action ?

//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)
}
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 ?

}
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']))
{

}
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
}

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...

Avatar
Olivier Miakinen
Un petit complément à la réponse de P'tit Marcel...

Le 28/02/2007 11:54, P'tit Marcel répondait à 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"


Avatar
Jean-Francois Ortolo
Olivier Miakinen wrote:

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"



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

Avatar
Olivier Miakinen

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"


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.


Avatar
Jean-Francois Ortolo
Olivier Miakinen wrote:

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

Avatar
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.

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.

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.

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é
}


Avatar
Thierry

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

Avatar
Jean-Francois Ortolo
Olivier Miakinen wrote:


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


Avatar
Olivier Miakinen

Bonjour Monsieur



Salut patron ;)


Mes respects, Monseigneur.

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



1 2