Browse Source

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

svn/root/tags/v3.26.0
maieul@maieul.net 3 years ago
parent
commit
664c52a0ec
  1. 16
      inc/saisies_afficher_si_commun.php
  2. 11
      inc/saisies_afficher_si_js.php
  3. 35
      inc/saisies_afficher_si_php.php
  4. 13
      tests/saisies_afficher_si/saisies_afficher_si_verifier_syntaxe.php
  5. 3
      verifier/afficher_si.php

16
inc/saisies_afficher_si_commun.php

@ -23,7 +23,8 @@ function saisies_parser_condition_afficher_si($condition) {
. "(?<operateur>==|!=|IN|!IN|>=|>|<=|<)" // opérateur
. "(?:\s*?)" // espaces éventuels après
. "((?<guillemet>\"|')(?<valeur>.*?)(\k<guillemet>)|(?<valeur_numerique>\d+))" // valeur (string) ou valeur_numérique (int)
. ")?"; // partie operateur + valeur (optionnelle) : fin
. ")?" // partie operateur + valeur (optionnelle) : fin
. '|(?<booleen>false|true)';//accepter false/true brut
$regexp = "#$regexp#";
preg_match_all($regexp, $condition, $tests, PREG_SET_ORDER);
return $tests;
@ -159,6 +160,7 @@ function saisies_afficher_si_get_valeur_config($champ) {
* @return bool true si secure / false sinon
**/
function saisies_afficher_si_secure($condition, $tests=array()) {
$condition_original = $condition;
$hors_test = array('||','&&','!','(',')','true','false');
foreach ($tests as $test) {
$condition = str_replace($test[0], '', $condition);
@ -168,6 +170,7 @@ function saisies_afficher_si_secure($condition, $tests=array()) {
}
$condition = trim($condition);
if ($condition) {// il reste quelque chose > c'est le mal
spip_log("Afficher_si incorrect. $condition_original non sécurisée", "saisies"._LOG_CRITIQUE);
return false;
} else {
return true;
@ -175,19 +178,16 @@ function saisies_afficher_si_secure($condition, $tests=array()) {
}
/** Vérifie qu'une condition respecte la syntaxe formelle
* @param string $condition
* @return bool
* @param string $condition
* @param array $tests liste des tests simples
* @return bool
**/
function saisies_afficher_si_verifier_syntaxe($condition) {
$tests = saisies_parser_condition_afficher_si($condition);
function saisies_afficher_si_verifier_syntaxe($condition, $tests=array()) {
if ($tests and saisies_afficher_si_secure($condition, $tests)) {//Si cela passe la sécurité, faisons des tests complémentaires
// parenthèses équilibrées
if (substr_count($condition,'(') != substr_count($condition,')')) {
return false;
}
// pas de && ou de || qui traine sans rien à gauche ni à droite
$condition = " $condition ";
$condition_pour_sous_test = str_replace('||','$', $condition);

11
inc/saisies_afficher_si_js.php

@ -23,8 +23,8 @@ include_spip('inc/saisies_lister');
function saisies_afficher_si_js($condition, $saisies_form = array()) {
$saisies_form = saisies_lister_par_nom($saisies_form);
if ($tests = saisies_parser_condition_afficher_si($condition)) {
if (!saisies_afficher_si_secure($condition, $tests)) {
spip_log("Afficher_si incorrect. $condition non sécurisée", "saisies"._LOG_CRITIQUE);
if (!saisies_afficher_si_verifier_syntaxe($condition, $tests)) {
spip_log("Afficher_si incorrect. $condition syntaxe incorrecte", "saisies"._LOG_CRITIQUE);
return '';
}
foreach ($tests as $test) {
@ -34,6 +34,7 @@ function saisies_afficher_si_js($condition, $saisies_form = array()) {
$operateur = isset($test['operateur']) ? $test['operateur'] : '' ;
$guillemet = isset($test['guillemet']) ? $test['guillemet'] : '' ;
$negation = isset($test['negation']) ? $test['negation'] : '';
$booleen = isset($test['booleen']) ? $test['booleen'] : '';
$valeur = isset($test['valeur']) ? $test['valeur'] : '' ;
$valeur_numerique = isset($test['valeur_numerique']) ? $test['valeur_numerique'] : '' ;
$plugin = saisies_afficher_si_evaluer_plugin($champ, $negation);
@ -43,13 +44,15 @@ function saisies_afficher_si_js($condition, $saisies_form = array()) {
$config = saisies_afficher_si_get_valeur_config($champ);
$test_modifie = eval('return '.saisies_tester_condition_afficher_si($config, $operateur, $valeur, $negation).';') ? 'true' : 'false';
$condition = str_replace($expression, $test_modifie, $condition);
} elseif ($booleen) {
$condition = $condition;
} else { // et maintenant, on rentre dans le vif du sujet : les champs. On délégue cela à une autre fonction
$condition = str_replace($expression, saisies_afficher_si_js_champ($champ, $operateur, $valeur, $valeur_numerique, $guillemet, $negation, $saisies_form), $condition);
}
}
} else {
if (!saisies_afficher_si_secure($condition)) {
spip_log("Afficher_si incorrect. $condition non sécurisée", "saisies"._LOG_CRITIQUE);
if (!saisies_afficher_si_verifier_syntaxe($condition)) {
spip_log("Afficher_si incorrect. $condition syntaxe incorrecte", "saisies"._LOG_CRITIQUE);
return '';
}
}

35
inc/saisies_afficher_si_php.php

@ -142,29 +142,32 @@ function saisies_afficher_si_get_valeur_champ($champ, $env) {
**/
function saisies_transformer_condition_afficher_si($condition, $env = null) {
if ($tests = saisies_parser_condition_afficher_si($condition)) {
if (!saisies_afficher_si_secure($condition, $tests)) {
spip_log("Afficher_si incorrect. $condition non sécurisée", "saisies"._LOG_CRITIQUE);
if (!saisies_afficher_si_verifier_syntaxe($condition, $tests)) {
spip_log("Afficher_si incorrect. $condition syntaxe_incorrecte", "saisies"._LOG_CRITIQUE);
return '';
}
foreach ($tests as $test) {
$expression = $test[0];
$champ = saisies_afficher_si_get_valeur_champ($test['champ'], $env);
$operateur = isset($test['operateur']) ? $test['operateur'] : null;
$negation = isset($test['negation']) ? $test['negation'] : '';
if (isset($test['valeur_numerique'])) {
$valeur = intval($test['valeur_numerique']);
} elseif (isset($test['valeur'])) {
$valeur = $test['valeur'];
} else {
$valeur = null;
}
if (!isset($test['booleen'])) {
$test_modifie = saisies_tester_condition_afficher_si($champ, $operateur, $valeur, $negation) ? 'true' : 'false';
$condition = str_replace($expression, $test_modifie, $condition);
$champ = saisies_afficher_si_get_valeur_champ($test['champ'], $env);
$operateur = isset($test['operateur']) ? $test['operateur'] : null;
$negation = isset($test['negation']) ? $test['negation'] : '';
if (isset($test['valeur_numerique'])) {
$valeur = intval($test['valeur_numerique']);
} elseif (isset($test['valeur'])) {
$valeur = $test['valeur'];
} else {
$valeur = null;
}
$test_modifie = saisies_tester_condition_afficher_si($champ, $operateur, $valeur, $negation) ? 'true' : 'false';
$condition = str_replace($expression, $test_modifie, $condition);
}
}
} else {
if (!saisies_afficher_si_secure($condition, $tests)) {
spip_log("Afficher_si incorrect. $condition non sécurisée", "saisies"._LOG_CRITIQUE);
if (!saisies_afficher_si_verifier_syntaxe($condition, $tests)) {
spip_log("Afficher_si incorrect. $condition syntaxe_incorrecte", "saisies"._LOG_CRITIQUE);
return '';
}
}

13
tests/saisies_afficher_si/saisies_afficher_si_verifier_syntaxe.php

@ -92,7 +92,20 @@
0 => false,
1 => "(@a@ == 'a'"
),
'false' =>
array (
0 => true,
1 => "false"
),
'true' =>
array (
0 => true,
1 => "true"
),
);
foreach ($essais as $nom=>$param) {
$essais[$nom][2] = saisies_parser_condition_afficher_si($param[1]);
}
return $essais;
}

3
verifier/afficher_si.php

@ -22,7 +22,8 @@ if (!defined('_ECRIRE_INC_VERSION')) {
function verifier_afficher_si_dist($valeur) {
include_spip('inc/saisies_afficher_si_commun');
$erreur = _T('saisies:erreur_syntaxe_afficher_si');
if (!saisies_afficher_si_verifier_syntaxe($valeur)) {
$tests = saisies_parser_condition_afficher_si($valeur);
if (!saisies_afficher_si_verifier_syntaxe($valeur, $tests)) {
return $erreur;
} else {
return '';

Loading…
Cancel
Save