Changeset 112938 in spip-zone


Ignore:
Timestamp:
Dec 19, 2018, 8:38:03 AM (3 months ago)
Author:
root
Message:

toujours sur la securité du test dans afficher_si : empecher d'executer des fonctions sql en une seul ligne

Location:
_plugins_/saisies/trunk
Files:
3 edited

Legend:

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

    r112936 r112938  
    605605 */
    606606function saisies_verifier_securite_afficher_si($condition) {
    607         // 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)
    608         if (!strstr($condition, ";") and !strstr($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) {
    609616                return true;
    610617        }
    611618
    612         // point virgule ou dollar sans guillement? ca pue
    613         if (strstr($condition, '"') == false and strstr($condition, "'") == false) {
     619        // pas de guillemet ou de @, alors ca pue
     620        if (strstr($condition, '"') == false and strstr($condition, "'") == false and strstr($condition, "@") == false) {
    614621                return false;
    615622        }
    616623
    617         $regexp = "#(?<guillemet>(^\\\)?(\"|'))(.*)(\k<guillemet>)#mU"; // trouver tout ce qu'il y entre guillemet, sauf si les guillemets sont échapés
     624        $regexp = "#(?<guillemet>(^\\\)?(\"|'|@))(.*)(\k<guillemet>)#mU"; // trouver tout ce qu'il y entre guillemet, sauf si les guillemets sont échapés
    618625        $condition = preg_replace($regexp, "", $condition);//Supprimer tout ce qu'il y a entre guillement
    619626
    620         // il reste encore des $ ou des ; alors qu'on a enlevé les guillemets, ca pue vraiment
    621         if (strstr($condition, ";") or strstr($condition, "$")) {
    622                 return false;
     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                }
    623632        }
    624633        //Sinon c'est que c'est bon
  • _plugins_/saisies/trunk/paquet.xml

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

    r112925 r112938  
    7373                                0 => false,
    7474                                1 => '@champ1@ == "1"; @champ2@ =="2"'
     75                        ),
     76                        array (
     77                                0 => true,
     78                                1 => '@sql_insert@ == "1"'
     79                        ),
     80                        array (
     81                                0 => false,
     82                                1 => 'sql_insert() == "1"'
    7583                        )
    7684                );
Note: See TracChangeset for help on using the changeset viewer.