Discussion:
Securite formulaire
(trop ancien pour répondre)
Lulu
2020-03-02 19:31:29 UTC
Permalink
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.
Olivier Miakinen
2020-03-02 21:32:00 UTC
Permalink
Bonjour,
Post by Lulu
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']
<?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;
}
}
} 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.
Post by Lulu
Pour mes trois boutons radios, je n'ai que le test de la valeur de la
<?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";
}
Ici il manque un else, pour le cas où $choix_spectre vaudrait autre chose que 1,
2 ou 3. Mais...
Post by Lulu
}
}
... Mais il y a plus simple comme écriture.

<?php
if ( ! isset( $choix_spectre ) ) {
//echo "choix_spectre is NOT set, setting it to 2 <br />\n";
$choix_spectre = 2;
}

switch ( $choix_spectre ) {
case 1:
//echo " --> Spectre continu<br />\n";
$checked_1 = "checked";
$checked_2 = "";
$checked_3 = "";
break;

case 3:
//echo " --> Spectre d'absorption<br />\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<br />\n";
$checked_1 = "";
$checked_2 = "checked";
$checked_3 = "";
break;
}
?>
Post by Lulu
<?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
Post by Lulu
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.
Post by Lulu
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
Lulu
2020-03-02 23:17:56 UTC
Permalink
Post by Olivier Miakinen
Post by Lulu
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']
<?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;
}
}
} 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
Post by Olivier Miakinen
Post by Lulu
Pour mes trois boutons radios, je n'ai que le test de la valeur de la
<?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";
}
Ici il manque un else, pour le cas où $choix_spectre vaudrait autre chose que 1,
2 ou 3. Mais...
Post by Lulu
}
}
... 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 ;-)
Post by Olivier Miakinen
<?php
if ( ! isset( $choix_spectre ) ) {
//echo "choix_spectre is NOT set, setting it to 2 <br />\n";
$choix_spectre = 2;
}
switch ( $choix_spectre ) {
//echo " -->Spectre continu<br />\n";
$checked_1 = "checked";
$checked_2 = "";
$checked_3 = "";
break;
//echo " -->Spectre d'absorption<br />\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<br />\n";
$checked_1 = "";
$checked_2 = "checked";
$checked_3 = "";
break;
}
?>
Post by Lulu
<?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
Post by Olivier Miakinen
Post by Lulu
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
Post by Olivier Miakinen
Post by Lulu
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
Lulu
2020-03-03 00:16:53 UTC
Permalink
Post by Lulu
Post by Olivier Miakinen
[...]
... 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 ;-)
Post by Olivier Miakinen
<?php
if ( ! isset( $choix_spectre ) ) {
//echo "choix_spectre is NOT set, setting it to 2 <br />\n";
$choix_spectre = 2;
}
switch ( $choix_spectre ) {
//echo " -->Spectre continu<br />\n";
$checked_1 = "checked";
$checked_2 = "";
$checked_3 = "";
break;
//echo " -->Spectre d'absorption<br />\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<br />\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.
Post by Lulu
Post by Olivier Miakinen
[...]
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 !
Olivier Miakinen
2020-03-03 10:52:00 UTC
Permalink
Post by Lulu
[...]
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.
[...]
Dans cette page, j'ai vu le commentaire (de lchanady at gmail dot com)
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.
Post by Lulu
Encore merci pour le rappel sur switch/case !
Heureux d'avoir aidé.
--
Olivier Miakinen
Olivier Miakinen
2020-03-03 10:55:53 UTC
Permalink
Post by Lulu
[...]
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 ?
Post by Lulu
[...]
Ok.
Là c'était moi.
--
Olivier Miakinen
Lulu
2020-03-03 15:05:44 UTC
Permalink
Post by Olivier Miakinen
Post by Lulu
[...]
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).
Olivier Miakinen
2020-03-03 17:55:17 UTC
Permalink
Post by Lulu
Post by Olivier Miakinen
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 !!
:-)
Post by Lulu
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
Lulu
2020-03-04 20:44:55 UTC
Permalink
Post by Olivier Miakinen
Post by Lulu
Post by Olivier Miakinen
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 !!
:-)
Post by Lulu
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.
Post by Olivier Miakinen
Merci de ta réponse.
Je t'en prie. C'est toujours un plaisir de discuter avec toi.

Continuer la lecture sur narkive:
Loading...