Securite formulaire
Le
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 />";
$choix_spectre = 2;
}
if ( $choix_spectre == 1 ) {
//echo " --> Spectre continu<br />";
$checked_1 = "checked";
$checked_2 = "";
$checked_3 = "";
} else {
if ( $choix_spectre == 2 ) {
//echo " --> Spectre d'émission<br />";
$checked_1 = "";
$checked_2 = "checked";
$checked_3 = "";
} else {
if ( $choix_spectre == 3 ) {
//echo " --> Spectre d'absorption<br />";
$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.
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 />";
$choix_spectre = 2;
}
if ( $choix_spectre == 1 ) {
//echo " --> Spectre continu<br />";
$checked_1 = "checked";
$checked_2 = "";
$checked_3 = "";
} else {
if ( $choix_spectre == 2 ) {
//echo " --> Spectre d'émission<br />";
$checked_1 = "";
$checked_2 = "checked";
$checked_3 = "";
} else {
if ( $choix_spectre == 3 ) {
//echo " --> Spectre d'absorption<br />";
$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.
Le 02/03/2020 20:31, Lulu a écrit :
Ç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.
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;
}
?>
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
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.
Ok.
--
Olivier Miakinen
0K
Ah oui...
Depuis que je me "pense" en python, j'oublie le swich case...
Merci pour le code ;-)
0K, je vais lire cette page
0K
Merci pour tout
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)
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 !
et :
Tout ça me semble parfait.
Heureux d'avoir aidé.
--
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 ?
Là c'était moi.
--
Olivier Miakinen
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 : Merci de ta réponse.
--
Olivier Miakinen
J'ai relu avec plaisir cette page : le « Ola kala » grec me plait bien
aussi.
Je t'en prie. C'est toujours un plaisir de discuter avec toi.