probleme changement de version des varaibales

Le
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
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 2
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
P'tit Marcel
Le #76206
voici mon problème :
j'ai conçu un certains nombre de script de la façon suivante
if ($action == '')

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/

Thief13
Le #76204
page1.php
<?php

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

//affichage en ligne des infos d'une table
// pour chaque ligne
ce serait pas plutot :

echo " (peso, je préfère :
echo ' 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...

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

Le 28/02/2007 11:54, P'tit Marcel répondait à LF36 :

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
Le #75968
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

Olivier Miakinen
Le #75966

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.


Jean-Francois Ortolo
Le #75962
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

Olivier Miakinen
Le #75961

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


Thierry
Le #75725

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

Jean-Francois Ortolo
Le #75724
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


Olivier Miakinen
Le #75723

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



Publicité
Poster une réponse
Anonyme