preg_replace sur page perso sfr : comment contourner le pb ?

preg_replace sur page perso sfr : comment contourner le pb ? - PHP - Programmation

Marsh Posté le 02-07-2009 à 08:22:47    

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.     }

Reply

Marsh Posté le 02-07-2009 à 08:22:47   

Reply

Marsh Posté le 02-07-2009 à 08:38:03    

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.

Reply

Marsh Posté le 02-07-2009 à 09:21:06    

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

Reply

Marsh Posté le 02-07-2009 à 10:04:50    

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

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed