Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2400 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  preg_replace sur page perso sfr : comment contourner le pb ?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

preg_replace sur page perso sfr : comment contourner le pb ?

n°1901362
thurfin
la clarté dans la confusion
Posté le 02-07-2009 à 08:22:47  profilanswer
 

Bonjour,
j'ai voulu installer sur les pages persos de sfr phpwebgallerie afin de mettre en ligne des photos. Le problème c'est que sfr vérouille la fonction PREG_REPLACE( /e) pour de soit disantes raisons de sécurité et le site renvoie une erreur lorsque on essaye d'y accéder. Pour le moment j'ai désactiver le /e ce qui rend le site accessible mais avec un résultat dég (la fonction est dans un script gérant les templates). Il y'aurait t'il donc un moyen de contourner le problème en reprogrammant le bou de code afin de ne pas faire appel à la fonction preg_replace /e ? (voir ci dessous)
Merci d'avance.
 

Code :
  1. function compile($code, $do_not_echo = false, $retvar = '')
  2.     {
  3.       // PWG specific : communication between template and $lang
  4.       $code = preg_replace('/\{lang:([^}]+)\}/e', "l10n('$1')", $code);
  5.       // PWG specific : expand themeconf.inc.php variables
  6.       $code = preg_replace('/\{themeconf:([^}]+)\}/e', '$this->get_themeconf(\'$1\')', $code);
  7.       $code = preg_replace('/\{pwg_root\}/e', "get_root_url()", $code);
  8.       // replace \ with \\ and then ' with \'.
  9.       $code = str_replace('\\', '\\\\', $code);
  10.       $code = str_replace('\'', '\\\'', $code);
  11.       // change template varrefs into PHP varrefs
  12.       // This one will handle varrefs WITH namespaces
  13.       $varrefs = array();
  14.       preg_match_all('#\{(([a-z0-9\-_]+?\.)+?)([a-z0-9\-_]+?)\}#is', $code, $varrefs);
  15.       $varcount = sizeof($varrefs[1]);
  16.       for ($i = 0; $i < $varcount; $i++)
  17.       {
  18.         $namespace = $varrefs[1][$i];
  19.         $varname = $varrefs[3][$i];
  20.         $new = $this->generate_block_varref($namespace, $varname);
  21.         $code = str_replace($varrefs[0][$i], $new, $code);
  22.       }
  23.       // This will handle the remaining root-level varrefs
  24.       $code = preg_replace('#\{([a-z0-9\-_]*?)\}#is', '\' . ( ( isset($this->_tpldata[\'.\'][0][\'\1\']) ) ? $this->_tpldata[\'.\'][0][\'\1\'] : \'\' ) . \'', $code);
  25.       // Break it up into lines.
  26.       $code_lines = explode("\n", $code);
  27.       $block_nesting_level = 0;
  28.       $block_names = array();
  29.       $block_names[0] = ".";
  30.       // Second: prepend echo ', append ' . "\n"; to each line.
  31.       $line_count = sizeof($code_lines);
  32.       for ($i = 0; $i < $line_count; $i++)
  33.       {
  34.         $code_lines[$i] = chop($code_lines[$i]);
  35.         if (preg_match('#<!-- BEGIN (.*?) -->#', $code_lines[$i], $m))
  36.         {
  37.           $n[0] = $m[0];
  38.           $n[1] = $m[1];
  39.           // Added: dougk_ff7-Keeps templates from bombing if begin is on
  40.           // the same line as end.. I think. :)
  41.           if ( preg_match('#<!-- END (.*?) -->#', $code_lines[$i], $n) )
  42.           {
  43.             $block_nesting_level++;
  44.             $block_names[$block_nesting_level] = $m[1];
  45.             if ($block_nesting_level < 2)
  46.             {
  47.               // Block is not nested.
  48.               $code_lines[$i] = '$_' . $n[1] . '_count = ( isset($this->_tpldata[\'' . $n[1] . '.\']) ) ?  sizeof($this->_tpldata[\'' . $n[1] . '.\']) : 0;';
  49.               $code_lines[$i] .= "\n" . 'for ($_' . $n[1] . '_i = 0; $_' . $n[1] . '_i < $_' . $n[1] . '_count; $_' . $n[1] . '_i++)';
  50.               $code_lines[$i] .= "\n" . '{';
  51.             }
  52.             else
  53.             {
  54.               // This block is nested.
  55.               // Generate a namespace string for this block.
  56.               $namespace = implode('.', $block_names);
  57.               // strip leading period from root level..
  58.               $namespace = substr($namespace, 2);
  59.               // Get a reference to the data array for this block that depends on the
  60.               // current indices of all parent blocks.
  61.               $varref = $this->generate_block_data_ref($namespace, false);
  62.               // Create the for loop code to iterate over this block.
  63.               $code_lines[$i] = '$_' . $n[1] . '_count = ( isset(' . $varref . ') ) ? sizeof(' . $varref . ') : 0;';
  64.               $code_lines[$i] .= "\n" . 'for ($_' . $n[1] . '_i = 0; $_' . $n[1] . '_i < $_' . $n[1] . '_count; $_' . $n[1] . '_i++)';
  65.               $code_lines[$i] .= "\n" . '{';
  66.             }
  67.             // We have the end of a block.
  68.             unset($block_names[$block_nesting_level]);
  69.             $block_nesting_level--;
  70.             $code_lines[$i] .= '} // END ' . $n[1];
  71.             $m[0] = $n[0];
  72.             $m[1] = $n[1];
  73.           }
  74.           else
  75.           {
  76.             // We have the start of a block.
  77.             $block_nesting_level++;
  78.             $block_names[$block_nesting_level] = $m[1];
  79.             if ($block_nesting_level < 2)
  80.             {
  81.               // Block is not nested.
  82.               $code_lines[$i] = '$_' . $m[1] . '_count = ( isset($this->_tpldata[\'' . $m[1] . '.\']) ) ? sizeof($this->_tpldata[\'' . $m[1] . '.\']) : 0;';
  83.               $code_lines[$i] .= "\n" . 'for ($_' . $m[1] . '_i = 0; $_' . $m[1] . '_i < $_' . $m[1] . '_count; $_' . $m[1] . '_i++)';
  84.               $code_lines[$i] .= "\n" . '{';
  85.             }
  86.             else
  87.             {
  88.               // This block is nested.
  89.               // Generate a namespace string for this block.
  90.               $namespace = implode('.', $block_names);
  91.               // strip leading period from root level..
  92.               $namespace = substr($namespace, 2);
  93.               // Get a reference to the data array for this block that
  94.               // depends on the current indices of all parent blocks.
  95.               $varref = $this->generate_block_data_ref($namespace, false);
  96.               // Create the for loop code to iterate over this block.
  97.               $code_lines[$i] = '$_' . $m[1] . '_count = ( isset(' . $varref . ') ) ? sizeof(' . $varref . ') : 0;';
  98.               $code_lines[$i] .= "\n" . 'for ($_' . $m[1] . '_i = 0; $_' . $m[1] . '_i < $_' . $m[1] . '_count; $_' . $m[1] . '_i++)';
  99.               $code_lines[$i] .= "\n" . '{';
  100.             }
  101.           }
  102.         }
  103.         else if (preg_match('#<!-- END (.*?) -->#', $code_lines[$i], $m))
  104.         {
  105.           // We have the end of a block.
  106.           unset($block_names[$block_nesting_level]);
  107.           $block_nesting_level--;
  108.           $code_lines[$i] = '} // END ' . $m[1];
  109.         }
  110.         else
  111.         {
  112.           // We have an ordinary line of code.
  113.           if (!$do_not_echo)
  114.           {
  115.             $code_lines[$i] = 'echo \'' . $code_lines[$i] . '\' . "\\n";';
  116.           }
  117.           else
  118.           {
  119.             $code_lines[$i] = '$' . $retvar . '.= \'' . $code_lines[$i] . '\' . "\\n";';
  120.           }
  121.         }
  122.       }
  123.       // Bring it back into a single string of lines of code.
  124.       $code = implode("\n", $code_lines);
  125.       return $code ;
  126.     }

mood
Publicité
Posté le 02-07-2009 à 08:22:47  profilanswer
 

n°1901366
Profil sup​primé
Posté le 02-07-2009 à 08:38:03  answer
 

thurfin a écrit :

Bonjour,
j'ai voulu installer sur les pages persos de sfr phpwebgallerie afin de mettre en ligne des photos. Le problème c'est que sfr vérouille la fonction PREG_REPLACE( /e) pour de soit disantes raisons de sécurité et le site renvoie une erreur lorsque on essaye d'y accéder. Pour le moment j'ai désactiver le /e ce qui rend le site accessible mais avec un résultat dég (la fonction est dans un script gérant les templates). Il y'aurait t'il donc un moyen de contourner le problème en reprogrammant le bou de code afin de ne pas faire appel à la fonction preg_replace /e ? (voir ci dessous)
Merci d'avance.


l'option /e permet l'exécution de code PHP donc d'est un réel problème de sécurité. Et ne t'attends pas à plus de libertés avec les pages persos d'SFR hein [:petrus75]
Pour éviter çà tu as toujours la solution de boucler sur $code avec foreach, et pour chaque item de regarder s'il correspond à ta regex et si c'est le cas, lui appliquer ta fonction.

n°1901377
thurfin
la clarté dans la confusion
Posté le 02-07-2009 à 09:21:06  profilanswer
 

alors là pour moi c'est du chinois, j'y connait rien aux expressions régulières.

n°1901406
thurfin
la clarté dans la confusion
Posté le 02-07-2009 à 10:04:50  profilanswer
 

la nouvelle version de piwigo (nouveau nom du projet) semble prendre en compte ce pb, je vai svoir si y'a moyen de faire un upgrade


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  preg_replace sur page perso sfr : comment contourner le pb ?

 

Sujets relatifs
créer une pixel pageExecuter un ".vbs" à partir d'une page web
Problème intégration menu en flash dans une page HTMLGénérer une page HTML à partir de formulaire PHP
parseur php avec @implode, preg_split . Probleme pour adapter le codeouvrir une url dans une page en miniature
[Résolu sans trop savoir comment] Ma page s'affiche très bas[PHP] forcer actualisation après "page précédente" sur navigateur ?
redirection à une page lors de la reconnaissance de l'IPafficher un doc PDF ou word dans la même page HTML
Plus de sujets relatifs à : preg_replace sur page perso sfr : comment contourner le pb ?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR