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

Securite formulaire

8 réponses
Avatar
Lulu
Bonjour,

J'ai un formulaire avec 4 inputs de type "zone de saisie" (destinées à
des valeurs numeriques entières), 3 inputs de type "radio" et 11 inputs
de type "checkbox".

Le formulaire est de méthode "post" et je récupère le contenu des inputs
par une série de ligne du type $WL_start = $_POST['WL_start']

Pour les zones de saisie, je traite cette saisie par :

<?php
// si ce test est positif, c'est que l'utilisateur a saisi une valeur et cliqué
// le bouton "Dessiner le spectre"
if ( isset( $WL_start ) ) {
// il faut donc remettre la valeur de Value_WL_start à la valeur que l'utilisateur
// a postée à condition qu'elle soit "attendue"
// en premier lieu : numérique
if ( is_numeric( $WL_start ) ) {
$x = floor( $WL_start );
// en deuxième lieu, entière
if ( $x != $WL_start ) {
$WL_start = 380;
} else {
// en troisème lieu, dans le domaine visible, sinon 380 nm
if ( ( $x < 380 ) or ( $x >= 800 ) ) {
$WL_start = 380;
}
}
// non numérique :
} else {
$WL_start = 380;
}
}
?>

Est-ce que ce code empêche qu'un script-kiddie puisse falsifier le
comportement que j'attends de ma page ?

Pour mes trois boutons radios, je n'ai que le test de la valeur de la
variable "name" de mon input :
<?php
if ( ! isset( $choix_spectre ) ) {
//echo "choix_spectre is NOT set, setting it to 2 <br />\n";
$choix_spectre = 2;
}

if ( $choix_spectre == 1 ) {
//echo " --> Spectre continu<br />\n";
$checked_1 = "checked";
$checked_2 = "";
$checked_3 = "";
} else {
if ( $choix_spectre == 2 ) {
//echo " --> Spectre d'émission<br />\n";
$checked_1 = "";
$checked_2 = "checked";
$checked_3 = "";
} else {
if ( $choix_spectre == 3 ) {
//echo " --> Spectre d'absorption<br />\n";
$checked_1 = "";
$checked_2 = "";
$checked_3 = "checked";
}
}
}

Et pour mes onze cases à cocher :
<?php
if ( !empty( $_POST['elements'] ) ) {
foreach( $_POST['elements'] as $val ) {
if ( $val == 'H') {
$La_string_elements = $La_string_elements.$val.",";
$checked_H = "checked";
}
if ( $val == 'He') {
$La_string_elements = $La_string_elements.$val.",";
$checked_He = "checked";
}
if ( $val == 'Li') {
$La_string_elements = $La_string_elements.$val.",";
$checked_Li = "checked";
}
if ( $val == 'Na') {
$La_string_elements = $La_string_elements.$val.",";
$checked_Na = "checked";
}
if ( $val == 'Mg') {
$La_string_elements = $La_string_elements.$val.",";
$checked_Mg = "checked";
if ( $val == 'Ar') {
$La_string_elements = $La_string_elements.$val.",";
$checked_Ar = "checked";
}
if ( $val == 'Ca') {
$La_string_elements = $La_string_elements.$val.",";
$checked_Ca = "checked";
}
if ( $val == 'Ti') {
$La_string_elements = $La_string_elements.$val.",";
$checked_Ti = "checked";
}
if ( $val == 'Mn') {
$La_string_elements = $La_string_elements.$val.",";
$checked_Mn = "checked";
}
if ( $val == 'Fe') {
$La_string_elements = $La_string_elements.$val.",";
$checked_Fe = "checked";
}
if ( $val == 'Hg') {
$La_string_elements = $La_string_elements.$val.",";
$checked_Hg = "checked";
}
}
// Retirer la dernière virgule de la liste
$La_string_elements = substr($La_string_elements, 0, -1);
}

Pour les boutons radios ou cases à cocher, y a-t-il des précautions
élémentaires à prendre pour éviter l'utilisateur malicieux ?

Ce formulaire n'est pas destiné à remplir une base de donnée, juste à
fabriquer une chaîne de caractères qui sert à appeler un script python
avec "passthru( $zeCommandLine )" pour fabriquer une image ensuite
afficher dans la page.


Merci de vos avis.

8 réponses

Avatar
Olivier Miakinen
Bonjour,
Le 02/03/2020 20:31, Lulu a écrit :
Le formulaire est de méthode "post" et je récupère le contenu des inputs
par une série de ligne du type $WL_start = $_POST['WL_start']
Pour les zones de saisie, je traite cette saisie par :
<?php
// si ce test est positif, c'est que l'utilisateur a saisi une valeur et cliqué
// le bouton "Dessiner le spectre"
if ( isset( $WL_start ) ) {
// il faut donc remettre la valeur de Value_WL_start à la valeur que l'utilisateur
// a postée à condition qu'elle soit "attendue"
// en premier lieu : numérique
if ( is_numeric( $WL_start ) ) {
$x = floor( $WL_start );
// en deuxième lieu, entière
if ( $x != $WL_start ) {
$WL_start = 380;
} else {
// en troisème lieu, dans le domaine visible, sinon 380 nm
if ( ( $x < 380 ) or ( $x >= 800 ) ) {
$WL_start = 380;
}
}
// non numérique :
} else {
$WL_start = 380;
}
}
?>
Est-ce que ce code empêche qu'un script-kiddie puisse falsifier le
comportement que j'attends de ma page ?

Ça me semble correct. En lisant ce code je ne vois pas comment on
pourrait se retrouver avec un $WL_start qui soit autre chose qu'un
entier entre 380 et 800.
Pour mes trois boutons radios, je n'ai que le test de la valeur de la
variable "name" de mon input :
<?php
if ( ! isset( $choix_spectre ) ) {
//echo "choix_spectre is NOT set, setting it to 2
n";
$choix_spectre = 2;
}
if ( $choix_spectre == 1 ) {
//echo " --> Spectre continu
n";
$checked_1 = "checked";
$checked_2 = "";
$checked_3 = "";
} else {
if ( $choix_spectre == 2 ) {
//echo " --> Spectre d'émission
n";
$checked_1 = "";
$checked_2 = "checked";
$checked_3 = "";
} else {
if ( $choix_spectre == 3 ) {
//echo " --> Spectre d'absorption
n";
$checked_1 = "";
$checked_2 = "";
$checked_3 = "checked";
}

Ici il manque un else, pour le cas où $choix_spectre vaudrait autre chose que 1,
2 ou 3. Mais...
}
}

... Mais il y a plus simple comme écriture.
<?php
if ( ! isset( $choix_spectre ) ) {
//echo "choix_spectre is NOT set, setting it to 2
n";
$choix_spectre = 2;
}
switch ( $choix_spectre ) {
case 1:
//echo " --> Spectre continu
n";
$checked_1 = "checked";
$checked_2 = "";
$checked_3 = "";
break;
case 3:
//echo " --> Spectre d'absorption
n";
$checked_1 = "";
$checked_2 = "";
$checked_3 = "checked";
break;
default: // 2 ou toute autre valeur
$choix_spectre = 2; // au cas où ce n'était pas 2
//echo " --> Spectre d'émission
n";
$checked_1 = "";
$checked_2 = "checked";
$checked_3 = "";
break;
}
?>
Et pour mes onze cases à cocher :
<?php
if ( !empty( $_POST['elements'] ) ) {
foreach( $_POST['elements'] as $val ) {
if ( $val == 'H') {
$La_string_elements = $La_string_elements.$val.",";
$checked_H = "checked";
}
if ( $val == 'He') {
$La_string_elements = $La_string_elements.$val.",";
$checked_He = "checked";
}
if ( $val == 'Li') {
$La_string_elements = $La_string_elements.$val.",";
$checked_Li = "checked";
}
if ( $val == 'Na') {
$La_string_elements = $La_string_elements.$val.",";
$checked_Na = "checked";
}
if ( $val == 'Mg') {
$La_string_elements = $La_string_elements.$val.",";
$checked_Mg = "checked";
if ( $val == 'Ar') {
$La_string_elements = $La_string_elements.$val.",";
$checked_Ar = "checked";
}
if ( $val == 'Ca') {
$La_string_elements = $La_string_elements.$val.",";
$checked_Ca = "checked";
}
if ( $val == 'Ti') {
$La_string_elements = $La_string_elements.$val.",";
$checked_Ti = "checked";
}
if ( $val == 'Mn') {
$La_string_elements = $La_string_elements.$val.",";
$checked_Mn = "checked";
}
if ( $val == 'Fe') {
$La_string_elements = $La_string_elements.$val.",";
$checked_Fe = "checked";
}
if ( $val == 'Hg') {
$La_string_elements = $La_string_elements.$val.",";
$checked_Hg = "checked";
}
}
// Retirer la dernière virgule de la liste
$La_string_elements = substr($La_string_elements, 0, -1);
}

Là aussi tu pourrais utilise l'instruction switch, qui en PHP peut être
utilisée aussi bien sur des chaînes que sur des entiers.
https://www.php.net/manual/fr/control-structures.switch.php
Pour les boutons radios ou cases à cocher, y a-t-il des précautions
élémentaires à prendre pour éviter l'utilisateur malicieux ?

Ce que tu fais me semble correct. Tu testes une à une toutes les valeurs
que tu connais, et tu ne fais quelque chose que pour celles-là. Si un
utilisateur malicieux ajoute une valeur que tu n'as pas prévue, ton code
l'ignorera, et c'est bien.
Ce formulaire n'est pas destiné à remplir une base de donnée, juste à
fabriquer une chaîne de caractères qui sert à appeler un script python
avec "passthru( $zeCommandLine )" pour fabriquer une image ensuite
afficher dans la page.

Ok.
--
Olivier Miakinen
Avatar
Lulu
Le 02-03-2020, Olivier Miakinen <om+a écrit :
Le 02/03/2020 20:31, Lulu a écrit :
Le formulaire est de méthode "post" et je récupère le contenu des inputs
par une série de ligne du type $WL_start = $_POST['WL_start']
Pour les zones de saisie, je traite cette saisie par :
<?php
// si ce test est positif, c'est que l'utilisateur a saisi une valeur et cliqué
// le bouton "Dessiner le spectre"
if ( isset( $WL_start ) ) {
// il faut donc remettre la valeur de Value_WL_start à la valeur que l'utilisateur
// a postée à condition qu'elle soit "attendue"
// en premier lieu : numérique
if ( is_numeric( $WL_start ) ) {
$x = floor( $WL_start );
// en deuxième lieu, entière
if ( $x != $WL_start ) {
$WL_start = 380;
} else {
// en troisème lieu, dans le domaine visible, sinon 380 nm
if ( ( $x < 380 ) or ( $x >= 800 ) ) {
$WL_start = 380;
}
}
// non numérique :
} else {
$WL_start = 380;
}
}
?>
Est-ce que ce code empêche qu'un script-kiddie puisse falsifier le
comportement que j'attends de ma page ?

Ça me semble correct. En lisant ce code je ne vois pas comment on
pourrait se retrouver avec un $WL_start qui soit autre chose qu'un
entier entre 380 et 800.

0K
Pour mes trois boutons radios, je n'ai que le test de la valeur de la
variable "name" de mon input :
<?php
if ( ! isset( $choix_spectre ) ) {
//echo "choix_spectre is NOT set, setting it to 2
n";
$choix_spectre = 2;
}
if ( $choix_spectre == 1 ) {
//echo " -->Spectre continu
n";
$checked_1 = "checked";
$checked_2 = "";
$checked_3 = "";
} else {
if ( $choix_spectre == 2 ) {
//echo " -->Spectre d'émission
n";
$checked_1 = "";
$checked_2 = "checked";
$checked_3 = "";
} else {
if ( $choix_spectre == 3 ) {
//echo " -->Spectre d'absorption
n";
$checked_1 = "";
$checked_2 = "";
$checked_3 = "checked";
}

Ici il manque un else, pour le cas où $choix_spectre vaudrait autre chose que 1,
2 ou 3. Mais...
}
}

... Mais il y a plus simple comme écriture.

Ah oui...
Depuis que je me "pense" en python, j'oublie le swich case...
Merci pour le code ;-)
<?php
if ( ! isset( $choix_spectre ) ) {
//echo "choix_spectre is NOT set, setting it to 2
n";
$choix_spectre = 2;
}
switch ( $choix_spectre ) {
case 1:
//echo " -->Spectre continu
n";
$checked_1 = "checked";
$checked_2 = "";
$checked_3 = "";
break;
case 3:
//echo " -->Spectre d'absorption
n";
$checked_1 = "";
$checked_2 = "";
$checked_3 = "checked";
break;
default: // 2 ou toute autre valeur
$choix_spectre = 2; // au cas où ce n'était pas 2
//echo " -->Spectre d'émission
n";
$checked_1 = "";
$checked_2 = "checked";
$checked_3 = "";
break;
}
?>
Et pour mes onze cases à cocher :
<?php
if ( !empty( $_POST['elements'] ) ) {
foreach( $_POST['elements'] as $val ) {
if ( $val == 'H') {
$La_string_elements = $La_string_elements.$val.",";
$checked_H = "checked";
}
[...]
}
if ( $val == 'Hg') {
$La_string_elements = $La_string_elements.$val.",";
$checked_Hg = "checked";
}
}
// Retirer la dernière virgule de la liste
$La_string_elements = substr($La_string_elements, 0, -1);
}

Là aussi tu pourrais utilise l'instruction switch, qui en PHP peut être
utilisée aussi bien sur des chaînes que sur des entiers.
https://www.php.net/manual/fr/control-structures.switch.php

0K, je vais lire cette page
Pour les boutons radios ou cases à cocher, y a-t-il des précautions
élémentaires à prendre pour éviter l'utilisateur malicieux ?

Ce que tu fais me semble correct. Tu testes une à une toutes les valeurs
que tu connais, et tu ne fais quelque chose que pour celles-là. Si un
utilisateur malicieux ajoute une valeur que tu n'as pas prévue, ton code
l'ignorera, et c'est bien.

0K
Ce formulaire n'est pas destiné à remplir une base de donnée, juste à
fabriquer une chaîne de caractères qui sert à appeler un script
python avec "passthru( $zeCommandLine )" pour fabriquer une image
ensuite afficher dans la page.

Ok.

Merci pour tout
Avatar
Lulu
Le 02-03-2020, Lulu a écrit :
Le 02-03-2020, Olivier Miakinen <om+a écrit :
Le 02/03/2020 20:31, Lulu a écrit :

[...]
... Mais il y a plus simple comme écriture.

Ah oui...
Depuis que je me "pense" en python, j'oublie le swich case...
Merci pour le code ;-)
<?php
if ( ! isset( $choix_spectre ) ) {
//echo "choix_spectre is NOT set, setting it to 2
n";
$choix_spectre = 2;
}
switch ( $choix_spectre ) {
case 1:
//echo " -->Spectre continu
n";
$checked_1 = "checked";
$checked_2 = "";
$checked_3 = "";
break;
case 3:
//echo " -->Spectre d'absorption
n";
$checked_1 = "";
$checked_2 = "";
$checked_3 = "checked";
break;
default: // 2 ou toute autre valeur
$choix_spectre = 2; // au cas où ce n'était pas 2
//echo " -->Spectre d'émission
n";
$checked_1 = "";
$checked_2 = "checked";
$checked_3 = "";
break;
}
?>


Je viens de tester ce switch/case en supprimant le test sur isset qui
le précède : ça marche, c'est à dire que le cas "default" a l'air
d'englober le cas ou $choix_spectre n'a pas de valeur attribuée.
[...]
cLà aussi tu pourrais utilise l'instruction switch, qui en PHP peut être
cutilisée aussi bien sur des chaînes que sur des entiers.
chttps://www.php.net/manual/fr/control-structures.switch.php

0K, je vais lire cette page

Dans cette page, j'ai vu le commentaire (de lchanady at gmail dot com)
suivant:
Something fairly simple (and maybe obvious) that I didn't see mentioned
is that the default case WILL be executed even if the switched variable
does not exist or is undefined.
For example:
<?php
$a = "abc";
$b = "def";
switch($c){
case "a":
echo "a";
break;
case "b":
echo "b";
break;
default:
echo "default";
break;
}
?>
Will output: default
Even though $c was never declared or defined, the default case will
still be executed rather than PHP throwing an error.
Encore merci pour le rappel sur switch/case !
Avatar
Olivier Miakinen
Le 03/03/2020 01:16, Lulu a écrit :
[...]
Je viens de tester ce switch/case en supprimant le test sur isset qui
le précède : ça marche, c'est à dire que le cas "default" a l'air
d'englober le cas ou $choix_spectre n'a pas de valeur attribuée.

et :
[...]
Dans cette page, j'ai vu le commentaire (de lchanady at gmail dot com)
suivant:
Something fairly simple (and maybe obvious) that I didn't see mentioned
is that the default case WILL be executed even if the switched variable
does not exist or is undefined.
[...]
Even though $c was never declared or defined, the default case will
still be executed rather than PHP throwing an error.

Tout ça me semble parfait.
Encore merci pour le rappel sur switch/case !

Heureux d'avoir aidé.
--
Olivier Miakinen
Avatar
Olivier Miakinen
Le 03/03/2020 00:17, Lulu a écrit :
[...]
0K
[...]
0K, je vais lire cette page
[...]
0K

C'est amusant. Pourquoi écris-tu 0K au lieu de OK ? Un jeu de mots avec le zéro
absolu des températures, zéro kelvin ?
[...]
Ok.


Là c'était moi.
--
Olivier Miakinen
Avatar
Lulu
Le 03-03-2020, Olivier Miakinen <om+a écrit :
Le 03/03/2020 00:17, Lulu a écrit :
[...]
0K
[...]
0K, je vais lire cette page
[...]
0K

C'est amusant. Pourquoi écris-tu 0K au lieu de OK ? Un jeu de mots avec le zéro
absolu des températures, zéro kelvin ?

Quelle capacité d'observation !!
Parce que ça veut dire "zero killed" (enfin ça n'est qu'une des
nombreuses explications pour okay).
Avatar
Olivier Miakinen
Le 03/03/2020 16:05, Lulu a écrit :
C'est amusant. Pourquoi écris-tu 0K au lieu de OK ? Un jeu de mots avec le zéro
absolu des températures, zéro kelvin ?

Quelle capacité d'observation !!

:-)
Parce que ça veut dire "zero killed" (enfin ça n'est qu'une des
nombreuses explications pour okay).

Ça ne fait pas partie des explications privilégiées, mais en effet c'en
est une : <https://fr.wikipedia.org/wiki/OK_%28expression%29>.
Merci de ta réponse.
--
Olivier Miakinen
Avatar
Lulu
Le 03-03-2020, Olivier Miakinen <om+ a écrit :
Le 03/03/2020 16:05, Lulu a écrit :
C'est amusant. Pourquoi écris-tu 0K au lieu de OK ? Un jeu de mots
avec le zéro absolu des températures, zéro kelvin ?

Quelle capacité d'observation !!

:-)
Parce que ça veut dire "zero killed" (enfin ça n'est qu'une des
nombreuses explications pour okay).

Ça ne fait pas partie des explications privilégiées, mais en effet
c'en est une : <https://fr.wikipedia.org/wiki/OK_%28expression%29>.

J'ai relu avec plaisir cette page : le « Ola kala » grec me plait bien
aussi.
Merci de ta réponse.

Je t'en prie. C'est toujours un plaisir de discuter avec toi.