Changeset 112940 in spip-zone


Ignore:
Timestamp:
Dec 19, 2018, 9:00:03 AM (4 weeks ago)
Author:
root
Message:

inversons la charge de la preuve : il faut montrer que le code d'afficher_si n'est pas malicieux. Donc ce qui est ni entre guillemet, ni entre @ doit appartenir à certains charactère seulement

Location:
_plugins_/saisies/trunk
Files:
3 edited

Legend:

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

    r112938 r112940  
    600600/**
    601601 * Vérifie qu'on tente pas de faire executer du code PHP en utilisant afficher_si.
    602  * Interdit les ; et les $ sauf si entre guillemets.
     602 * N'importe quoi autorisé entre @@ et "" et ''
     603 * Liste de mot clé autorisé en dehors
    603604 * @param string $condition
    604605 * @return bool true si usage légitime, false si tentative d'execution de code PHP
    605606 */
    606607function saisies_verifier_securite_afficher_si($condition) {
    607         $interdits = array(";","$","sql","spip");
    608         $presence = 0;
    609         foreach ($interdits as $int) {
    610                 if (strstr($condition, $int)) {
    611                         $presence++;
    612                 }
    613         }
    614         // pas de chaine interdite, a priori safe
    615         if (!$presence) {
    616                 return true;
    617         }
    618 
    619         // pas de guillemet ou de @, alors ca pue
    620         if (strstr($condition, '"') == false and strstr($condition, "'") == false and strstr($condition, "@") == false) {
     608        $autoriser_hors_guillemets = array("!", "IN", "\(", "\)", "=", "\s", "&", "\|");
     609        $autoriser_hors_guillemets = "#(".implode($autoriser_hors_guillemets, "|").")#m";
     610
     611        var_dump($autoriser_hors_guillemets);
     612        $entre_guillemets = "#(?<guillemet>(^\\\)?(\"|'|@))(.*)(\k<guillemet>)#mU"; // trouver tout ce qu'il y entre guillemet, sauf si les guillemets sont échapés
     613        $condition = preg_replace($entre_guillemets, "", $condition);//Supprimer tout ce qu'il y a entre guillement
     614        $condition = preg_replace($autoriser_hors_guillemets, "", $condition);//Supprimer tout ce qui est autorisé hors guillemets
     615        var_dump($condition);
     616        if ($condition) {//S'il restre quelque chose, c'est pas normal
    621617                return false;
    622         }
    623 
    624         $regexp = "#(?<guillemet>(^\\\)?(\"|'|@))(.*)(\k<guillemet>)#mU"; // trouver tout ce qu'il y entre guillemet, sauf si les guillemets sont échapés
    625         $condition = preg_replace($regexp, "", $condition);//Supprimer tout ce qu'il y a entre guillement
    626 
    627         // il reste encore des caractères interdit alors qu'on a enlevé les guillemets, ca pue vraiment
    628         foreach ($interdits as $int) {
    629                 if (strstr($condition, $int)) {
    630                         return false;
    631                 }
    632618        }
    633619        //Sinon c'est que c'est bon
  • _plugins_/saisies/trunk/paquet.xml

    r112938 r112940  
    22        prefix="saisies"
    33        categorie="outil"
    4         version="3.8.8"
     4        version="3.8.9"
    55        etat="stable"
    66        compatibilite="[3.0.0;3.2.*]"
  • _plugins_/saisies/trunk/tests/saisies_afficher/saisies_verifier_securite_afficher_si.php

    r112938 r112940  
    3838                        0 =>
    3939                        array (
    40                                 0 => true,
     40                                0 => false,
    4141                                1 => 's',
    4242                        ),
Note: See TracChangeset for help on using the changeset viewer.