Changeset 117767 in spip-zone


Ignore:
Timestamp:
Sep 6, 2019, 4:37:38 PM (13 months ago)
Author:
maieul@…
Message:

tester systématiquement la syntaxe des conditions avant d'essayer de les transformer en js/php + accepter les conditions false / true

Location:
_plugins_/saisies/trunk
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/saisies/trunk/inc/saisies_afficher_si_commun.php

    r117764 r117767  
    2424                . "(?:\s*?)" // espaces éventuels après
    2525                . "((?<guillemet>\"|')(?<valeur>.*?)(\k<guillemet>)|(?<valeur_numerique>\d+))" // valeur (string) ou valeur_numérique (int)
    26                 . ")?"; // partie operateur + valeur (optionnelle) : fin
     26                . ")?" // partie operateur + valeur (optionnelle) : fin
     27                . '|(?<booleen>false|true)';//accepter false/true brut
    2728        $regexp = "#$regexp#";
    2829        preg_match_all($regexp, $condition, $tests, PREG_SET_ORDER);
     
    160161 **/
    161162function saisies_afficher_si_secure($condition, $tests=array()) {
     163        $condition_original = $condition;
    162164        $hors_test = array('||','&&','!','(',')','true','false');
    163165        foreach ($tests as $test) {
     
    169171        $condition = trim($condition);
    170172        if ($condition) {// il reste quelque chose > c'est le mal
     173                spip_log("Afficher_si incorrect. $condition_original non sécurisée", "saisies"._LOG_CRITIQUE);
    171174                return false;
    172175        } else {
     
    176179
    177180/** Vérifie qu'une condition respecte la syntaxe formelle
    178         * @param string $condition
    179         * @return bool
    180 **/
    181 function saisies_afficher_si_verifier_syntaxe($condition) {
    182         $tests = saisies_parser_condition_afficher_si($condition);
     181 * @param string $condition
     182 * @param array $tests liste des tests simples
     183* @return bool
     184**/
     185function saisies_afficher_si_verifier_syntaxe($condition, $tests=array()) {
    183186        if ($tests and saisies_afficher_si_secure($condition, $tests)) {//Si cela passe la sécurité, faisons des tests complémentaires
    184 
    185187                // parenthèses équilibrées
    186188                if (substr_count($condition,'(') != substr_count($condition,')')) {
    187189                        return false;
    188190                }
    189 
    190 
    191191                // pas de && ou de || qui traine sans rien à gauche ni à droite
    192192                $condition = " $condition ";
  • _plugins_/saisies/trunk/inc/saisies_afficher_si_js.php

    r117761 r117767  
    2424        $saisies_form = saisies_lister_par_nom($saisies_form);
    2525        if ($tests = saisies_parser_condition_afficher_si($condition)) {
    26                 if (!saisies_afficher_si_secure($condition, $tests)) {
    27                         spip_log("Afficher_si incorrect. $condition non sécurisée", "saisies"._LOG_CRITIQUE);
     26                if (!saisies_afficher_si_verifier_syntaxe($condition, $tests)) {
     27                        spip_log("Afficher_si incorrect. $condition syntaxe incorrecte", "saisies"._LOG_CRITIQUE);
    2828                        return '';
    2929                }
     
    3535                        $guillemet = isset($test['guillemet']) ? $test['guillemet'] : '' ;
    3636                        $negation = isset($test['negation']) ? $test['negation'] : '';
     37                        $booleen = isset($test['booleen']) ? $test['booleen'] : '';
    3738                        $valeur = isset($test['valeur']) ? $test['valeur'] : '' ;
    3839                        $valeur_numerique = isset($test['valeur_numerique']) ? $test['valeur_numerique'] : '' ;
     
    4445                                $test_modifie = eval('return '.saisies_tester_condition_afficher_si($config, $operateur, $valeur, $negation).';') ? 'true' : 'false';
    4546                                $condition = str_replace($expression, $test_modifie, $condition);
     47                        } elseif ($booleen)  {
     48                                $condition = $condition;
    4649                        } else { // et maintenant, on rentre dans le vif du sujet : les champs. On délégue cela à une autre fonction
    4750                                $condition = str_replace($expression, saisies_afficher_si_js_champ($champ, $operateur, $valeur, $valeur_numerique, $guillemet, $negation, $saisies_form), $condition);
     
    4952                }
    5053        } else {
    51                 if (!saisies_afficher_si_secure($condition)) {
    52                         spip_log("Afficher_si incorrect. $condition non sécurisée", "saisies"._LOG_CRITIQUE);
     54                if (!saisies_afficher_si_verifier_syntaxe($condition)) {
     55                        spip_log("Afficher_si incorrect. $condition syntaxe incorrecte", "saisies"._LOG_CRITIQUE);
    5356                        return '';
    5457                }
  • _plugins_/saisies/trunk/inc/saisies_afficher_si_php.php

    r117762 r117767  
    143143function saisies_transformer_condition_afficher_si($condition, $env = null) {
    144144        if ($tests = saisies_parser_condition_afficher_si($condition)) {
    145                 if (!saisies_afficher_si_secure($condition, $tests)) {
    146                         spip_log("Afficher_si incorrect. $condition non sécurisée", "saisies"._LOG_CRITIQUE);
     145                if (!saisies_afficher_si_verifier_syntaxe($condition, $tests)) {
     146                        spip_log("Afficher_si incorrect. $condition syntaxe_incorrecte", "saisies"._LOG_CRITIQUE);
    147147                        return '';
    148148                }
    149149                foreach ($tests as $test) {
    150150                        $expression = $test[0];
    151                         $champ = saisies_afficher_si_get_valeur_champ($test['champ'], $env);
    152                         $operateur = isset($test['operateur']) ? $test['operateur'] : null;
    153                         $negation = isset($test['negation']) ? $test['negation'] : '';
    154                         if (isset($test['valeur_numerique'])) {
    155                                 $valeur = intval($test['valeur_numerique']);
    156                         } elseif (isset($test['valeur'])) {
    157                                 $valeur = $test['valeur'];
    158                         } else {
    159                                 $valeur = null;
    160                         }
    161 
    162                         $test_modifie = saisies_tester_condition_afficher_si($champ, $operateur, $valeur, $negation) ? 'true' : 'false';
    163                         $condition = str_replace($expression, $test_modifie, $condition);
    164                 }
    165         } else {
    166                 if (!saisies_afficher_si_secure($condition, $tests)) {
    167                         spip_log("Afficher_si incorrect. $condition non sécurisée", "saisies"._LOG_CRITIQUE);
     151                        if (!isset($test['booleen'])) {
     152
     153                                $champ = saisies_afficher_si_get_valeur_champ($test['champ'], $env);
     154                                $operateur = isset($test['operateur']) ? $test['operateur'] : null;
     155                                $negation = isset($test['negation']) ? $test['negation'] : '';
     156                                if (isset($test['valeur_numerique'])) {
     157                                        $valeur = intval($test['valeur_numerique']);
     158                                } elseif (isset($test['valeur'])) {
     159                                        $valeur = $test['valeur'];
     160                                } else {
     161                                        $valeur = null;
     162                                }
     163
     164                                $test_modifie = saisies_tester_condition_afficher_si($champ, $operateur, $valeur, $negation) ? 'true' : 'false';
     165                                $condition = str_replace($expression, $test_modifie, $condition);
     166                        }
     167                }
     168        } else {
     169                if (!saisies_afficher_si_verifier_syntaxe($condition, $tests)) {
     170                        spip_log("Afficher_si incorrect. $condition syntaxe_incorrecte", "saisies"._LOG_CRITIQUE);
    168171                        return '';
    169172                }
  • _plugins_/saisies/trunk/tests/saisies_afficher_si/saisies_afficher_si_verifier_syntaxe.php

    r117764 r117767  
    9393                                1 => "(@a@ == 'a'"
    9494                        ),
     95                        'false' =>
     96                        array (
     97                                0 => true,
     98                                1 => "false"
     99                        ),
     100                        'true' =>
     101                        array (
     102                                0 => true,
     103                                1 => "true"
     104                        ),
    95105                );
     106                foreach ($essais as $nom=>$param) {
     107                        $essais[$nom][2] = saisies_parser_condition_afficher_si($param[1]);
     108                }
    96109                return $essais;
    97110        }
  • _plugins_/saisies/trunk/verifier/afficher_si.php

    r117766 r117767  
    2323        include_spip('inc/saisies_afficher_si_commun');
    2424        $erreur = _T('saisies:erreur_syntaxe_afficher_si');
    25         if (!saisies_afficher_si_verifier_syntaxe($valeur)) {
     25        $tests = saisies_parser_condition_afficher_si($valeur);
     26        if (!saisies_afficher_si_verifier_syntaxe($valeur, $tests)) {
    2627                return $erreur;
    2728        } else {
Note: See TracChangeset for help on using the changeset viewer.