Changeset 112925 in spip-zone


Ignore:
Timestamp:
Dec 19, 2018, 12:06:46 AM (3 months ago)
Author:
maieul@…
Message:

les afficher_si fonctionnent avec eval.
Du coup on pourrait s'en servir pour executer du code PHP et pas
simplement faire des tests conditionnels.
On limite les dégats en empêchant l'emploi de $ et de ; dans un
afficher_si, sauf si entre guillemets.
Début de tests unitaires pour saisies, parce que ce sont vraiment des
emplois complexes.

Location:
_plugins_/saisies/trunk
Files:
3 added
2 edited

Legend:

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

    r112689 r112925  
    490490                if (isset($saisie['options']['afficher_si'])) {
    491491                        $condition = $saisie['options']['afficher_si'];
    492 
     492                        // Si tentative de log malicieux, on rejete
     493                        if (!saisies_verifier_securite_afficher_si($condition)) {
     494                                spip_log("Afficher_si malicieuse : $condition", "saisies"._LOG_CRITIQUE);
     495                                $condition = '';
     496                        }
     497                        $condition = saisies_verifier_securite_afficher_si($condition);
    493498                        // Est-ce uniquement au remplissage?
    494499                        if (isset($saisie['options']['afficher_si_remplissage_uniquement'])
     
    593598        }
    594599}
     600
     601/**
     602 * Vérifie qu'on tente pas de faire executer du code PHP en utilisant afficher_si.
     603 * Interdit les ; et les $ sauf si entre guillemets.
     604 * @param string $condition
     605 * @return bool true si usage légitime, false si tentative d'execution de code PHP
     606 */
     607function saisies_verifier_securite_afficher_si($condition) {
     608        // pas de point virgule ni de $, a priori c'est safe (une seule instruction executable, or pour modifier la base, envoyer un mail, etc, il en faut au moins 2)
     609        if (!strstr($condition, ";") and !strstr($condition, "$")) {
     610                return true;
     611        }
     612
     613        // point virgule ou dollar sans guillement? ca pue
     614        if (strstr($condition, '"') == false and strstr($condition, "'") == false) {
     615                return false;
     616        }
     617
     618        $regexp = "#(?<guillemet>(^\\\)?(\"|'))(.*)(\k<guillemet>)#mU"; // trouver tout ce qu'il y entre guillemet, sauf si les guillemets sont échapés
     619        $condition = preg_replace($regexp, "", $condition);//Supprimer tout ce qu'il y a entre guillement
     620
     621        // il reste encore des $ ou des ; alors qu'on a enlevé les guillemets, ca pue vraiment
     622        if (strstr($condition, ";") or strstr($condition, "$")) {
     623                return false;
     624        }
     625        //Sinon c'est que c'est bon
     626        return true;
     627}
  • _plugins_/saisies/trunk/paquet.xml

    r112689 r112925  
    22        prefix="saisies"
    33        categorie="outil"
    4         version="3.8.3"
     4        version="3.8.4"
    55        etat="stable"
    66        compatibilite="[3.0.0;3.2.*]"
Note: See TracChangeset for help on using the changeset viewer.